diff --git a/dlls/gdi32/tests/font.c b/dlls/gdi32/tests/font.c index a91adcbfec1..ef250d9c377 100644 --- a/dlls/gdi32/tests/font.c +++ b/dlls/gdi32/tests/font.c @@ -1494,6 +1494,71 @@ else ReleaseDC(0, hdc); } +static void test_negative_width(HDC hdc, const LOGFONTA *lf) +{ + HFONT hfont, hfont_prev; + DWORD ret; + GLYPHMETRICS gm1, gm2; + LOGFONTA lf2 = *lf; + WORD idx; + MAT2 mat = { {0,1}, {0,0}, {0,0}, {0,1} }; + + /* negative widths are handled just as positive ones */ + lf2.lfWidth = -lf->lfWidth; + + SetLastError(0xdeadbeef); + hfont = CreateFontIndirectA(lf); + ok(hfont != 0, "CreateFontIndirect error %u\n", GetLastError()); + check_font("original", lf, hfont); + + hfont_prev = SelectObject(hdc, hfont); + + ret = GetGlyphIndicesA(hdc, "x", 1, &idx, GGI_MARK_NONEXISTING_GLYPHS); + if (ret == GDI_ERROR || idx == 0xffff) + { + SelectObject(hdc, hfont_prev); + DeleteObject(hfont); + skip("This font doesn't contain 'x', skipping the test\n"); + return; + } + + /* filling with 0xaa causes false pass under WINEDEBUG=warn+heap */ + memset(&gm1, 0xab, sizeof(gm1)); + SetLastError(0xdeadbeef); + ret = GetGlyphOutlineA(hdc, 'x', GGO_METRICS, &gm1, 0, NULL, &mat); + ok(ret != GDI_ERROR, "GetGlyphOutline error 0x%x\n", GetLastError()); + + SelectObject(hdc, hfont_prev); + DeleteObject(hfont); + + SetLastError(0xdeadbeef); + hfont = CreateFontIndirectA(&lf2); + ok(hfont != 0, "CreateFontIndirect error %u\n", GetLastError()); + check_font("negative width", &lf2, hfont); + + hfont_prev = SelectObject(hdc, hfont); + + memset(&gm2, 0xbb, sizeof(gm2)); + SetLastError(0xdeadbeef); + ret = GetGlyphOutlineA(hdc, 'x', GGO_METRICS, &gm2, 0, NULL, &mat); + ok(ret != GDI_ERROR, "GetGlyphOutline error 0x%x\n", GetLastError()); + + SelectObject(hdc, hfont_prev); + DeleteObject(hfont); + + ok(gm1.gmBlackBoxX == gm2.gmBlackBoxX && + gm1.gmBlackBoxY == gm2.gmBlackBoxY && + gm1.gmptGlyphOrigin.x == gm2.gmptGlyphOrigin.x && + gm1.gmptGlyphOrigin.y == gm2.gmptGlyphOrigin.y && + gm1.gmCellIncX == gm2.gmCellIncX && + gm1.gmCellIncY == gm2.gmCellIncY, + "gm1=%d,%d,%d,%d,%d,%d gm2=%d,%d,%d,%d,%d,%d\n", + gm1.gmBlackBoxX, gm1.gmBlackBoxY, gm1.gmptGlyphOrigin.x, + gm1.gmptGlyphOrigin.y, gm1.gmCellIncX, gm1.gmCellIncY, + gm2.gmBlackBoxX, gm2.gmBlackBoxY, gm2.gmptGlyphOrigin.x, + gm2.gmptGlyphOrigin.y, gm2.gmCellIncX, gm2.gmCellIncY); +} + /* PANOSE is 10 bytes in size, need to pack the structure properly */ #include "pshpack2.h" typedef struct @@ -1578,47 +1643,6 @@ static void test_text_metrics(const LOGFONTA *lf) hfont_old = SelectObject(hdc, hfont); - if(lf->lfWidth > 0) { - HFONT hfont2, hfont_prev; - GLYPHMETRICS gm1, gm2; - LOGFONTA lf2 = *lf; - MAT2 mat2 = { {0,1}, {0,0}, {0,0}, {0,1} }; - - /* negative widths are handled just as positive ones */ - lf2.lfWidth *= -1; - - SetLastError(0xdeadbeef); - hfont2 = CreateFontIndirectA(&lf2); - ok(hfont2 != 0, "CreateFontIndirect error %u\n", GetLastError()); - hfont_prev = SelectObject(hdc, hfont2); - - /* filling with 0xaa causes false pass under WINEDEBUG=warn+heap */ - memset(&gm1, 0xab, sizeof(gm1)); - SetLastError(0xdeadbeef); - ret = GetGlyphOutlineA(hdc, 'x', GGO_METRICS, &gm1, 0, NULL, &mat2); - ok(ret != GDI_ERROR, "GetGlyphOutline error 0x%x\n", GetLastError()); - - SelectObject(hdc, hfont_prev); - DeleteObject(hfont2); - - memset(&gm2, 0xbb, sizeof(gm2)); - SetLastError(0xdeadbeef); - ret = GetGlyphOutlineA(hdc, 'x', GGO_METRICS, &gm2, 0, NULL, &mat2); - ok(ret != GDI_ERROR, "GetGlyphOutline error 0x%x\n", GetLastError()); - - ok(gm1.gmBlackBoxX == gm2.gmBlackBoxX && - gm1.gmBlackBoxY == gm2.gmBlackBoxY && - gm1.gmptGlyphOrigin.x == gm2.gmptGlyphOrigin.x && - gm1.gmptGlyphOrigin.y == gm2.gmptGlyphOrigin.y && - gm1.gmCellIncX == gm2.gmCellIncX && - gm1.gmCellIncY == gm2.gmCellIncY, - "gm1=%d,%d,%d,%d,%d,%d gm2=%d,%d,%d,%d,%d,%d\n", - gm1.gmBlackBoxX, gm1.gmBlackBoxY, gm1.gmptGlyphOrigin.x, - gm1.gmptGlyphOrigin.y, gm1.gmCellIncX, gm1.gmCellIncY, - gm2.gmBlackBoxX, gm2.gmBlackBoxY, gm2.gmptGlyphOrigin.x, - gm2.gmptGlyphOrigin.y, gm2.gmCellIncX, gm2.gmCellIncY); - } - size = GetFontData(hdc, MS_OS2_TAG, 0, NULL, 0); if (size == GDI_ERROR) { @@ -1711,6 +1735,8 @@ static void test_text_metrics(const LOGFONTA *lf) tmW.tmDigitizedAspectX, ret); } + test_negative_width(hdc, lf); + end_of_test: SelectObject(hdc, hfont_old); DeleteObject(hfont);