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

This commit is contained in:
Akihiro Sagawa 2014-02-19 21:02:02 +09:00 committed by Alexandre Julliard
parent feaf554778
commit efe7a9763f
1 changed files with 44 additions and 12 deletions

View File

@ -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;
}