Module: wine Branch: master Commit: 8487c2dd2a959cc80c0cc23ffbc67c977efbe2e8 URL: http://source.winehq.org/git/wine.git/?a=commit;h=8487c2dd2a959cc80c0cc23ffb...
Author: Hans Leidekker hans@it.vu.nl Date: Sun Dec 2 21:06:01 2007 +0100
gdi32: Implement GetTextExtentExPointI.
---
dlls/gdi32/font.c | 46 ++++++++++++++++++++++++++++++++++++---------- dlls/gdi32/freetype.c | 27 +++++++++++++++++++-------- dlls/gdi32/gdi32.spec | 2 +- dlls/gdi32/gdi_private.h | 2 +- 4 files changed, 57 insertions(+), 20 deletions(-)
diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c index 1b80df1..1a179d5 100644 --- a/dlls/gdi32/font.c +++ b/dlls/gdi32/font.c @@ -1144,34 +1144,40 @@ BOOL WINAPI GetTextExtentPoint32W( }
/*********************************************************************** - * GetTextExtentPointI [GDI32.@] + * GetTextExtentExPointI [GDI32.@] * * Computes width and height of the array of glyph indices. * + * PARAMS + * hdc [I] Handle of device context. + * indices [I] Glyph index array. + * count [I] Number of glyphs in array. + * max_ext [I] Maximum width in glyphs. + * nfit [O] Maximum number of characters. + * dxs [O] Partial string widths. + * size [O] Returned string size. + * * RETURNS * Success: TRUE * Failure: FALSE */ -BOOL WINAPI GetTextExtentPointI( - HDC hdc, /* [in] Handle of device context */ - const WORD *indices, /* [in] Address of glyph index array */ - INT count, /* [in] Number of glyphs in array */ - LPSIZE size) /* [out] Address of structure for string size */ +BOOL WINAPI GetTextExtentExPointI( HDC hdc, const WORD *indices, INT count, INT max_ext, + LPINT nfit, LPINT dxs, LPSIZE size ) { BOOL ret = FALSE; DC * dc = DC_GetDCPtr( hdc ); if (!dc) return FALSE;
if(dc->gdiFont) { - ret = WineEngGetTextExtentPointI(dc->gdiFont, indices, count, size); - size->cx = abs(INTERNAL_XDSTOWS(dc, size->cx)); - size->cy = abs(INTERNAL_YDSTOWS(dc, size->cy)); + 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 if(dc->funcs->pGetTextExtentExPoint) { FIXME("calling GetTextExtentExPoint\n"); ret = dc->funcs->pGetTextExtentExPoint( dc->physDev, (LPCWSTR)indices, - count, 0, NULL, NULL, size ); + count, max_ext, nfit, dxs, size ); }
DC_ReleaseDCPtr( dc ); @@ -1181,6 +1187,26 @@ BOOL WINAPI GetTextExtentPointI( return ret; }
+/*********************************************************************** + * GetTextExtentPointI [GDI32.@] + * + * Computes width and height of the array of glyph indices. + * + * PARAMS + * hdc [I] Handle of device context. + * indices [I] Glyph index array. + * count [I] Number of glyphs in array. + * size [O] Returned string size. + * + * RETURNS + * Success: TRUE + * Failure: FALSE + */ +BOOL WINAPI GetTextExtentPointI( HDC hdc, const WORD *indices, INT count, LPSIZE size ) +{ + return GetTextExtentExPointI( hdc, indices, count, 0, NULL, NULL, size ); +} +
/*********************************************************************** * GetTextExtentPointA (GDI32.@) diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c index a79f41d..e9fb663 100644 --- a/dlls/gdi32/freetype.c +++ b/dlls/gdi32/freetype.c @@ -4580,17 +4580,18 @@ BOOL WineEngGetTextExtentExPoint(GdiFont *font, LPCWSTR wstr, INT count, }
/************************************************************* - * WineEngGetTextExtentPointI + * WineEngGetTextExtentExPointI * */ -BOOL WineEngGetTextExtentPointI(GdiFont *font, const WORD *indices, INT count, - LPSIZE size) +BOOL WineEngGetTextExtentExPointI(GdiFont *font, const WORD *indices, INT count, + INT max_ext, LPINT pnfit, LPINT dxs, LPSIZE size) { INT idx; + INT nfit = 0, ext; GLYPHMETRICS gm; TEXTMETRICW tm;
- TRACE("%p, %p, %d, %p\n", font, indices, count, size); + TRACE("%p, %p, %d, %d, %p\n", font, indices, count, max_ext, size);
size->cx = 0; WineEngGetTextMetrics(font, &tm); @@ -4600,9 +4601,19 @@ BOOL WineEngGetTextExtentPointI(GdiFont *font, const WORD *indices, INT count, WineEngGetGlyphOutline(font, indices[idx], GGO_METRICS | GGO_GLYPH_INDEX, &gm, 0, NULL, NULL); - size->cx += FONT_GM(font,indices[idx])->adv; + size->cx += FONT_GM(font,indices[idx])->adv; + ext = size->cx; + if (! pnfit || ext <= max_ext) { + ++nfit; + if (dxs) + dxs[idx] = ext; + } } - TRACE("return %d,%d\n", size->cx, size->cy); + + if (pnfit) + *pnfit = nfit; + + TRACE("return %d, %d, %d\n", size->cx, size->cy, nfit); return TRUE; }
@@ -5129,8 +5140,8 @@ BOOL WineEngGetTextExtentExPoint(GdiFont *font, LPCWSTR wstr, INT count, return FALSE; }
-BOOL WineEngGetTextExtentPointI(GdiFont *font, const WORD *indices, INT count, - LPSIZE size) +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; diff --git a/dlls/gdi32/gdi32.spec b/dlls/gdi32/gdi32.spec index 025dd25..c04bba7 100644 --- a/dlls/gdi32/gdi32.spec +++ b/dlls/gdi32/gdi32.spec @@ -332,7 +332,7 @@ @ stdcall GetTextCharsetInfo(long ptr long) @ stdcall GetTextColor(long) @ stdcall GetTextExtentExPointA(long str long long ptr ptr ptr) -# @ stub GetTextExtentExPointI +@ stdcall GetTextExtentExPointI(long ptr long long ptr ptr ptr) @ stdcall GetTextExtentExPointW(long wstr long long ptr ptr ptr) # @ stub GetTextExtentExPointWPri @ stdcall GetTextExtentPoint32A(long str long ptr) diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h index 3e49642..21cf577 100644 --- a/dlls/gdi32/gdi_private.h +++ b/dlls/gdi32/gdi_private.h @@ -444,7 +444,7 @@ extern BOOL WineEngGetLinkedHFont(DC *dc, WCHAR c, HFONT *new_hfont, UINT *glyph extern UINT WineEngGetOutlineTextMetrics(GdiFont*, UINT, LPOUTLINETEXTMETRICW) DECLSPEC_HIDDEN; extern UINT WineEngGetTextCharsetInfo(GdiFont *font, LPFONTSIGNATURE fs, DWORD flags) DECLSPEC_HIDDEN; extern BOOL WineEngGetTextExtentExPoint(GdiFont*, LPCWSTR, INT, INT, LPINT, LPINT, LPSIZE) DECLSPEC_HIDDEN; -extern BOOL WineEngGetTextExtentPointI(GdiFont*, const WORD *, INT, LPSIZE) 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 WineEngGetTextMetrics(GdiFont*, LPTEXTMETRICW) DECLSPEC_HIDDEN; extern BOOL WineEngFontIsLinked(GdiFont*) DECLSPEC_HIDDEN;