From patchwork Wed Mar 20 09:43:28 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gerd Hoffmann X-Patchwork-Id: 229284 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 9015C2C0091 for ; Wed, 20 Mar 2013 20:47:48 +1100 (EST) Received: from localhost ([::1]:42472 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UIFcY-0000pI-PZ for incoming@patchwork.ozlabs.org; Wed, 20 Mar 2013 05:47:46 -0400 Received: from eggs.gnu.org ([208.118.235.92]:38086) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UIFYo-00046u-16 for qemu-devel@nongnu.org; Wed, 20 Mar 2013 05:44:00 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UIFYk-0005lg-2B for qemu-devel@nongnu.org; Wed, 20 Mar 2013 05:43:53 -0400 Received: from mx1.redhat.com ([209.132.183.28]:19400) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UIFYj-0005lA-JW for qemu-devel@nongnu.org; Wed, 20 Mar 2013 05:43:49 -0400 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r2K9hmKT018850 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 20 Mar 2013 05:43:49 -0400 Received: from rincewind.home.kraxel.org (ovpn-116-26.ams2.redhat.com [10.36.116.26]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r2K9hld4029556; Wed, 20 Mar 2013 05:43:48 -0400 Received: by rincewind.home.kraxel.org (Postfix, from userid 500) id 23BB642617; Wed, 20 Mar 2013 10:43:46 +0100 (CET) From: Gerd Hoffmann To: qemu-devel@nongnu.org Date: Wed, 20 Mar 2013 10:43:28 +0100 Message-Id: <1363772625-9182-7-git-send-email-kraxel@redhat.com> In-Reply-To: <1363772625-9182-1-git-send-email-kraxel@redhat.com> References: <1363772625-9182-1-git-send-email-kraxel@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 209.132.183.28 Cc: Anthony Liguori , Gerd Hoffmann Subject: [Qemu-devel] [PATCH 06/23] console: use pixman for font rendering X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Zap homegrown font rendering code, use pixman calls instead. Signed-off-by: Gerd Hoffmann --- ui/console.c | 110 ++++++---------------------------------------------------- 1 file changed, 11 insertions(+), 99 deletions(-) diff --git a/ui/console.c b/ui/console.c index 0ec0911..4e79268 100644 --- a/ui/console.c +++ b/ui/console.c @@ -242,45 +242,6 @@ static void vga_bitblt(QemuConsole *con, #include "vgafont.h" -#define cbswap_32(__x) \ -((uint32_t)( \ - (((uint32_t)(__x) & (uint32_t)0x000000ffUL) << 24) | \ - (((uint32_t)(__x) & (uint32_t)0x0000ff00UL) << 8) | \ - (((uint32_t)(__x) & (uint32_t)0x00ff0000UL) >> 8) | \ - (((uint32_t)(__x) & (uint32_t)0xff000000UL) >> 24) )) - -#ifdef HOST_WORDS_BIGENDIAN -#define PAT(x) x -#else -#define PAT(x) cbswap_32(x) -#endif - -static const uint32_t dmask16[16] = { - PAT(0x00000000), - PAT(0x000000ff), - PAT(0x0000ff00), - PAT(0x0000ffff), - PAT(0x00ff0000), - PAT(0x00ff00ff), - PAT(0x00ffff00), - PAT(0x00ffffff), - PAT(0xff000000), - PAT(0xff0000ff), - PAT(0xff00ff00), - PAT(0xff00ffff), - PAT(0xffff0000), - PAT(0xffff00ff), - PAT(0xffffff00), - PAT(0xffffffff), -}; - -static const uint32_t dmask4[4] = { - PAT(0x00000000), - PAT(0x0000ffff), - PAT(0xffff0000), - PAT(0xffffffff), -}; - #ifndef CONFIG_CURSES enum color_names { COLOR_BLACK = 0, @@ -353,17 +314,11 @@ static void console_print_text_attributes(TextAttributes *t_attrib, char ch) static void vga_putcharxy(QemuConsole *s, int x, int y, int ch, TextAttributes *t_attrib) { + static pixman_image_t *glyphs[256]; DisplaySurface *surface = qemu_console_surface(s); - uint8_t *d; - const uint8_t *font_ptr; - unsigned int font_data, linesize, xorcol, bpp; - int i; unsigned int fgcol, bgcol; - -#ifdef DEBUG_CONSOLE - printf("x: %2i y: %2i", x, y); - console_print_text_attributes(t_attrib, ch); -#endif + pixman_image_t *ifg, *ibg; + pixman_color_t cfg, cbg; if (t_attrib->invers) { bgcol = color_table_rgb[t_attrib->bold][t_attrib->fgcol]; @@ -372,59 +327,16 @@ static void vga_putcharxy(QemuConsole *s, int x, int y, int ch, fgcol = color_table_rgb[t_attrib->bold][t_attrib->fgcol]; bgcol = color_table_rgb[t_attrib->bold][t_attrib->bgcol]; } + cfg = qemu_pixman_color(&surface->pf, fgcol); + cbg = qemu_pixman_color(&surface->pf, bgcol); + ifg = pixman_image_create_solid_fill(&cfg); + ibg = pixman_image_create_solid_fill(&cbg); - bpp = surface_bytes_per_pixel(surface); - d = surface_data(surface) + - surface_stride(surface) * y * FONT_HEIGHT + bpp * x * FONT_WIDTH; - linesize = surface_stride(surface); - font_ptr = vgafont16 + FONT_HEIGHT * ch; - xorcol = bgcol ^ fgcol; - switch (surface_bits_per_pixel(surface)) { - case 8: - for(i = 0; i < FONT_HEIGHT; i++) { - font_data = *font_ptr++; - if (t_attrib->uline - && ((i == FONT_HEIGHT - 2) || (i == FONT_HEIGHT - 3))) { - font_data = 0xFF; - } - ((uint32_t *)d)[0] = (dmask16[(font_data >> 4)] & xorcol) ^ bgcol; - ((uint32_t *)d)[1] = (dmask16[(font_data >> 0) & 0xf] & xorcol) ^ bgcol; - d += linesize; - } - break; - case 16: - case 15: - for(i = 0; i < FONT_HEIGHT; i++) { - font_data = *font_ptr++; - if (t_attrib->uline - && ((i == FONT_HEIGHT - 2) || (i == FONT_HEIGHT - 3))) { - font_data = 0xFF; - } - ((uint32_t *)d)[0] = (dmask4[(font_data >> 6)] & xorcol) ^ bgcol; - ((uint32_t *)d)[1] = (dmask4[(font_data >> 4) & 3] & xorcol) ^ bgcol; - ((uint32_t *)d)[2] = (dmask4[(font_data >> 2) & 3] & xorcol) ^ bgcol; - ((uint32_t *)d)[3] = (dmask4[(font_data >> 0) & 3] & xorcol) ^ bgcol; - d += linesize; - } - break; - case 32: - for(i = 0; i < FONT_HEIGHT; i++) { - font_data = *font_ptr++; - if (t_attrib->uline && ((i == FONT_HEIGHT - 2) || (i == FONT_HEIGHT - 3))) { - font_data = 0xFF; - } - ((uint32_t *)d)[0] = (-((font_data >> 7)) & xorcol) ^ bgcol; - ((uint32_t *)d)[1] = (-((font_data >> 6) & 1) & xorcol) ^ bgcol; - ((uint32_t *)d)[2] = (-((font_data >> 5) & 1) & xorcol) ^ bgcol; - ((uint32_t *)d)[3] = (-((font_data >> 4) & 1) & xorcol) ^ bgcol; - ((uint32_t *)d)[4] = (-((font_data >> 3) & 1) & xorcol) ^ bgcol; - ((uint32_t *)d)[5] = (-((font_data >> 2) & 1) & xorcol) ^ bgcol; - ((uint32_t *)d)[6] = (-((font_data >> 1) & 1) & xorcol) ^ bgcol; - ((uint32_t *)d)[7] = (-((font_data >> 0) & 1) & xorcol) ^ bgcol; - d += linesize; - } - break; + if (!glyphs[ch]) { + glyphs[ch] = qemu_pixman_glyph_from_vgafont(FONT_HEIGHT, vgafont16, ch); } + qemu_pixman_glyph_render(glyphs[ch], surface->image, + &cfg, &cbg, x, y, FONT_WIDTH, FONT_HEIGHT); } static void text_console_resize(QemuConsole *s)