Hans Leidekker : gdi32: GetCharABCWidthsI does not require a scalable font.
Alexandre Julliard
julliard at winehq.org
Mon Dec 10 08:54:25 CST 2007
Module: wine
Branch: master
Commit: 0dc765809c602cf62a87e28451e4eea81eeca0cb
URL: http://source.winehq.org/git/wine.git/?a=commit;h=0dc765809c602cf62a87e28451e4eea81eeca0cb
Author: Hans Leidekker <hans at it.vu.nl>
Date: Sat Dec 8 22:55:01 2007 +0100
gdi32: GetCharABCWidthsI does not require a scalable font.
---
dlls/gdi32/font.c | 12 +++++++++++
dlls/gdi32/freetype.c | 2 +-
dlls/gdi32/tests/font.c | 51 +++++++++++++++++++++++++++++++++++++++++++---
3 files changed, 60 insertions(+), 5 deletions(-)
diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c
index 9fba58e..645ac19 100644
--- a/dlls/gdi32/font.c
+++ b/dlls/gdi32/font.c
@@ -2510,6 +2510,12 @@ BOOL WINAPI GetCharABCWidthsW( HDC hdc, UINT firstChar, UINT lastChar,
if (!dc) return FALSE;
+ if (!abc)
+ {
+ DC_ReleaseDCPtr( dc );
+ return FALSE;
+ }
+
if(dc->gdiFont)
ret = WineEngGetCharABCWidths( dc->gdiFont, firstChar, lastChar, abc );
else
@@ -2559,6 +2565,12 @@ BOOL WINAPI GetCharABCWidthsI( HDC hdc, UINT firstChar, UINT count,
if (!dc) return FALSE;
+ if (!abc)
+ {
+ DC_ReleaseDCPtr( dc );
+ return FALSE;
+ }
+
if(dc->gdiFont)
ret = WineEngGetCharABCWidthsI( dc->gdiFont, firstChar, count, pgi, abc );
else
diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index e9fb663..b6a9344 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -4512,7 +4512,7 @@ BOOL WineEngGetCharABCWidthsI(GdiFont *font, UINT firstChar, UINT count, LPWORD
FT_UInt glyph_index;
GdiFont *linked_font;
- if(!FT_IS_SCALABLE(font->ft_face))
+ if(!FT_HAS_HORIZONTAL(font->ft_face))
return FALSE;
get_glyph_index_linked(font, 'a', &linked_font, &glyph_index);
diff --git a/dlls/gdi32/tests/font.c b/dlls/gdi32/tests/font.c
index 66d97b7..0893b87 100644
--- a/dlls/gdi32/tests/font.c
+++ b/dlls/gdi32/tests/font.c
@@ -33,6 +33,7 @@
#define expect(expected, got) ok(got == expected, "Expected %.8x, got %.8x\n", expected, got)
LONG (WINAPI *pGdiGetCharDimensions)(HDC hdc, LPTEXTMETRICW lptm, LONG *height);
+BOOL (WINAPI *pGetCharABCWidthsI)(HDC hdc, UINT first, UINT count, LPWORD glyphs, LPABC abc);
BOOL (WINAPI *pGetCharABCWidthsW)(HDC hdc, UINT first, UINT last, LPABC abc);
DWORD (WINAPI *pGetFontUnicodeRanges)(HDC hdc, LPGLYPHSET lpgs);
DWORD (WINAPI *pGetGlyphIndicesA)(HDC hdc, LPCSTR lpstr, INT count, LPWORD pgi, DWORD flags);
@@ -45,6 +46,7 @@ static void init(void)
hgdi32 = GetModuleHandleA("gdi32.dll");
pGdiGetCharDimensions = (void *)GetProcAddress(hgdi32, "GdiGetCharDimensions");
+ pGetCharABCWidthsI = (void *)GetProcAddress(hgdi32, "GetCharABCWidthsI");
pGetCharABCWidthsW = (void *)GetProcAddress(hgdi32, "GetCharABCWidthsW");
pGetFontUnicodeRanges = (void *)GetProcAddress(hgdi32, "GetFontUnicodeRanges");
pGetGlyphIndicesA = (void *)GetProcAddress(hgdi32, "GetGlyphIndicesA");
@@ -450,14 +452,55 @@ static void test_GdiGetCharDimensions(void)
DeleteDC(hdc);
}
-static void test_GetCharABCWidthsW(void)
+static void test_GetCharABCWidths(void)
{
+ static const WCHAR str[] = {'a',0};
BOOL ret;
+ HDC hdc;
+ LOGFONTA lf;
+ HFONT hfont;
ABC abc[1];
- if (!pGetCharABCWidthsW) return;
+ WORD glyphs[1];
+ DWORD nb;
+
+ if (!pGetCharABCWidthsW || !pGetCharABCWidthsI)
+ {
+ skip("GetCharABCWidthsW/I not available on this platform\n");
+ return;
+ }
+
+ memset(&lf, 0, sizeof(lf));
+ strcpy(lf.lfFaceName, "System");
+ lf.lfHeight = 20;
+
+ hfont = CreateFontIndirectA(&lf);
+ hdc = GetDC(0);
+ hfont = SelectObject(hdc, hfont);
+
+ nb = pGetGlyphIndicesW(hdc, str, 1, glyphs, 0);
+ ok(nb == 1, "pGetGlyphIndicesW should have returned 1\n");
+
+ ret = pGetCharABCWidthsI(NULL, 0, 1, glyphs, abc);
+ ok(!ret, "GetCharABCWidthsI should have failed\n");
+
+ ret = pGetCharABCWidthsI(hdc, 0, 1, glyphs, NULL);
+ ok(!ret, "GetCharABCWidthsI should have failed\n");
+
+ ret = pGetCharABCWidthsI(hdc, 0, 1, glyphs, abc);
+ ok(ret, "GetCharABCWidthsI should have succeeded\n");
ret = pGetCharABCWidthsW(NULL, 'a', 'a', abc);
- ok(!ret, "GetCharABCWidthsW should have returned FALSE\n");
+ ok(!ret, "GetCharABCWidthsW should have failed\n");
+
+ ret = pGetCharABCWidthsW(hdc, 'a', 'a', NULL);
+ ok(!ret, "GetCharABCWidthsW should have failed\n");
+
+ ret = pGetCharABCWidthsW(hdc, 'a', 'a', abc);
+ ok(!ret, "GetCharABCWidthsW should have failed\n");
+
+ hfont = SelectObject(hdc, hfont);
+ DeleteObject(hfont);
+ ReleaseDC(NULL, hdc);
}
static void test_text_extents(void)
@@ -1702,7 +1745,7 @@ START_TEST(font)
test_bitmap_font();
test_bitmap_font_metrics();
test_GdiGetCharDimensions();
- test_GetCharABCWidthsW();
+ test_GetCharABCWidths();
test_text_extents();
test_GetGlyphIndices();
test_GetKerningPairs();
More information about the wine-cvs
mailing list