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);
|
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)
|
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;
|
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)
|
static void test_EnumFontFamiliesEx_default_charset(void)
|
||||||
{
|
{
|
||||||
struct enum_font_data efd;
|
struct enum_font_data efd;
|
||||||
LOGFONTA gui_font, enum_font;
|
LOGFONTA target, enum_font;
|
||||||
DWORD ret;
|
DWORD ret;
|
||||||
HDC hdc;
|
HDC hdc;
|
||||||
|
CHARSETINFO csi;
|
||||||
|
|
||||||
ret = GetObjectA(GetStockObject(DEFAULT_GUI_FONT), sizeof(gui_font), &gui_font);
|
ret = GetACP();
|
||||||
ok(ret, "GetObject failed.\n");
|
if (!TranslateCharsetInfo(ULongToPtr(ret), &csi, TCI_SRCCODEPAGE)) {
|
||||||
if (!ret)
|
skip("TranslateCharsetInfo failed for code page %d.\n", ret);
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
efd.total = 0;
|
|
||||||
|
|
||||||
hdc = GetDC(0);
|
hdc = GetDC(0);
|
||||||
memset(&enum_font, 0, sizeof(enum_font));
|
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;
|
enum_font.lfCharSet = DEFAULT_CHARSET;
|
||||||
EnumFontFamiliesExA(hdc, &enum_font, enum_font_data_proc, (LPARAM)&efd, 0);
|
EnumFontFamiliesExA(hdc, &enum_font, enum_font_data_proc, (LPARAM)&efd, 0);
|
||||||
ReleaseDC(0, hdc);
|
ReleaseDC(0, hdc);
|
||||||
|
|
||||||
if (efd.total == 0) {
|
trace("'%s' has %d charsets.\n", target.lfFaceName, efd.total);
|
||||||
skip("'%s' is not found or not a TrueType font.\n", gui_font.lfFaceName);
|
if (efd.total < 2) {
|
||||||
|
ok(0, "EnumFontFamilies is broken. Expected >= 2, got %d.\n", efd.total);
|
||||||
return;
|
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",
|
"(%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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue