Module: wine Branch: master Commit: efe7a9763f22abbd181b1edd1a34e1dda14b1b38 URL: http://source.winehq.org/git/wine.git/?a=commit;h=efe7a9763f22abbd181b1edd1a...
Author: Akihiro Sagawa sagawa.aki@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; }