Akihiro Sagawa : gdi32/tests: Improve the font search method for test_EnumFontFamiliesEx_default_charset.

Alexandre Julliard julliard at winehq.org
Wed Feb 19 14:48:16 CST 2014


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

Author: Akihiro Sagawa <sagawa.aki at gmail.com>
Date:   Wed Feb 19 21:02:02 2014 +0900

gdi32/tests: Improve the font search method for test_EnumFontFamiliesEx_default_charset.

---

 dlls/gdi32/tests/font.c |   56 +++++++++++++++++++++++++++++++++++++----------
 1 file changed, 44 insertions(+), 12 deletions(-)

diff --git a/dlls/gdi32/tests/font.c b/dlls/gdi32/tests/font.c
index 210aeb4..9e1d2d1 100644
--- a/dlls/gdi32/tests/font.c
+++ b/dlls/gdi32/tests/font.c
@@ -2945,6 +2945,27 @@ else
     ReleaseDC(0, hdc);
 }
 
+static INT CALLBACK enum_multi_charset_font_proc(const LOGFONTA *lf, const TEXTMETRICA *tm, DWORD type, LPARAM lParam)
+{
+    const NEWTEXTMETRICEXA *ntm = (const NEWTEXTMETRICEXA *)tm;
+    LOGFONTA *target = (LOGFONTA *)lParam;
+    const DWORD valid_bits = 0x003f01ff;
+    CHARSETINFO csi;
+    DWORD fs;
+
+    if (type != TRUETYPE_FONTTYPE) return TRUE;
+
+    if (TranslateCharsetInfo(ULongToPtr(target->lfCharSet), &csi, TCI_SRCCHARSET)) {
+        fs = ntm->ntmFontSig.fsCsb[0] & valid_bits;
+        if ((fs & csi.fs.fsCsb[0]) && (fs & ~csi.fs.fsCsb[0])) {
+            *target = *lf;
+            return FALSE;
+        }
+    }
+
+    return TRUE;
+}
+
 static INT CALLBACK enum_font_data_proc(const LOGFONTA *lf, const TEXTMETRICA *ntm, DWORD type, LPARAM lParam)
 {
     struct enum_font_data *efd = (struct enum_font_data *)lParam;
@@ -2976,33 +2997,44 @@ static INT CALLBACK enum_fullname_data_proc(const LOGFONTA *lf, const TEXTMETRIC
 static void test_EnumFontFamiliesEx_default_charset(void)
 {
     struct enum_font_data efd;
-    LOGFONTA gui_font, enum_font;
+    LOGFONTA target, enum_font;
     DWORD ret;
     HDC hdc;
+    CHARSETINFO csi;
 
-    ret = GetObjectA(GetStockObject(DEFAULT_GUI_FONT), sizeof(gui_font), &gui_font);
-    ok(ret, "GetObject failed.\n");
-    if (!ret)
+    ret = GetACP();
+    if (!TranslateCharsetInfo(ULongToPtr(ret), &csi, TCI_SRCCODEPAGE)) {
+        skip("TranslateCharsetInfo failed for code page %d.\n", ret);
         return;
-
-    efd.total = 0;
+    }
 
     hdc = GetDC(0);
     memset(&enum_font, 0, sizeof(enum_font));
-    strcpy(enum_font.lfFaceName, gui_font.lfFaceName);
+    enum_font.lfCharSet = csi.ciCharset;
+    target.lfFaceName[0] = '\0';
+    target.lfCharSet = csi.ciCharset;
+    EnumFontFamiliesExA(hdc, &enum_font, enum_multi_charset_font_proc, (LPARAM)&target, 0);
+    if (target.lfFaceName[0] == '\0') {
+        skip("suitable font isn't found for charset %d.\n", enum_font.lfCharSet);
+        return;
+    }
+
+    efd.total = 0;
+    memset(&enum_font, 0, sizeof(enum_font));
+    strcpy(enum_font.lfFaceName, target.lfFaceName);
     enum_font.lfCharSet = DEFAULT_CHARSET;
     EnumFontFamiliesExA(hdc, &enum_font, enum_font_data_proc, (LPARAM)&efd, 0);
     ReleaseDC(0, hdc);
 
-    if (efd.total == 0) {
-        skip("'%s' is not found or not a TrueType font.\n", gui_font.lfFaceName);
+    trace("'%s' has %d charsets.\n", target.lfFaceName, efd.total);
+    if (efd.total < 2) {
+        ok(0, "EnumFontFamilies is broken. Expected >= 2, got %d.\n", efd.total);
         return;
     }
-    trace("'%s' has %d charsets.\n", gui_font.lfFaceName, efd.total);
 
-    ok(efd.lf[0].lfCharSet == gui_font.lfCharSet || broken(system_lang_id == LANG_ARABIC),
+    ok(efd.lf[0].lfCharSet == target.lfCharSet,
        "(%s) got charset %d expected %d\n",
-       efd.lf[0].lfFaceName, efd.lf[0].lfCharSet, gui_font.lfCharSet);
+       efd.lf[0].lfFaceName, efd.lf[0].lfCharSet, target.lfCharSet);
 
     return;
 }




More information about the wine-cvs mailing list