Module: wine Branch: master Commit: 64e2ad5709312c886e5cbff8740fce195f01561d URL: http://source.winehq.org/git/wine.git/?a=commit;h=64e2ad5709312c886e5cbff874...
Author: Huw Davies huw@codeweavers.com Date: Thu Oct 18 12:55:05 2012 +0100
gdi32: Make get_glyph_bitmap return a dib_info structure in order to avoid code duplication.
---
dlls/gdi32/dibdrv/graphics.c | 74 +++++++++++++++++------------------------- 1 files changed, 30 insertions(+), 44 deletions(-)
diff --git a/dlls/gdi32/dibdrv/graphics.c b/dlls/gdi32/dibdrv/graphics.c index 846b08e..a811a75 100644 --- a/dlls/gdi32/dibdrv/graphics.c +++ b/dlls/gdi32/dibdrv/graphics.c @@ -441,24 +441,13 @@ static inline void get_text_bkgnd_masks( dibdrv_physdev *pdev, rop_mask *mask ) }
static void draw_glyph( dibdrv_physdev *pdev, const POINT *origin, const GLYPHMETRICS *metrics, - const struct gdi_image_bits *image, DWORD text_color, + const dib_info *glyph_dib, DWORD text_color, const struct intensity_range *ranges, const struct clipped_rects *clipped_rects, RECT *bounds ) { int i; RECT rect, clipped_rect; POINT src_origin; - dib_info glyph_dib; - - glyph_dib.bit_count = 8; - glyph_dib.width = metrics->gmBlackBoxX; - glyph_dib.height = metrics->gmBlackBoxY; - glyph_dib.rect.left = 0; - glyph_dib.rect.top = 0; - glyph_dib.rect.right = metrics->gmBlackBoxX; - glyph_dib.rect.bottom = metrics->gmBlackBoxY; - glyph_dib.stride = get_dib_stride( metrics->gmBlackBoxX, 8 ); - glyph_dib.bits = *image;
rect.left = origin->x + metrics->gmptGlyphOrigin.x; rect.top = origin->y - metrics->gmptGlyphOrigin.y; @@ -473,7 +462,7 @@ static void draw_glyph( dibdrv_physdev *pdev, const POINT *origin, const GLYPHME src_origin.x = clipped_rect.left - rect.left; src_origin.y = clipped_rect.top - rect.top;
- pdev->dib.funcs->draw_glyph( &pdev->dib, &clipped_rect, &glyph_dib, &src_origin, + pdev->dib.funcs->draw_glyph( &pdev->dib, &clipped_rect, glyph_dib, &src_origin, text_color, ranges ); } } @@ -491,7 +480,7 @@ static const int padding[4] = {0, 3, 2, 1}; * using only values 0 or 16. */ static DWORD get_glyph_bitmap( HDC hdc, UINT index, UINT aa_flags, GLYPHMETRICS *metrics, - struct gdi_image_bits *image ) + dib_info *glyph_dib ) { UINT ggo_flags = aa_flags | GGO_GLYPH_INDEX; static const MAT2 identity = { {0,1}, {0,0}, {0,0}, {0,1} }; @@ -499,12 +488,12 @@ static DWORD get_glyph_bitmap( HDC hdc, UINT index, UINT aa_flags, GLYPHMETRICS int i, x, y; DWORD ret, size; BYTE *buf, *dst, *src; - int pad, stride; + int pad;
- image->ptr = NULL; - image->is_copy = FALSE; - image->free = free_heap_bits; - image->param = NULL; + glyph_dib->bits.ptr = NULL; + glyph_dib->bits.is_copy = FALSE; + glyph_dib->bits.free = free_heap_bits; + glyph_dib->bits.param = NULL;
indices[0] = index;
@@ -519,9 +508,17 @@ static DWORD get_glyph_bitmap( HDC hdc, UINT index, UINT aa_flags, GLYPHMETRICS if (!ret) return ERROR_SUCCESS; /* empty glyph */
/* We'll convert non-antialiased 1-bpp bitmaps to 8-bpp, so these sizes relate to 8-bpp */ + glyph_dib->bit_count = 8; + glyph_dib->width = metrics->gmBlackBoxX; + glyph_dib->height = metrics->gmBlackBoxY; + glyph_dib->rect.left = 0; + glyph_dib->rect.top = 0; + glyph_dib->rect.right = metrics->gmBlackBoxX; + glyph_dib->rect.bottom = metrics->gmBlackBoxY; + glyph_dib->stride = get_dib_stride( metrics->gmBlackBoxX, glyph_dib->bit_count ); + pad = padding[ metrics->gmBlackBoxX % 4 ]; - stride = get_dib_stride( metrics->gmBlackBoxX, 8 ); - size = metrics->gmBlackBoxY * stride; + size = metrics->gmBlackBoxY * glyph_dib->stride;
buf = HeapAlloc( GetProcessHeap(), 0, size ); if (!buf) return ERROR_OUTOFMEMORY; @@ -538,7 +535,7 @@ static DWORD get_glyph_bitmap( HDC hdc, UINT index, UINT aa_flags, GLYPHMETRICS for (y = metrics->gmBlackBoxY - 1; y >= 0; y--) { src = buf + y * get_dib_stride( metrics->gmBlackBoxX, 1 ); - dst = buf + y * stride; + dst = buf + y * glyph_dib->stride;
if (pad) memset( dst + metrics->gmBlackBoxX, 0, pad );
@@ -548,11 +545,11 @@ static DWORD get_glyph_bitmap( HDC hdc, UINT index, UINT aa_flags, GLYPHMETRICS } else if (pad) { - for (y = 0, dst = buf; y < metrics->gmBlackBoxY; y++, dst += stride) + for (y = 0, dst = buf; y < metrics->gmBlackBoxY; y++, dst += glyph_dib->stride) memset( dst + metrics->gmBlackBoxX, 0, pad ); }
- image->ptr = buf; + glyph_dib->bits.ptr = buf; return ERROR_SUCCESS; }
@@ -592,26 +589,15 @@ BOOL render_aa_text_bitmapinfo( HDC hdc, BITMAPINFO *info, struct gdi_image_bits for (i = 0; i < count; i++) { GLYPHMETRICS metrics; - struct gdi_image_bits image; + dib_info glyph_dib;
- err = get_glyph_bitmap( hdc, (UINT)str[i], aa_flags, &metrics, &image ); + err = get_glyph_bitmap( hdc, (UINT)str[i], aa_flags, &metrics, &glyph_dib ); if (err) continue;
- if (image.ptr) + if (glyph_dib.bits.ptr) { RECT rect, clipped_rect; POINT src_origin; - dib_info glyph_dib; - - glyph_dib.bit_count = 8; - glyph_dib.width = metrics.gmBlackBoxX; - glyph_dib.height = metrics.gmBlackBoxY; - glyph_dib.rect.left = 0; - glyph_dib.rect.top = 0; - glyph_dib.rect.right = metrics.gmBlackBoxX; - glyph_dib.rect.bottom = metrics.gmBlackBoxY; - glyph_dib.stride = get_dib_stride( metrics.gmBlackBoxX, 8 ); - glyph_dib.bits = image;
rect.left = x + metrics.gmptGlyphOrigin.x; rect.top = y - metrics.gmptGlyphOrigin.y; @@ -627,7 +613,7 @@ BOOL render_aa_text_bitmapinfo( HDC hdc, BITMAPINFO *info, struct gdi_image_bits fg_pixel, glyph_intensities ); } } - if (image.free) image.free( &image ); + free_dib_info( &glyph_dib );
if (dx) { @@ -698,15 +684,15 @@ BOOL dibdrv_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags, for (i = 0; i < count; i++) { GLYPHMETRICS metrics; - struct gdi_image_bits image; + dib_info glyph_dib;
- err = get_glyph_bitmap( dev->hdc, (UINT)str[i], aa_flags, &metrics, &image ); + err = get_glyph_bitmap( dev->hdc, (UINT)str[i], aa_flags, &metrics, &glyph_dib ); if (err) continue;
- if (image.ptr) - draw_glyph( pdev, &origin, &metrics, &image, text_color, ranges, &clipped_rects, &bounds ); + if (glyph_dib.bits.ptr) + draw_glyph( pdev, &origin, &metrics, &glyph_dib, text_color, ranges, &clipped_rects, &bounds );
- if (image.free) image.free( &image ); + free_dib_info( &glyph_dib );
if (dx) {