gdi32/tests: Improve the font search method for test_EnumFontFamiliesEx_default_charset.
This commit is contained in:
parent
feaf554778
commit
efe7a9763f
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue