Module: wine Branch: master Commit: e5a0fa7089dfafd2e7a0fc6e5cc6856ecc3e8d9e URL: http://source.winehq.org/git/wine.git/?a=commit;h=e5a0fa7089dfafd2e7a0fc6e5c...
Author: Alexandre Julliard julliard@winehq.org Date: Fri Oct 21 11:33:04 2011 +0200
gdi32: Implement GetCharABCWidths as a standard driver entry point.
---
dlls/gdi32/font.c | 11 ++++------- dlls/gdi32/freetype.c | 28 +++++++++++++--------------- dlls/gdi32/gdi_private.h | 2 -- 3 files changed, 17 insertions(+), 24 deletions(-)
diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c index e1fc856..d12e73b 100644 --- a/dlls/gdi32/font.c +++ b/dlls/gdi32/font.c @@ -2382,8 +2382,9 @@ BOOL WINAPI GetCharABCWidthsW( HDC hdc, UINT firstChar, UINT lastChar, LPABC abc ) { DC *dc = get_dc_ptr(hdc); + PHYSDEV dev; unsigned int i; - BOOL ret = FALSE; + BOOL ret;
if (!dc) return FALSE;
@@ -2393,11 +2394,8 @@ BOOL WINAPI GetCharABCWidthsW( HDC hdc, UINT firstChar, UINT lastChar, return FALSE; }
- if(dc->gdiFont) - ret = WineEngGetCharABCWidths( dc->gdiFont, firstChar, lastChar, abc ); - else - FIXME(": stub\n"); - + dev = GET_DC_PHYSDEV( dc, pGetCharABCWidths ); + ret = dev->funcs->pGetCharABCWidths( dev, firstChar, lastChar, abc ); if (ret) { /* convert device units to logical */ @@ -2406,7 +2404,6 @@ BOOL WINAPI GetCharABCWidthsW( HDC hdc, UINT firstChar, UINT lastChar, abc->abcB = INTERNAL_XDSTOWS(dc, abc->abcB); abc->abcC = INTERNAL_XDSTOWS(dc, abc->abcC); } - ret = TRUE; }
release_dc_ptr( dc ); diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c index 6fbfd0d..00ea0ec 100644 --- a/dlls/gdi32/freetype.c +++ b/dlls/gdi32/freetype.c @@ -6348,28 +6348,33 @@ static BOOL freetype_GetCharWidth( PHYSDEV dev, UINT firstChar, UINT lastChar, L }
/************************************************************* - * WineEngGetCharABCWidths - * + * freetype_GetCharABCWidths */ -BOOL WineEngGetCharABCWidths(GdiFont *font, UINT firstChar, UINT lastChar, - LPABC buffer) +static BOOL freetype_GetCharABCWidths( PHYSDEV dev, UINT firstChar, UINT lastChar, LPABC buffer ) { static const MAT2 identity = { {0,1},{0,0},{0,0},{0,1} }; UINT c; GLYPHMETRICS gm; FT_UInt glyph_index; GdiFont *linked_font; + struct freetype_physdev *physdev = get_freetype_dev( dev );
- TRACE("%p, %d, %d, %p\n", font, firstChar, lastChar, buffer); + if (!physdev->font) + { + dev = GET_NEXT_PHYSDEV( dev, pGetCharABCWidths ); + return dev->funcs->pGetCharABCWidths( dev, firstChar, lastChar, buffer ); + } + + TRACE("%p, %d, %d, %p\n", physdev->font, firstChar, lastChar, buffer);
- if(!FT_IS_SCALABLE(font->ft_face)) + if(!FT_IS_SCALABLE(physdev->font->ft_face)) return FALSE;
GDI_CheckNotLock(); EnterCriticalSection( &freetype_cs );
for(c = firstChar; c <= lastChar; c++) { - get_glyph_index_linked(font, c, &linked_font, &glyph_index); + get_glyph_index_linked(physdev->font, c, &linked_font, &glyph_index); get_glyph_outline(linked_font, glyph_index, GGO_METRICS | GGO_GLYPH_INDEX, &gm, 0, NULL, &identity); buffer[c - firstChar].abcA = FONT_GM(linked_font,glyph_index)->lsb; @@ -7088,7 +7093,7 @@ static const struct gdi_dc_funcs freetype_funcs = NULL, /* pFrameRgn */ NULL, /* pGdiComment */ NULL, /* pGdiRealizationInfo */ - NULL, /* pGetCharABCWidths */ + freetype_GetCharABCWidths, /* pGetCharABCWidths */ NULL, /* pGetCharABCWidthsI */ freetype_GetCharWidth, /* pGetCharWidth */ NULL, /* pGetDeviceCaps */ @@ -7218,13 +7223,6 @@ UINT WineEngGetOutlineTextMetrics(GdiFont *font, UINT cbSize, return 0; }
-BOOL WineEngGetCharABCWidths(GdiFont *font, UINT firstChar, UINT lastChar, - LPABC buffer) -{ - ERR("called but we don't have FreeType\n"); - return FALSE; -} - BOOL WineEngGetCharABCWidthsFloat(GdiFont *font, UINT first, UINT last, LPABCFLOAT buffer) { ERR("called but we don't have FreeType\n"); diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h index efd3e56..413d61f 100644 --- a/dlls/gdi32/gdi_private.h +++ b/dlls/gdi32/gdi_private.h @@ -292,8 +292,6 @@ typedef struct extern INT WineEngAddFontResourceEx(LPCWSTR, DWORD, PVOID) DECLSPEC_HIDDEN; extern HANDLE WineEngAddFontMemResourceEx(PVOID, DWORD, PVOID, LPDWORD) DECLSPEC_HIDDEN; extern BOOL WineEngDestroyFontInstance(HFONT handle) 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,