Alexandre Julliard : gdi32: GetCharABCWidthsFloatW must succeed with non-TrueType fonts.
Alexandre Julliard
julliard at winehq.org
Mon Dec 12 12:25:54 CST 2011
Module: wine
Branch: master
Commit: 27eb63b0829d5d38ed4b0ed99d240db872620d09
URL: http://source.winehq.org/git/wine.git/?a=commit;h=27eb63b0829d5d38ed4b0ed99d240db872620d09
Author: Alexandre Julliard <julliard at winehq.org>
Date: Mon Dec 12 11:14:09 2011 +0100
gdi32: GetCharABCWidthsFloatW must succeed with non-TrueType fonts.
---
dlls/gdi32/font.c | 9 +++++++++
dlls/gdi32/freetype.c | 3 ---
dlls/gdi32/tests/font.c | 14 +++++++++++++-
3 files changed, 22 insertions(+), 4 deletions(-)
diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c
index 0d308b0..d2dfd44 100644
--- a/dlls/gdi32/font.c
+++ b/dlls/gdi32/font.c
@@ -2656,6 +2656,7 @@ BOOL WINAPI GetCharABCWidthsW( HDC hdc, UINT firstChar, UINT lastChar,
PHYSDEV dev;
unsigned int i;
BOOL ret;
+ TEXTMETRICW tm;
if (!dc) return FALSE;
@@ -2665,6 +2666,14 @@ BOOL WINAPI GetCharABCWidthsW( HDC hdc, UINT firstChar, UINT lastChar,
return FALSE;
}
+ /* unlike GetCharABCWidthsFloatW, this one is supposed to fail on non-TrueType fonts */
+ dev = GET_DC_PHYSDEV( dc, pGetTextMetrics );
+ if (!dev->funcs->pGetTextMetrics( dev, &tm ) || !(tm.tmPitchAndFamily & TMPF_TRUETYPE))
+ {
+ release_dc_ptr( dc );
+ return FALSE;
+ }
+
dev = GET_DC_PHYSDEV( dc, pGetCharABCWidths );
ret = dev->funcs->pGetCharABCWidths( dev, firstChar, lastChar, abc );
if (ret)
diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index 3a1ae99..959f4aa 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -6416,9 +6416,6 @@ static BOOL freetype_GetCharABCWidths( PHYSDEV dev, UINT firstChar, UINT lastCha
TRACE("%p, %d, %d, %p\n", physdev->font, firstChar, lastChar, buffer);
- if(!FT_IS_SCALABLE(physdev->font->ft_face))
- return FALSE;
-
GDI_CheckNotLock();
EnterCriticalSection( &freetype_cs );
diff --git a/dlls/gdi32/tests/font.c b/dlls/gdi32/tests/font.c
index 30296a5..cc34fed 100644
--- a/dlls/gdi32/tests/font.c
+++ b/dlls/gdi32/tests/font.c
@@ -41,6 +41,7 @@ static DWORD (WINAPI *pGdiGetCodePage)(HDC hdc);
static BOOL (WINAPI *pGetCharABCWidthsI)(HDC hdc, UINT first, UINT count, LPWORD glyphs, LPABC abc);
static BOOL (WINAPI *pGetCharABCWidthsA)(HDC hdc, UINT first, UINT last, LPABC abc);
static BOOL (WINAPI *pGetCharABCWidthsW)(HDC hdc, UINT first, UINT last, LPABC abc);
+static BOOL (WINAPI *pGetCharABCWidthsFloatW)(HDC hdc, UINT first, UINT last, LPABCFLOAT abc);
static DWORD (WINAPI *pGetFontUnicodeRanges)(HDC hdc, LPGLYPHSET lpgs);
static DWORD (WINAPI *pGetGlyphIndicesA)(HDC hdc, LPCSTR lpstr, INT count, LPWORD pgi, DWORD flags);
static DWORD (WINAPI *pGetGlyphIndicesW)(HDC hdc, LPCWSTR lpstr, INT count, LPWORD pgi, DWORD flags);
@@ -63,6 +64,7 @@ static void init(void)
pGetCharABCWidthsI = (void *)GetProcAddress(hgdi32, "GetCharABCWidthsI");
pGetCharABCWidthsA = (void *)GetProcAddress(hgdi32, "GetCharABCWidthsA");
pGetCharABCWidthsW = (void *)GetProcAddress(hgdi32, "GetCharABCWidthsW");
+ pGetCharABCWidthsFloatW = (void *)GetProcAddress(hgdi32, "GetCharABCWidthsFloatW");
pGetFontUnicodeRanges = (void *)GetProcAddress(hgdi32, "GetFontUnicodeRanges");
pGetGlyphIndicesA = (void *)GetProcAddress(hgdi32, "GetGlyphIndicesA");
pGetGlyphIndicesW = (void *)GetProcAddress(hgdi32, "GetGlyphIndicesW");
@@ -936,6 +938,7 @@ static void test_GetCharABCWidths(void)
LOGFONTA lf;
HFONT hfont;
ABC abc[1];
+ ABCFLOAT abcf[1];
WORD glyphs[1];
DWORD nb;
static const struct
@@ -973,7 +976,7 @@ static void test_GetCharABCWidths(void)
};
UINT i;
- if (!pGetCharABCWidthsA || !pGetCharABCWidthsW || !pGetCharABCWidthsI)
+ if (!pGetCharABCWidthsA || !pGetCharABCWidthsW || !pGetCharABCWidthsFloatW || !pGetCharABCWidthsI)
{
win_skip("GetCharABCWidthsA/W/I not available on this platform\n");
return;
@@ -1008,6 +1011,15 @@ static void test_GetCharABCWidths(void)
ret = pGetCharABCWidthsW(hdc, 'a', 'a', abc);
ok(!ret, "GetCharABCWidthsW should have failed\n");
+ ret = pGetCharABCWidthsFloatW(NULL, 'a', 'a', abcf);
+ ok(!ret, "GetCharABCWidthsFloatW should have failed\n");
+
+ ret = pGetCharABCWidthsFloatW(hdc, 'a', 'a', NULL);
+ ok(!ret, "GetCharABCWidthsFloatW should have failed\n");
+
+ ret = pGetCharABCWidthsFloatW(hdc, 'a', 'a', abcf);
+ ok(ret, "GetCharABCWidthsFloatW should have succeeded\n");
+
hfont = SelectObject(hdc, hfont);
DeleteObject(hfont);
More information about the wine-cvs
mailing list