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