Dmitry Timoshkov : gdi32: Move negative lfWidth test into a separate body, skip the test if there is no 'x' in the font.
Alexandre Julliard
julliard at winehq.org
Mon Apr 7 14:46:48 CDT 2008
Module: wine
Branch: master
Commit: 0fdd381f26b6c03008235b4481e9561f7c6a99da
URL: http://source.winehq.org/git/wine.git/?a=commit;h=0fdd381f26b6c03008235b4481e9561f7c6a99da
Author: Dmitry Timoshkov <dmitry at codeweavers.com>
Date: Mon Apr 7 21:24:47 2008 +0900
gdi32: Move negative lfWidth test into a separate body, skip the test if there is no 'x' in the font.
---
dlls/gdi32/tests/font.c | 108 +++++++++++++++++++++++++++++------------------
1 files changed, 67 insertions(+), 41 deletions(-)
diff --git a/dlls/gdi32/tests/font.c b/dlls/gdi32/tests/font.c
index a91adcb..ef250d9 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);
More information about the wine-cvs
mailing list