From 1d4fcc027035d11379cd462285b9ceb6b24eb803 Mon Sep 17 00:00:00 2001 From: Hans Leidekker Date: Fri, 11 Dec 2009 11:38:24 +0100 Subject: [PATCH] gdi32: Implement WineEngGetCharABCWidthsFloat and forward GetCharABCWidthsFloat to it. --- dlls/gdi32/font.c | 40 +++++++++++++++++++++++----------------- dlls/gdi32/freetype.c | 38 ++++++++++++++++++++++++++++++++++++++ dlls/gdi32/gdi_private.h | 2 ++ 3 files changed, 63 insertions(+), 17 deletions(-) diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c index 7f8f6f6d0c0..eea53fd2b2f 100644 --- a/dlls/gdi32/font.c +++ b/dlls/gdi32/font.c @@ -2908,34 +2908,40 @@ BOOL WINAPI GetCharABCWidthsFloatA( HDC hdc, UINT first, UINT last, LPABCFLOAT a * RETURNS * Success: TRUE * Failure: FALSE - * - * BUGS - * Only works with TrueType fonts. It also doesn't return real - * floats but converted integers because it's implemented on - * top of GetCharABCWidthsW. */ BOOL WINAPI GetCharABCWidthsFloatW( HDC hdc, UINT first, UINT last, LPABCFLOAT abcf ) { - ABC *abc, *abc_base; - unsigned int i, size = sizeof(ABC) * (last - first + 1); - BOOL ret; + UINT i; + BOOL ret = FALSE; + DC *dc = get_dc_ptr( hdc ); - TRACE("%p, %d, %d, %p - partial stub\n", hdc, first, last, abcf); + TRACE("%p, %d, %d, %p\n", hdc, first, last, abcf); - abc = abc_base = HeapAlloc( GetProcessHeap(), 0, size ); - if (!abc) return FALSE; + if (!dc) return FALSE; + + if (!abcf) + { + release_dc_ptr( dc ); + return FALSE; + } + + if (dc->gdiFont) + ret = WineEngGetCharABCWidthsFloat( dc->gdiFont, first, last, abcf ); + else + FIXME("stub\n"); - ret = GetCharABCWidthsW( hdc, first, last, abc ); if (ret) { - for (i = first; i <= last; i++, abc++, abcf++) + /* convert device units to logical */ + for (i = first; i <= last; i++, abcf++) { - abcf->abcfA = abc->abcA; - abcf->abcfB = abc->abcB; - abcf->abcfC = abc->abcC; + abcf->abcfA = abcf->abcfA * dc->xformVport2World.eM11; + abcf->abcfB = abcf->abcfB * dc->xformVport2World.eM11; + abcf->abcfC = abcf->abcfC * dc->xformVport2World.eM11; } } - HeapFree( GetProcessHeap(), 0, abc_base ); + + release_dc_ptr( dc ); return ret; } diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c index ed37a25db2e..a93cb60c8cf 100644 --- a/dlls/gdi32/freetype.c +++ b/dlls/gdi32/freetype.c @@ -5912,6 +5912,38 @@ BOOL WineEngGetCharABCWidths(GdiFont *font, UINT firstChar, UINT lastChar, return TRUE; } +/************************************************************* + * WineEngGetCharABCWidthsFloat + * + */ +BOOL WineEngGetCharABCWidthsFloat(GdiFont *font, UINT first, UINT last, LPABCFLOAT buffer) +{ + static const MAT2 identity = {{0,1}, {0,0}, {0,0}, {0,1}}; + UINT c; + GLYPHMETRICS gm; + FT_UInt glyph_index; + GdiFont *linked_font; + + TRACE("%p, %d, %d, %p\n", font, first, last, buffer); + + GDI_CheckNotLock(); + EnterCriticalSection( &freetype_cs ); + + for (c = first; c <= last; c++) + { + get_glyph_index_linked(font, c, &linked_font, &glyph_index); + WineEngGetGlyphOutline(linked_font, glyph_index, GGO_METRICS | GGO_GLYPH_INDEX, + &gm, 0, NULL, &identity); + buffer[c - first].abcfA = FONT_GM(linked_font, glyph_index)->lsb; + buffer[c - first].abcfB = FONT_GM(linked_font, glyph_index)->bbx; + buffer[c - first].abcfC = FONT_GM(linked_font, glyph_index)->adv - + FONT_GM(linked_font, glyph_index)->lsb - + FONT_GM(linked_font, glyph_index)->bbx; + } + LeaveCriticalSection( &freetype_cs ); + return TRUE; +} + /************************************************************* * WineEngGetCharABCWidthsI * @@ -6605,6 +6637,12 @@ BOOL WineEngGetCharABCWidths(GdiFont *font, UINT firstChar, UINT lastChar, return FALSE; } +BOOL WineEngGetCharABCWidthsFloat(GdiFont *font, UINT first, UINT last, LPABCFLOAT buffer) +{ + ERR("called but we don't have FreeType\n"); + return FALSE; +} + BOOL WineEngGetCharABCWidthsI(GdiFont *font, UINT firstChar, UINT count, LPWORD pgi, LPABC buffer) { diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h index 670ef41c6d0..d5f9112ecdc 100644 --- a/dlls/gdi32/gdi_private.h +++ b/dlls/gdi32/gdi_private.h @@ -412,6 +412,8 @@ extern BOOL WineEngDestroyFontInstance(HFONT handle) DECLSPEC_HIDDEN; extern DWORD WineEngEnumFonts(LPLOGFONTW, FONTENUMPROCW, LPARAM) DECLSPEC_HIDDEN; extern BOOL WineEngGetCharABCWidths(GdiFont *font, UINT firstChar, UINT lastChar, LPABC buffer) DECLSPEC_HIDDEN; +extern BOOL WineEngGetCharABCWidthsFloat(GdiFont *font, UINT firstChar, + UINT lastChar, LPABCFLOAT buffer) DECLSPEC_HIDDEN; extern BOOL WineEngGetCharABCWidthsI(GdiFont *font, UINT firstChar, UINT count, LPWORD pgi, LPABC buffer) DECLSPEC_HIDDEN; extern BOOL WineEngGetCharWidth(GdiFont*, UINT, UINT, LPINT) DECLSPEC_HIDDEN;