gdi32/tests: Add tests for GetCharWidthInfo().
Signed-off-by: Akihiro Sagawa <sagawa.aki@gmail.com> Signed-off-by: Huw Davies <huw@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
1128587fd2
commit
eca601d7bb
|
@ -48,6 +48,7 @@ static BOOL (WINAPI *pGetCharABCWidthsW)(HDC hdc, UINT first, UINT last, LPABC
|
||||||
static BOOL (WINAPI *pGetCharABCWidthsFloatW)(HDC hdc, UINT first, UINT last, LPABCFLOAT abc);
|
static BOOL (WINAPI *pGetCharABCWidthsFloatW)(HDC hdc, UINT first, UINT last, LPABCFLOAT abc);
|
||||||
static BOOL (WINAPI *pGetCharWidth32A)(HDC hdc, UINT first, UINT last, LPINT buffer);
|
static BOOL (WINAPI *pGetCharWidth32A)(HDC hdc, UINT first, UINT last, LPINT buffer);
|
||||||
static BOOL (WINAPI *pGetCharWidth32W)(HDC hdc, UINT first, UINT last, LPINT buffer);
|
static BOOL (WINAPI *pGetCharWidth32W)(HDC hdc, UINT first, UINT last, LPINT buffer);
|
||||||
|
static BOOL (WINAPI *pGetCharWidthInfo)(HDC hdc, void *);
|
||||||
static DWORD (WINAPI *pGetFontUnicodeRanges)(HDC hdc, LPGLYPHSET lpgs);
|
static DWORD (WINAPI *pGetFontUnicodeRanges)(HDC hdc, LPGLYPHSET lpgs);
|
||||||
static DWORD (WINAPI *pGetGlyphIndicesA)(HDC hdc, LPCSTR lpstr, INT count, LPWORD pgi, DWORD flags);
|
static DWORD (WINAPI *pGetGlyphIndicesA)(HDC hdc, LPCSTR lpstr, INT count, LPWORD pgi, DWORD flags);
|
||||||
static DWORD (WINAPI *pGetGlyphIndicesW)(HDC hdc, LPCWSTR lpstr, INT count, LPWORD pgi, DWORD flags);
|
static DWORD (WINAPI *pGetGlyphIndicesW)(HDC hdc, LPCWSTR lpstr, INT count, LPWORD pgi, DWORD flags);
|
||||||
|
@ -94,6 +95,7 @@ static void init(void)
|
||||||
pGetCharABCWidthsFloatW = (void *)GetProcAddress(hgdi32, "GetCharABCWidthsFloatW");
|
pGetCharABCWidthsFloatW = (void *)GetProcAddress(hgdi32, "GetCharABCWidthsFloatW");
|
||||||
pGetCharWidth32A = (void *)GetProcAddress(hgdi32, "GetCharWidth32A");
|
pGetCharWidth32A = (void *)GetProcAddress(hgdi32, "GetCharWidth32A");
|
||||||
pGetCharWidth32W = (void *)GetProcAddress(hgdi32, "GetCharWidth32W");
|
pGetCharWidth32W = (void *)GetProcAddress(hgdi32, "GetCharWidth32W");
|
||||||
|
pGetCharWidthInfo = (void *)GetProcAddress(hgdi32, "GetCharWidthInfo");
|
||||||
pGetFontUnicodeRanges = (void *)GetProcAddress(hgdi32, "GetFontUnicodeRanges");
|
pGetFontUnicodeRanges = (void *)GetProcAddress(hgdi32, "GetFontUnicodeRanges");
|
||||||
pGetGlyphIndicesA = (void *)GetProcAddress(hgdi32, "GetGlyphIndicesA");
|
pGetGlyphIndicesA = (void *)GetProcAddress(hgdi32, "GetGlyphIndicesA");
|
||||||
pGetGlyphIndicesW = (void *)GetProcAddress(hgdi32, "GetGlyphIndicesW");
|
pGetGlyphIndicesW = (void *)GetProcAddress(hgdi32, "GetGlyphIndicesW");
|
||||||
|
@ -7004,6 +7006,189 @@ static void test_long_names(void)
|
||||||
ReleaseDC(NULL, dc);
|
ReleaseDC(NULL, dc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
USHORT majorVersion;
|
||||||
|
USHORT minorVersion;
|
||||||
|
SHORT ascender;
|
||||||
|
SHORT descender;
|
||||||
|
SHORT lineGap;
|
||||||
|
USHORT advanceWidthMax;
|
||||||
|
SHORT minLeftSideBearing;
|
||||||
|
SHORT minRightSideBearing;
|
||||||
|
SHORT xMaxExtent;
|
||||||
|
SHORT caretSlopeRise;
|
||||||
|
SHORT caretSlopeRun;
|
||||||
|
SHORT caretOffset;
|
||||||
|
SHORT reserved[4];
|
||||||
|
SHORT metricDataFormat;
|
||||||
|
SHORT numberOfHMetrics;
|
||||||
|
} TT_Hori_Header;
|
||||||
|
|
||||||
|
static void test_GetCharWidthInfo(void)
|
||||||
|
{
|
||||||
|
HDC hdc;
|
||||||
|
HFONT hfont, hfont_prev;
|
||||||
|
LOGFONTA lf;
|
||||||
|
BOOL r;
|
||||||
|
DWORD ret, i;
|
||||||
|
OUTLINETEXTMETRICA otm;
|
||||||
|
TT_Hori_Header hhea;
|
||||||
|
struct char_width_info
|
||||||
|
{
|
||||||
|
INT lsb, rsb, unk;
|
||||||
|
} info, info2;
|
||||||
|
SHORT minLeftSideBearing, minRightSideBearing;
|
||||||
|
POINT pt[2];
|
||||||
|
const char* face_list[] = { "Symbol", "Ume Gothic", "MS Gothic" };
|
||||||
|
|
||||||
|
if (!pGetCharWidthInfo)
|
||||||
|
{
|
||||||
|
win_skip("GetCharWidthInfo is unavailable\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
hdc = GetDC(NULL);
|
||||||
|
|
||||||
|
/* test default (System) font */
|
||||||
|
memset(&info, 0xaa, sizeof(info));
|
||||||
|
r = pGetCharWidthInfo(hdc, &info);
|
||||||
|
if (r) /* win10 1803 succeeds */
|
||||||
|
{
|
||||||
|
ok(info.lsb == 0, "expected 0, got %d\n", info.lsb);
|
||||||
|
ok(info.rsb == 0, "expected 0, got %d\n", info.rsb);
|
||||||
|
ok(info.unk == 0, "expected 0, got %d\n", info.unk);
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(&lf, 0, sizeof(lf));
|
||||||
|
lf.lfWeight = FW_NORMAL;
|
||||||
|
lf.lfCharSet = ANSI_CHARSET;
|
||||||
|
strcpy(lf.lfFaceName, "Tahoma");
|
||||||
|
hfont = CreateFontIndirectA(&lf);
|
||||||
|
hfont_prev = SelectObject(hdc, hfont);
|
||||||
|
ok(hfont_prev != NULL, "SelectObject failed\n");
|
||||||
|
|
||||||
|
ret = GetOutlineTextMetricsA(hdc, sizeof(otm), &otm);
|
||||||
|
ok(ret != 0, "GetOutlineTextMetricsA failed\n");
|
||||||
|
DeleteObject(SelectObject(hdc, hfont_prev));
|
||||||
|
|
||||||
|
/* test Tahoma at the em square size */
|
||||||
|
lf.lfHeight = -(int)otm.otmEMSquare;
|
||||||
|
hfont = CreateFontIndirectA(&lf);
|
||||||
|
hfont_prev = SelectObject(hdc, hfont);
|
||||||
|
ok(hfont_prev != NULL, "SelectObject failed\n");
|
||||||
|
|
||||||
|
ret = GetFontData(hdc, MS_MAKE_TAG('h','h','e','a'), 0, &hhea, sizeof(hhea));
|
||||||
|
ok(ret == sizeof(hhea), "got %u\n", ret);
|
||||||
|
minLeftSideBearing = GET_BE_WORD(hhea.minLeftSideBearing);
|
||||||
|
minRightSideBearing = GET_BE_WORD(hhea.minRightSideBearing);
|
||||||
|
|
||||||
|
memset(&info, 0xaa, sizeof(info));
|
||||||
|
r = pGetCharWidthInfo(hdc, &info);
|
||||||
|
ok(r, "GetCharWidthInfo failed\n");
|
||||||
|
ok(info.lsb == minLeftSideBearing, "expected %d, got %d\n", minLeftSideBearing, info.lsb);
|
||||||
|
ok(info.rsb == minRightSideBearing, "expected %d, got %d\n", minRightSideBearing, info.rsb);
|
||||||
|
|
||||||
|
DeleteObject(SelectObject(hdc, hfont_prev));
|
||||||
|
|
||||||
|
/* these values are scaled, try with smaller size */
|
||||||
|
lf.lfHeight /= 3;
|
||||||
|
hfont = CreateFontIndirectA(&lf);
|
||||||
|
hfont_prev = SelectObject(hdc, hfont);
|
||||||
|
ok(hfont_prev != NULL, "SelectObject failed\n");
|
||||||
|
|
||||||
|
memset(&info2, 0xaa, sizeof(info2));
|
||||||
|
r = pGetCharWidthInfo(hdc, &info2);
|
||||||
|
ok(r, "pGetCharWidthInfo failed\n");
|
||||||
|
ok(info2.lsb == info.lsb/3, "expected %d, got %d\n", info.lsb/3, info2.lsb);
|
||||||
|
ok(info2.rsb == info.rsb/3, "expected %d, got %d\n", info.rsb/3, info2.rsb);
|
||||||
|
|
||||||
|
DeleteObject(SelectObject(hdc, hfont_prev));
|
||||||
|
ReleaseDC(NULL, hdc);
|
||||||
|
|
||||||
|
/* test with another mapping mode */
|
||||||
|
hdc = GetDC(NULL);
|
||||||
|
SetMapMode(hdc, MM_ISOTROPIC);
|
||||||
|
SetWindowExtEx(hdc, 2, 2, NULL);
|
||||||
|
SetViewportExtEx(hdc, 1, 1, NULL);
|
||||||
|
|
||||||
|
memset(pt, 0, sizeof(pt));
|
||||||
|
pt[0].y = otm.otmEMSquare;
|
||||||
|
DPtoLP(hdc, pt, 1);
|
||||||
|
|
||||||
|
memset(&lf, 0, sizeof(lf));
|
||||||
|
lf.lfWeight = FW_NORMAL;
|
||||||
|
lf.lfCharSet = ANSI_CHARSET;
|
||||||
|
lf.lfHeight = -abs(pt[0].y);
|
||||||
|
strcpy(lf.lfFaceName, "Tahoma");
|
||||||
|
hfont = CreateFontIndirectA(&lf);
|
||||||
|
hfont_prev = SelectObject(hdc, hfont);
|
||||||
|
ok(hfont_prev != NULL, "SelectObject failed\n");
|
||||||
|
|
||||||
|
memset(&info2, 0xaa, sizeof(info2));
|
||||||
|
r = pGetCharWidthInfo(hdc, &info2);
|
||||||
|
ok(r, "GetCharWidthInfo failed\n");
|
||||||
|
pt[0].x = info.lsb; pt[0].y = 0;
|
||||||
|
pt[1].x = info.rsb; pt[1].y = 0;
|
||||||
|
DPtoLP(hdc, pt, 2);
|
||||||
|
ok(pt[0].x == info2.lsb, "expected %d, got %d\n", pt[0].x, info2.lsb);
|
||||||
|
ok(pt[1].x == info2.rsb, "expected %d, got %d\n", pt[1].x, info2.rsb);
|
||||||
|
|
||||||
|
DeleteObject(SelectObject(hdc, hfont_prev));
|
||||||
|
ReleaseDC(NULL, hdc);
|
||||||
|
|
||||||
|
/* test with synthetic fonts */
|
||||||
|
hdc = GetDC(NULL);
|
||||||
|
for (i = 0; i < ARRAY_SIZE(face_list); i++)
|
||||||
|
{
|
||||||
|
const char* face = face_list[i];
|
||||||
|
if (!is_truetype_font_installed(face))
|
||||||
|
{
|
||||||
|
skip("%s is not installed\n", face);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
memset(&lf, 0, sizeof(lf));
|
||||||
|
lf.lfWeight = FW_NORMAL;
|
||||||
|
lf.lfItalic = FALSE;
|
||||||
|
lf.lfCharSet = DEFAULT_CHARSET;
|
||||||
|
lf.lfHeight = -256;
|
||||||
|
strcpy(lf.lfFaceName, face);
|
||||||
|
hfont = CreateFontIndirectA(&lf);
|
||||||
|
hfont_prev = SelectObject(hdc, hfont);
|
||||||
|
|
||||||
|
memset(&info, 0xaa, sizeof(info));
|
||||||
|
r = pGetCharWidthInfo(hdc, &info);
|
||||||
|
ok(r, "%s: GetCharWidthInfo failed\n", face);
|
||||||
|
|
||||||
|
/* test with synthetic bold */
|
||||||
|
lf.lfWeight = FW_BOLD;
|
||||||
|
lf.lfItalic = FALSE;
|
||||||
|
hfont = CreateFontIndirectA(&lf);
|
||||||
|
DeleteObject(SelectObject(hdc, hfont));
|
||||||
|
|
||||||
|
memset(&info2, 0xaa, sizeof(info2));
|
||||||
|
r = pGetCharWidthInfo(hdc, &info2);
|
||||||
|
ok(r, "%s: GetCharWidthInfo failed\n", face);
|
||||||
|
ok(info.lsb == info2.lsb, "%s: expected %d, got %d\n", face, info.lsb, info2.lsb);
|
||||||
|
ok(info.rsb == info2.rsb, "%s: expected %d, got %d\n", face, info.rsb, info2.rsb);
|
||||||
|
|
||||||
|
/* test with synthetic italic */
|
||||||
|
lf.lfWeight = FW_NORMAL;
|
||||||
|
lf.lfItalic = TRUE;
|
||||||
|
hfont = CreateFontIndirectA(&lf);
|
||||||
|
DeleteObject(SelectObject(hdc, hfont));
|
||||||
|
|
||||||
|
memset(&info2, 0xaa, sizeof(info2));
|
||||||
|
r = pGetCharWidthInfo(hdc, &info2);
|
||||||
|
ok(r, "%s: GetCharWidthInfo failed\n", face);
|
||||||
|
todo_wine ok(info.lsb > info2.lsb, "%s: expected less than %d, got %d\n", face, info.lsb, info2.lsb);
|
||||||
|
todo_wine ok(info.rsb > info2.rsb, "%s: expected less than %d, got %d\n", face, info.rsb, info2.rsb);
|
||||||
|
DeleteObject(SelectObject(hdc, hfont_prev));
|
||||||
|
}
|
||||||
|
|
||||||
|
ReleaseDC(NULL, hdc);
|
||||||
|
}
|
||||||
|
|
||||||
START_TEST(font)
|
START_TEST(font)
|
||||||
{
|
{
|
||||||
static const char *test_names[] =
|
static const char *test_names[] =
|
||||||
|
@ -7072,6 +7257,7 @@ START_TEST(font)
|
||||||
test_GetTextMetrics2("Arial", -55);
|
test_GetTextMetrics2("Arial", -55);
|
||||||
test_GetTextMetrics2("Arial", -110);
|
test_GetTextMetrics2("Arial", -110);
|
||||||
test_GetCharacterPlacement();
|
test_GetCharacterPlacement();
|
||||||
|
test_GetCharWidthInfo();
|
||||||
test_CreateFontIndirect();
|
test_CreateFontIndirect();
|
||||||
test_CreateFontIndirectEx();
|
test_CreateFontIndirectEx();
|
||||||
test_oemcharset();
|
test_oemcharset();
|
||||||
|
|
Loading…
Reference in New Issue