usp10/tests: Added tests for wgBlank, wgDefault, wgInvalid and wgKashida.
This commit is contained in:
parent
33cefcf8ea
commit
dd2be15118
@ -1804,11 +1804,64 @@ static void test_ScriptGetCMap(HDC hdc, unsigned short pwOutGlyphs[256])
|
|||||||
ok (!psc, "psc is not null after ScriptFreeCache\n");
|
ok (!psc, "psc is not null after ScriptFreeCache\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define MAX_ENUM_FONTS 4096
|
||||||
|
|
||||||
|
struct enum_font_data
|
||||||
|
{
|
||||||
|
int total;
|
||||||
|
ENUMLOGFONT elf[MAX_ENUM_FONTS];
|
||||||
|
};
|
||||||
|
|
||||||
|
static INT CALLBACK enum_bitmap_font_proc(const LOGFONT *lf, const TEXTMETRIC *ntm, DWORD type, LPARAM lParam)
|
||||||
|
{
|
||||||
|
struct enum_font_data *efnd = (struct enum_font_data *)lParam;
|
||||||
|
|
||||||
|
if (type & (TRUETYPE_FONTTYPE | DEVICE_FONTTYPE)) return 1;
|
||||||
|
|
||||||
|
if (efnd->total < MAX_ENUM_FONTS)
|
||||||
|
{
|
||||||
|
efnd->elf[efnd->total++] = *(ENUMLOGFONT*)lf;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
trace("enum tests invalid; you have more than %d fonts\n", MAX_ENUM_FONTS);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static INT CALLBACK enum_truetype_proc(const LOGFONT *lf, const TEXTMETRIC *ntm, DWORD type, LPARAM lParam)
|
||||||
|
{
|
||||||
|
struct enum_font_data *efnd = (struct enum_font_data *)lParam;
|
||||||
|
|
||||||
|
if (!(type & (TRUETYPE_FONTTYPE | DEVICE_FONTTYPE))) return 1;
|
||||||
|
|
||||||
|
if (efnd->total < MAX_ENUM_FONTS)
|
||||||
|
{
|
||||||
|
efnd->elf[efnd->total++] = *(ENUMLOGFONT*)lf;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
trace("enum tests invalid; you have more than %d fonts\n", MAX_ENUM_FONTS);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
static void test_ScriptGetFontProperties(HDC hdc)
|
static void test_ScriptGetFontProperties(HDC hdc)
|
||||||
{
|
{
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
SCRIPT_CACHE psc,old_psc;
|
SCRIPT_CACHE psc,old_psc;
|
||||||
SCRIPT_FONTPROPERTIES sfp;
|
SCRIPT_FONTPROPERTIES sfp;
|
||||||
|
HFONT font, oldfont;
|
||||||
|
LOGFONT lf;
|
||||||
|
struct enum_font_data efnd;
|
||||||
|
TEXTMETRICA tmA;
|
||||||
|
WORD gi[3];
|
||||||
|
WCHAR str[3];
|
||||||
|
DWORD i, ret;
|
||||||
|
WORD system_lang_id = PRIMARYLANGID(GetSystemDefaultLangID());
|
||||||
|
static const WCHAR invalids[] = {0x0020, 0x200B, 0xF71B};
|
||||||
|
/* U+0020: numeric space
|
||||||
|
U+200B: zero width space
|
||||||
|
U+F71B: unkown, found by black box testing */
|
||||||
|
BOOL is_terminal, is_arial, is_times_new_roman, is_arabic = (system_lang_id == LANG_ARABIC);
|
||||||
|
|
||||||
/* Some sanity checks for ScriptGetFontProperties */
|
/* Some sanity checks for ScriptGetFontProperties */
|
||||||
|
|
||||||
@ -1866,6 +1919,109 @@ static void test_ScriptGetFontProperties(HDC hdc)
|
|||||||
ok( psc == old_psc, "Expected psc not to be changed, was %p is now %p\n", old_psc, psc);
|
ok( psc == old_psc, "Expected psc not to be changed, was %p is now %p\n", old_psc, psc);
|
||||||
ScriptFreeCache(&psc);
|
ScriptFreeCache(&psc);
|
||||||
ok( psc == NULL, "Expected psc to be NULL, got %p\n", psc);
|
ok( psc == NULL, "Expected psc to be NULL, got %p\n", psc);
|
||||||
|
|
||||||
|
pGetGlyphIndicesW = (void*)GetProcAddress(GetModuleHandleA("gdi32.dll"), "GetGlyphIndicesW");
|
||||||
|
if (!pGetGlyphIndicesW)
|
||||||
|
{
|
||||||
|
win_skip("Skip on WINNT4\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
memset(&lf, 0, sizeof(lf));
|
||||||
|
lf.lfCharSet = DEFAULT_CHARSET;
|
||||||
|
efnd.total = 0;
|
||||||
|
EnumFontFamiliesA(hdc, NULL, enum_bitmap_font_proc, (LPARAM)&efnd);
|
||||||
|
|
||||||
|
for (i = 0; i < efnd.total; i++)
|
||||||
|
{
|
||||||
|
lstrcpyA(lf.lfFaceName, (char *)efnd.elf[i].elfFullName);
|
||||||
|
font = CreateFontIndirect(&lf);
|
||||||
|
oldfont = SelectObject(hdc, font);
|
||||||
|
|
||||||
|
sfp.cBytes = sizeof(SCRIPT_FONTPROPERTIES);
|
||||||
|
psc = NULL;
|
||||||
|
hr = ScriptGetFontProperties(hdc, &psc, &sfp);
|
||||||
|
ok(hr == S_OK, "ScriptGetFontProperties expected S_OK, got %08x\n", hr);
|
||||||
|
if (winetest_interactive)
|
||||||
|
{
|
||||||
|
trace("bitmap font %s\n", lf.lfFaceName);
|
||||||
|
trace("wgBlank %04x\n", sfp.wgBlank);
|
||||||
|
trace("wgDefault %04x\n", sfp.wgDefault);
|
||||||
|
trace("wgInvalid %04x\n", sfp.wgInvalid);
|
||||||
|
trace("wgKashida %04x\n", sfp.wgKashida);
|
||||||
|
trace("iKashidaWidth %d\n", sfp.iKashidaWidth);
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = GetTextMetricsA(hdc, &tmA);
|
||||||
|
ok(ret != 0, "GetTextMetricsA failed!\n");
|
||||||
|
|
||||||
|
is_terminal = !(lstrcmpA(lf.lfFaceName, "Terminal") && lstrcmpA(lf.lfFaceName, "@Terminal"));
|
||||||
|
ok(sfp.wgBlank == tmA.tmBreakChar || broken(is_terminal) || broken(is_arabic), "bitmap font %s wgBlank %04x tmBreakChar %04x\n", lf.lfFaceName, sfp.wgBlank, tmA.tmBreakChar);
|
||||||
|
|
||||||
|
ok(sfp.wgDefault == tmA.tmDefaultChar || broken(is_arabic), "bitmap font %s wgDefault %04x, tmDefaultChar %04x\n", lf.lfFaceName, sfp.wgDefault, tmA.tmDefaultChar);
|
||||||
|
|
||||||
|
ok(sfp.wgInvalid == sfp.wgBlank || broken(is_arabic), "bitmap font %s wgInvalid %02x wgBlank %02x\n", lf.lfFaceName, sfp.wgInvalid, sfp.wgBlank);
|
||||||
|
|
||||||
|
ok(sfp.wgKashida == 0xFFFF || broken(is_arabic), "bitmap font %s wgKashida %02x\n", lf.lfFaceName, sfp.wgKashida);
|
||||||
|
|
||||||
|
ScriptFreeCache(&psc);
|
||||||
|
|
||||||
|
SelectObject(hdc, oldfont);
|
||||||
|
DeleteObject(font);
|
||||||
|
}
|
||||||
|
|
||||||
|
efnd.total = 0;
|
||||||
|
EnumFontFamiliesA(hdc, NULL, enum_truetype_proc, (LPARAM)&efnd);
|
||||||
|
|
||||||
|
for (i = 0; i < efnd.total; i++)
|
||||||
|
{
|
||||||
|
lstrcpyA(lf.lfFaceName, (char *)efnd.elf[i].elfFullName);
|
||||||
|
font = CreateFontIndirect(&lf);
|
||||||
|
oldfont = SelectObject(hdc, font);
|
||||||
|
|
||||||
|
sfp.cBytes = sizeof(SCRIPT_FONTPROPERTIES);
|
||||||
|
psc = NULL;
|
||||||
|
hr = ScriptGetFontProperties(hdc, &psc, &sfp);
|
||||||
|
ok(hr == S_OK, "ScriptGetFontProperties expected S_OK, got %08x\n", hr);
|
||||||
|
if (winetest_interactive)
|
||||||
|
{
|
||||||
|
trace("truetype font %s\n", lf.lfFaceName);
|
||||||
|
trace("wgBlank %04x\n", sfp.wgBlank);
|
||||||
|
trace("wgDefault %04x\n", sfp.wgDefault);
|
||||||
|
trace("wgInvalid %04x\n", sfp.wgInvalid);
|
||||||
|
trace("wgKashida %04x\n", sfp.wgKashida);
|
||||||
|
trace("iKashidaWidth %d\n", sfp.iKashidaWidth);
|
||||||
|
}
|
||||||
|
|
||||||
|
str[0] = 0x0020; /* U+0020: numeric space */
|
||||||
|
ret = pGetGlyphIndicesW(hdc, str, 1, gi, 0);
|
||||||
|
ok(ret != GDI_ERROR, "GetGlyphIndicesW failed!\n");
|
||||||
|
ok(sfp.wgBlank == gi[0], "truetype font %s wgBlank %04x gi[0] %04x\n", lf.lfFaceName, sfp.wgBlank, gi[0]);
|
||||||
|
|
||||||
|
ok(sfp.wgDefault == 0 || broken(is_arabic), "truetype font %s wgDefault %04x\n", lf.lfFaceName, sfp.wgDefault);
|
||||||
|
|
||||||
|
ret = pGetGlyphIndicesW(hdc, invalids, 3, gi, GGI_MARK_NONEXISTING_GLYPHS);
|
||||||
|
ok(ret != GDI_ERROR, "GetGlyphIndicesW failed!\n");
|
||||||
|
if (gi[2] != 0xFFFF) /* index of default non exist char */
|
||||||
|
ok(sfp.wgInvalid == gi[2], "truetype font %s wgInvalid %04x gi[2] %04x\n", lf.lfFaceName, sfp.wgInvalid, gi[2]);
|
||||||
|
else if (gi[1] != 0xFFFF)
|
||||||
|
ok(sfp.wgInvalid == gi[1], "truetype font %s wgInvalid %04x gi[1] %04x\n", lf.lfFaceName, sfp.wgInvalid, gi[1]);
|
||||||
|
else if (gi[0] != 0xFFFF)
|
||||||
|
ok(sfp.wgInvalid == gi[0], "truetype font %s wgInvalid %04x gi[0] %04x\n", lf.lfFaceName, sfp.wgInvalid, gi[0]);
|
||||||
|
else
|
||||||
|
ok(sfp.wgInvalid == 0, "truetype font %s wgInvalid %04x expect 0\n", lf.lfFaceName, sfp.wgInvalid);
|
||||||
|
|
||||||
|
str[0] = 0x0640; /* U+0640: kashida */
|
||||||
|
ret = pGetGlyphIndicesW(hdc, str, 1, gi, GGI_MARK_NONEXISTING_GLYPHS);
|
||||||
|
ok(ret != GDI_ERROR, "GetGlyphIndicesW failed!\n");
|
||||||
|
is_arial = !lstrcmpA(lf.lfFaceName, "Arial");
|
||||||
|
is_times_new_roman= !lstrcmpA(lf.lfFaceName, "Times New Roman");
|
||||||
|
ok(sfp.wgKashida == gi[0] || broken(is_arial || is_times_new_roman) || broken(is_arabic), "truetype font %s wgKashida %04x gi[0] %04x\n", lf.lfFaceName, sfp.wgKashida, gi[0]);
|
||||||
|
|
||||||
|
ScriptFreeCache(&psc);
|
||||||
|
|
||||||
|
SelectObject(hdc, oldfont);
|
||||||
|
DeleteObject(font);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_ScriptTextOut(HDC hdc)
|
static void test_ScriptTextOut(HDC hdc)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user