Module: wine Branch: master Commit: a2de6a8766e1b28288f18983741ffd35d502fcdf URL: http://source.winehq.org/git/wine.git/?a=commit;h=a2de6a8766e1b28288f1898374...
Author: Alexandre Julliard julliard@winehq.org Date: Thu Oct 20 17:03:17 2011 +0200
gdi32: Implement GetTextExtentExPointI as a standard driver entry point.
---
dlls/gdi32/font.c | 22 +++++++--------------- dlls/gdi32/freetype.c | 31 +++++++++++++++---------------- dlls/gdi32/gdi_private.h | 1 - 3 files changed, 22 insertions(+), 32 deletions(-)
diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c index 38ad477..98529db 100644 --- a/dlls/gdi32/font.c +++ b/dlls/gdi32/font.c @@ -945,7 +945,8 @@ BOOL WINAPI GetTextExtentPoint32W( BOOL WINAPI GetTextExtentExPointI( HDC hdc, const WORD *indices, INT count, INT max_ext, LPINT nfit, LPINT dxs, LPSIZE size ) { - BOOL ret = FALSE; + PHYSDEV dev; + BOOL ret; DC *dc;
if (count < 0) return FALSE; @@ -953,20 +954,11 @@ BOOL WINAPI GetTextExtentExPointI( HDC hdc, const WORD *indices, INT count, INT dc = get_dc_ptr( hdc ); if (!dc) return FALSE;
- if(dc->gdiFont) - { - ret = WineEngGetTextExtentExPointI(dc->gdiFont, indices, count, max_ext, nfit, dxs, size); - size->cx = abs(INTERNAL_XDSTOWS(dc, size->cx)); - size->cy = abs(INTERNAL_YDSTOWS(dc, size->cy)); - size->cx += count * dc->charExtra; - } - else - { - PHYSDEV physdev = GET_DC_PHYSDEV( dc, pGetTextExtentExPoint ); - FIXME("calling GetTextExtentExPoint\n"); - ret = physdev->funcs->pGetTextExtentExPoint( physdev, indices, count, max_ext, nfit, dxs, size ); - } - + dev = GET_DC_PHYSDEV( dc, pGetTextExtentExPointI ); + ret = dev->funcs->pGetTextExtentExPointI( dev, indices, count, max_ext, nfit, dxs, size ); + size->cx = abs(INTERNAL_XDSTOWS(dc, size->cx)); + size->cy = abs(INTERNAL_YDSTOWS(dc, size->cy)); + size->cx += count * dc->charExtra; release_dc_ptr( dc );
TRACE("(%p %p %d %p): returning %d x %d\n", diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c index 31f52b8..7ca7262 100644 --- a/dlls/gdi32/freetype.c +++ b/dlls/gdi32/freetype.c @@ -6501,30 +6501,36 @@ static BOOL freetype_GetTextExtentExPoint( PHYSDEV dev, LPCWSTR wstr, INT count, }
/************************************************************* - * WineEngGetTextExtentExPointI - * + * freetype_GetTextExtentExPointI */ -BOOL WineEngGetTextExtentExPointI(GdiFont *font, const WORD *indices, INT count, - INT max_ext, LPINT pnfit, LPINT dxs, LPSIZE size) +static BOOL freetype_GetTextExtentExPointI( PHYSDEV dev, const WORD *indices, INT count, + INT max_ext, LPINT pnfit, LPINT dxs, LPSIZE size ) { static const MAT2 identity = { {0,1},{0,0},{0,0},{0,1} }; INT idx; INT nfit = 0, ext; GLYPHMETRICS gm; TEXTMETRICW tm; + struct freetype_physdev *physdev = get_freetype_dev( dev ); + + if (!physdev->font) + { + dev = GET_NEXT_PHYSDEV( dev, pGetTextExtentExPointI ); + return dev->funcs->pGetTextExtentExPointI( dev, indices, count, max_ext, pnfit, dxs, size ); + }
- TRACE("%p, %p, %d, %d, %p\n", font, indices, count, max_ext, size); + TRACE("%p, %p, %d, %d, %p\n", physdev->font, indices, count, max_ext, size);
GDI_CheckNotLock(); EnterCriticalSection( &freetype_cs );
size->cx = 0; - get_text_metrics(font, &tm); + get_text_metrics(physdev->font, &tm); size->cy = tm.tmHeight;
for(idx = 0; idx < count; idx++) { - get_glyph_outline(font, indices[idx], GGO_METRICS | GGO_GLYPH_INDEX, &gm, 0, NULL, &identity); - size->cx += FONT_GM(font,indices[idx])->adv; + get_glyph_outline(physdev->font, indices[idx], GGO_METRICS | GGO_GLYPH_INDEX, &gm, 0, NULL, &identity); + size->cx += FONT_GM(physdev->font,indices[idx])->adv; ext = size->cx; if (! pnfit || ext <= max_ext) { ++nfit; @@ -7131,7 +7137,7 @@ static const struct gdi_dc_funcs freetype_funcs = NULL, /* pGetSystemPaletteEntries */ freetype_GetTextCharsetInfo, /* pGetTextCharsetInfo */ freetype_GetTextExtentExPoint, /* pGetTextExtentExPoint */ - NULL, /* pGetTextExtentExPointI */ + freetype_GetTextExtentExPointI, /* pGetTextExtentExPointI */ NULL, /* pGetTextFace */ freetype_GetTextMetrics, /* pGetTextMetrics */ NULL, /* pIntersectClipRect */ @@ -7221,13 +7227,6 @@ BOOL WineEngDestroyFontInstance(HFONT hfont) return FALSE; }
-BOOL WineEngGetTextExtentExPointI(GdiFont *font, const WORD *indices, INT count, - INT max_ext, LPINT nfit, LPINT dx, LPSIZE size) -{ - ERR("called but we don't have FreeType\n"); - return FALSE; -} - DWORD WineEngGetFontData(GdiFont *font, DWORD table, DWORD offset, LPVOID buf, DWORD cbData) { diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h index 365d158..ee7aacf 100644 --- a/dlls/gdi32/gdi_private.h +++ b/dlls/gdi32/gdi_private.h @@ -294,7 +294,6 @@ extern HANDLE WineEngAddFontMemResourceEx(PVOID, DWORD, PVOID, LPDWORD) DECLSPEC extern BOOL WineEngDestroyFontInstance(HFONT handle) DECLSPEC_HIDDEN; extern DWORD WineEngGetFontData(GdiFont*, DWORD, DWORD, LPVOID, DWORD) DECLSPEC_HIDDEN; extern BOOL WineEngGetLinkedHFont(DC *dc, WCHAR c, HFONT *new_hfont, UINT *glyph) DECLSPEC_HIDDEN; -extern BOOL WineEngGetTextExtentExPointI(GdiFont*, const WORD *, INT, INT, LPINT, LPINT, LPSIZE) DECLSPEC_HIDDEN; extern INT WineEngGetTextFace(GdiFont*, INT, LPWSTR) DECLSPEC_HIDDEN; extern BOOL WineEngFontIsLinked(GdiFont*) DECLSPEC_HIDDEN; extern BOOL WineEngInit(void) DECLSPEC_HIDDEN;