From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:38003) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UIFYj-00042q-WC for qemu-devel@nongnu.org; Wed, 20 Mar 2013 05:43:53 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UIFYi-0005kA-AQ for qemu-devel@nongnu.org; Wed, 20 Mar 2013 05:43:49 -0400 Received: from mx1.redhat.com ([209.132.183.28]:62864) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UIFYi-0005jv-0p for qemu-devel@nongnu.org; Wed, 20 Mar 2013 05:43:48 -0400 From: Gerd Hoffmann Date: Wed, 20 Mar 2013 10:43:26 +0100 Message-Id: <1363772625-9182-5-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> Subject: [Qemu-devel] [PATCH 04/23] pixman: render vgafont glyphs into pixman images List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Anthony Liguori , Gerd Hoffmann Add helper functions to create pixman mask images for glyphs and to render these glyphs into a pixman image. Signed-off-by: Gerd Hoffmann --- include/ui/qemu-pixman.h | 7 +++++++ ui/qemu-pixman.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/include/ui/qemu-pixman.h b/include/ui/qemu-pixman.h index b0f09b5..f012ec5 100644 --- a/include/ui/qemu-pixman.h +++ b/include/ui/qemu-pixman.h @@ -44,5 +44,12 @@ pixman_image_t *qemu_pixman_mirror_create(pixman_format_code_t format, void qemu_pixman_image_unref(pixman_image_t *image); pixman_color_t qemu_pixman_color(PixelFormat *pf, uint32_t color); +pixman_image_t *qemu_pixman_glyph_from_vgafont(int height, const uint8_t *font, + unsigned int ch); +void qemu_pixman_glyph_render(pixman_image_t *glyph, + pixman_image_t *surface, + pixman_color_t *fgcol, + pixman_color_t *bgcol, + int x, int y, int cw, int ch); #endif /* QEMU_PIXMAN_H */ diff --git a/ui/qemu-pixman.c b/ui/qemu-pixman.c index be551e0..254bd8c 100644 --- a/ui/qemu-pixman.c +++ b/ui/qemu-pixman.c @@ -90,3 +90,46 @@ pixman_color_t qemu_pixman_color(PixelFormat *pf, uint32_t color) c.alpha = ((color & pf->amask) >> pf->ashift) << (16 - pf->abits); return c; } + +pixman_image_t *qemu_pixman_glyph_from_vgafont(int height, const uint8_t *font, + unsigned int ch) +{ + pixman_image_t *glyph; + uint8_t *data; + bool bit; + int x, y; + + glyph = pixman_image_create_bits(PIXMAN_a8, 8, height, + NULL, 0); + data = (uint8_t *)pixman_image_get_data(glyph); + + font += height * ch; + for (y = 0; y < height; y++, font++) { + for (x = 0; x < 8; x++, data++) { + bit = (*font) & (1 << (7-x)); + *data = bit ? 0xff : 0x00; + } + } + return glyph; +} + +void qemu_pixman_glyph_render(pixman_image_t *glyph, + pixman_image_t *surface, + pixman_color_t *fgcol, + pixman_color_t *bgcol, + int x, int y, int cw, int ch) +{ + pixman_image_t *ifg = pixman_image_create_solid_fill(fgcol); + pixman_image_t *ibg = pixman_image_create_solid_fill(bgcol); + + pixman_image_composite(PIXMAN_OP_SRC, ibg, NULL, surface, + 0, 0, 0, 0, + cw * x, ch * y, + cw, ch); + pixman_image_composite(PIXMAN_OP_OVER, ifg, glyph, surface, + 0, 0, 0, 0, + cw * x, ch * y, + cw, ch); + pixman_image_unref(ifg); + pixman_image_unref(ibg); +} -- 1.7.9.7