Huw Davies : gdi32: Let the WINE_GGO_GRAY16_BITMAP case load a bitmap.
Alexandre Julliard
julliard at winehq.org
Wed Oct 3 06:08:15 CDT 2007
Module: wine
Branch: master
Commit: 05bb6f6ce4619921407e1f1e82a0e8d9cf9fb5c9
URL: http://source.winehq.org/git/wine.git/?a=commit;h=05bb6f6ce4619921407e1f1e82a0e8d9cf9fb5c9
Author: Huw Davies <huw at codeweavers.com>
Date: Tue Oct 2 14:24:34 2007 +0100
gdi32: Let the WINE_GGO_GRAY16_BITMAP case load a bitmap.
---
dlls/gdi32/freetype.c | 81 +++++++++++++++++++++++++++++++------------------
1 files changed, 51 insertions(+), 30 deletions(-)
diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index b45c6c4..62563e8 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -3533,7 +3533,7 @@ DWORD WineEngGetGlyphOutline(GdiFont *incoming_font, UINT glyph, UINT format,
if (!font->gm[glyph_index / GM_BLOCK_SIZE])
font->gm[glyph_index / GM_BLOCK_SIZE] = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY, sizeof(GM) * GM_BLOCK_SIZE);
- if(font->orientation || (format != GGO_METRICS && format != GGO_BITMAP) || font->aveWidth || lpmat)
+ if(font->orientation || (format != GGO_METRICS && format != GGO_BITMAP && format != WINE_GGO_GRAY16_BITMAP) || font->aveWidth || lpmat)
load_flags |= FT_LOAD_NO_BITMAP;
err = pFT_Load_Glyph(ft_face, glyph_index, load_flags);
@@ -3650,7 +3650,7 @@ DWORD WineEngGetGlyphOutline(GdiFont *incoming_font, UINT glyph, UINT format,
lpgm->gmptGlyphOrigin.x = left >> 6;
lpgm->gmptGlyphOrigin.y = top >> 6;
- if(format == GGO_METRICS || format == GGO_BITMAP)
+ if(format == GGO_METRICS || format == GGO_BITMAP || format == WINE_GGO_GRAY16_BITMAP)
{
FONT_GM(font,glyph_index)->gm = *lpgm;
FONT_GM(font,glyph_index)->adv = adv;
@@ -3662,7 +3662,7 @@ DWORD WineEngGetGlyphOutline(GdiFont *incoming_font, UINT glyph, UINT format,
if(format == GGO_METRICS)
return 1; /* FIXME */
- if(ft_face->glyph->format != ft_glyph_format_outline && format != GGO_BITMAP) {
+ if(ft_face->glyph->format != ft_glyph_format_outline && format != GGO_BITMAP && format != WINE_GGO_GRAY16_BITMAP) {
TRACE("loaded a bitmap\n");
return GDI_ERROR;
}
@@ -3728,34 +3728,55 @@ DWORD WineEngGetGlyphOutline(GdiFont *incoming_font, UINT glyph, UINT format,
needed = pitch * height;
if(!buf || !buflen) break;
- ft_bitmap.width = width;
- ft_bitmap.rows = height;
- ft_bitmap.pitch = pitch;
- ft_bitmap.pixel_mode = ft_pixel_mode_grays;
- ft_bitmap.buffer = buf;
-
- if(needsTransform) {
- pFT_Outline_Transform(&ft_face->glyph->outline, &transMat);
- }
-
- pFT_Outline_Translate(&ft_face->glyph->outline, -left, -bottom );
-
- memset(ft_bitmap.buffer, 0, buflen);
-
- pFT_Outline_Get_Bitmap(library, &ft_face->glyph->outline, &ft_bitmap);
- if(format == GGO_GRAY2_BITMAP)
- mult = 4;
- else if(format == GGO_GRAY4_BITMAP)
- mult = 16;
- else if(format == GGO_GRAY8_BITMAP)
- mult = 64;
- else if(format == WINE_GGO_GRAY16_BITMAP)
- break;
- else {
- assert(0);
- break;
- }
+ switch(ft_face->glyph->format) {
+ case ft_glyph_format_bitmap:
+ {
+ BYTE *src = ft_face->glyph->bitmap.buffer, *dst = buf;
+ INT h = ft_face->glyph->bitmap.rows;
+ INT x;
+ while(h--) {
+ for(x = 0; x < pitch; x++)
+ dst[x] = (src[x / 8] & (1 << ( (7 - (x % 8))))) ? 0xff : 0;
+ src += ft_face->glyph->bitmap.pitch;
+ dst += pitch;
+ }
+ return needed;
+ }
+ case ft_glyph_format_outline:
+ {
+ ft_bitmap.width = width;
+ ft_bitmap.rows = height;
+ ft_bitmap.pitch = pitch;
+ ft_bitmap.pixel_mode = ft_pixel_mode_grays;
+ ft_bitmap.buffer = buf;
+
+ if(needsTransform)
+ pFT_Outline_Transform(&ft_face->glyph->outline, &transMat);
+
+ pFT_Outline_Translate(&ft_face->glyph->outline, -left, -bottom );
+
+ memset(ft_bitmap.buffer, 0, buflen);
+
+ pFT_Outline_Get_Bitmap(library, &ft_face->glyph->outline, &ft_bitmap);
+
+ if(format == GGO_GRAY2_BITMAP)
+ mult = 4;
+ else if(format == GGO_GRAY4_BITMAP)
+ mult = 16;
+ else if(format == GGO_GRAY8_BITMAP)
+ mult = 64;
+ else if(format == WINE_GGO_GRAY16_BITMAP)
+ return needed;
+ else {
+ assert(0);
+ break;
+ }
+ }
+ default:
+ FIXME("loaded glyph format %x\n", ft_face->glyph->format);
+ return GDI_ERROR;
+ }
start = buf;
for(row = 0; row < height; row++) {
More information about the wine-cvs
mailing list