Qian Hong : usp10/tests: Added tests for wgBlank, wgDefault, wgInvalid and wgKashida.

Alexandre Julliard julliard at winehq.org
Wed Nov 21 14:45:16 CST 2012


Module: wine
Branch: master
Commit: dd2be15118fa368c18ee9fe300f91c1ba8f9ab3c
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=dd2be15118fa368c18ee9fe300f91c1ba8f9ab3c

Author: Qian Hong <fracting at gmail.com>
Date:   Wed Nov 21 18:14:30 2012 +0800

usp10/tests: Added tests for wgBlank, wgDefault, wgInvalid and wgKashida.

---

 dlls/usp10/tests/usp10.c |  156 ++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 156 insertions(+), 0 deletions(-)

diff --git a/dlls/usp10/tests/usp10.c b/dlls/usp10/tests/usp10.c
index ff757ee..d6786cd 100644
--- a/dlls/usp10/tests/usp10.c
+++ b/dlls/usp10/tests/usp10.c
@@ -1804,11 +1804,64 @@ static void test_ScriptGetCMap(HDC hdc, unsigned short pwOutGlyphs[256])
     ok (!psc, "psc is not null after ScriptFreeCache\n");
 }
 
+#define MAX_ENUM_FONTS 4096
+
+struct enum_font_data
+{
+    int total;
+    ENUMLOGFONT elf[MAX_ENUM_FONTS];
+};
+
+static INT CALLBACK enum_bitmap_font_proc(const LOGFONT *lf, const TEXTMETRIC *ntm, DWORD type, LPARAM lParam)
+{
+    struct enum_font_data *efnd = (struct enum_font_data *)lParam;
+
+    if (type & (TRUETYPE_FONTTYPE | DEVICE_FONTTYPE)) return 1;
+
+    if (efnd->total < MAX_ENUM_FONTS)
+    {
+        efnd->elf[efnd->total++] = *(ENUMLOGFONT*)lf;
+    }
+    else
+        trace("enum tests invalid; you have more than %d fonts\n", MAX_ENUM_FONTS);
+
+    return 1;
+}
+
+static INT CALLBACK enum_truetype_proc(const LOGFONT *lf, const TEXTMETRIC *ntm, DWORD type, LPARAM lParam)
+{
+    struct enum_font_data *efnd = (struct enum_font_data *)lParam;
+
+    if (!(type & (TRUETYPE_FONTTYPE | DEVICE_FONTTYPE))) return 1;
+
+    if (efnd->total < MAX_ENUM_FONTS)
+    {
+        efnd->elf[efnd->total++] = *(ENUMLOGFONT*)lf;
+    }
+    else
+        trace("enum tests invalid; you have more than %d fonts\n", MAX_ENUM_FONTS);
+
+    return 1;
+}
+
 static void test_ScriptGetFontProperties(HDC hdc)
 {
     HRESULT         hr;
     SCRIPT_CACHE    psc,old_psc;
     SCRIPT_FONTPROPERTIES sfp;
+    HFONT font, oldfont;
+    LOGFONT lf;
+    struct enum_font_data efnd;
+    TEXTMETRICA tmA;
+    WORD gi[3];
+    WCHAR str[3];
+    DWORD  i, ret;
+    WORD system_lang_id = PRIMARYLANGID(GetSystemDefaultLangID());
+    static const WCHAR invalids[] = {0x0020, 0x200B, 0xF71B};
+    /* U+0020: numeric space
+       U+200B: zero width space
+       U+F71B: unkown, found by black box testing */
+    BOOL is_terminal, is_arial, is_times_new_roman, is_arabic = (system_lang_id == LANG_ARABIC);
 
     /* Some sanity checks for ScriptGetFontProperties */
 
@@ -1866,6 +1919,109 @@ static void test_ScriptGetFontProperties(HDC hdc)
     ok( psc == old_psc, "Expected psc not to be changed, was %p is now %p\n", old_psc, psc);
     ScriptFreeCache(&psc);
     ok( psc == NULL, "Expected psc to be NULL, got %p\n", psc);
+
+    pGetGlyphIndicesW = (void*)GetProcAddress(GetModuleHandleA("gdi32.dll"), "GetGlyphIndicesW");
+    if (!pGetGlyphIndicesW)
+    {
+        win_skip("Skip on WINNT4\n");
+        return;
+    }
+    memset(&lf, 0, sizeof(lf));
+    lf.lfCharSet = DEFAULT_CHARSET;
+    efnd.total = 0;
+    EnumFontFamiliesA(hdc, NULL, enum_bitmap_font_proc, (LPARAM)&efnd);
+
+    for (i = 0; i < efnd.total; i++)
+    {
+        lstrcpyA(lf.lfFaceName, (char *)efnd.elf[i].elfFullName);
+        font = CreateFontIndirect(&lf);
+        oldfont = SelectObject(hdc, font);
+
+        sfp.cBytes = sizeof(SCRIPT_FONTPROPERTIES);
+        psc = NULL;
+        hr = ScriptGetFontProperties(hdc, &psc, &sfp);
+        ok(hr == S_OK, "ScriptGetFontProperties expected S_OK, got %08x\n", hr);
+        if (winetest_interactive)
+        {
+            trace("bitmap font %s\n", lf.lfFaceName);
+            trace("wgBlank %04x\n", sfp.wgBlank);
+            trace("wgDefault %04x\n", sfp.wgDefault);
+            trace("wgInvalid %04x\n", sfp.wgInvalid);
+            trace("wgKashida %04x\n", sfp.wgKashida);
+            trace("iKashidaWidth %d\n", sfp.iKashidaWidth);
+        }
+
+        ret = GetTextMetricsA(hdc, &tmA);
+        ok(ret != 0, "GetTextMetricsA failed!\n");
+
+        is_terminal = !(lstrcmpA(lf.lfFaceName, "Terminal") && lstrcmpA(lf.lfFaceName, "@Terminal"));
+        ok(sfp.wgBlank == tmA.tmBreakChar || broken(is_terminal) || broken(is_arabic), "bitmap font %s wgBlank %04x tmBreakChar %04x\n", lf.lfFaceName, sfp.wgBlank, tmA.tmBreakChar);
+
+        ok(sfp.wgDefault == tmA.tmDefaultChar || broken(is_arabic), "bitmap font %s wgDefault %04x, tmDefaultChar %04x\n", lf.lfFaceName, sfp.wgDefault, tmA.tmDefaultChar);
+
+        ok(sfp.wgInvalid == sfp.wgBlank || broken(is_arabic), "bitmap font %s wgInvalid %02x wgBlank %02x\n", lf.lfFaceName, sfp.wgInvalid, sfp.wgBlank);
+
+        ok(sfp.wgKashida == 0xFFFF || broken(is_arabic), "bitmap font %s wgKashida %02x\n", lf.lfFaceName, sfp.wgKashida);
+
+        ScriptFreeCache(&psc);
+
+        SelectObject(hdc, oldfont);
+        DeleteObject(font);
+    }
+
+    efnd.total = 0;
+    EnumFontFamiliesA(hdc, NULL, enum_truetype_proc, (LPARAM)&efnd);
+
+    for (i = 0; i < efnd.total; i++)
+    {
+        lstrcpyA(lf.lfFaceName, (char *)efnd.elf[i].elfFullName);
+        font = CreateFontIndirect(&lf);
+        oldfont = SelectObject(hdc, font);
+
+        sfp.cBytes = sizeof(SCRIPT_FONTPROPERTIES);
+        psc = NULL;
+        hr = ScriptGetFontProperties(hdc, &psc, &sfp);
+        ok(hr == S_OK, "ScriptGetFontProperties expected S_OK, got %08x\n", hr);
+        if (winetest_interactive)
+        {
+            trace("truetype font %s\n", lf.lfFaceName);
+            trace("wgBlank %04x\n", sfp.wgBlank);
+            trace("wgDefault %04x\n", sfp.wgDefault);
+            trace("wgInvalid %04x\n", sfp.wgInvalid);
+            trace("wgKashida %04x\n", sfp.wgKashida);
+            trace("iKashidaWidth %d\n", sfp.iKashidaWidth);
+        }
+
+        str[0] = 0x0020; /* U+0020: numeric space */
+        ret = pGetGlyphIndicesW(hdc, str, 1, gi, 0);
+        ok(ret != GDI_ERROR, "GetGlyphIndicesW failed!\n");
+        ok(sfp.wgBlank == gi[0], "truetype font %s wgBlank %04x gi[0] %04x\n", lf.lfFaceName, sfp.wgBlank, gi[0]);
+
+        ok(sfp.wgDefault == 0 || broken(is_arabic), "truetype font %s wgDefault %04x\n", lf.lfFaceName, sfp.wgDefault);
+
+        ret = pGetGlyphIndicesW(hdc, invalids, 3, gi, GGI_MARK_NONEXISTING_GLYPHS);
+        ok(ret != GDI_ERROR, "GetGlyphIndicesW failed!\n");
+        if (gi[2] != 0xFFFF) /* index of default non exist char */
+            ok(sfp.wgInvalid == gi[2], "truetype font %s wgInvalid %04x gi[2] %04x\n", lf.lfFaceName, sfp.wgInvalid, gi[2]);
+        else if (gi[1] != 0xFFFF)
+            ok(sfp.wgInvalid == gi[1], "truetype font %s wgInvalid %04x gi[1] %04x\n", lf.lfFaceName, sfp.wgInvalid, gi[1]);
+        else if (gi[0] != 0xFFFF)
+            ok(sfp.wgInvalid == gi[0], "truetype font %s wgInvalid %04x gi[0] %04x\n", lf.lfFaceName, sfp.wgInvalid, gi[0]);
+        else
+            ok(sfp.wgInvalid == 0, "truetype font %s wgInvalid %04x expect 0\n", lf.lfFaceName, sfp.wgInvalid);
+
+        str[0] = 0x0640; /* U+0640: kashida */
+        ret = pGetGlyphIndicesW(hdc, str, 1, gi, GGI_MARK_NONEXISTING_GLYPHS);
+        ok(ret != GDI_ERROR, "GetGlyphIndicesW failed!\n");
+        is_arial = !lstrcmpA(lf.lfFaceName, "Arial");
+        is_times_new_roman= !lstrcmpA(lf.lfFaceName, "Times New Roman");
+        ok(sfp.wgKashida == gi[0] || broken(is_arial || is_times_new_roman) || broken(is_arabic), "truetype font %s wgKashida %04x gi[0] %04x\n", lf.lfFaceName, sfp.wgKashida, gi[0]);
+
+        ScriptFreeCache(&psc);
+
+        SelectObject(hdc, oldfont);
+        DeleteObject(font);
+    }
 }
 
 static void test_ScriptTextOut(HDC hdc)




More information about the wine-cvs mailing list