Dmitry Timoshkov : gdi32: Add a test for GetKerningPairs.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Sep 26 15:04:45 CDT 2006
Module: wine
Branch: master
Commit: a41da1223def0336008d44595e356ece02068130
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=a41da1223def0336008d44595e356ece02068130
Author: Dmitry Timoshkov <dmitry at codeweavers.com>
Date: Thu Sep 21 16:10:53 2006 +0900
gdi32: Add a test for GetKerningPairs.
---
dlls/gdi/tests/font.c | 134 +++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 134 insertions(+), 0 deletions(-)
diff --git a/dlls/gdi/tests/font.c b/dlls/gdi/tests/font.c
index dd9ca11..2965c3e 100644
--- a/dlls/gdi/tests/font.c
+++ b/dlls/gdi/tests/font.c
@@ -428,6 +428,17 @@ static void test_text_extents(void)
GetTextExtentPointA(hdc, "o", 1, &sz);
ok(sz.cy == tm.tmHeight, "cy %ld tmHeight %ld\n", sz.cy, tm.tmHeight);
+ SetLastError(0xdeadbeef);
+ GetTextExtentExPointW(hdc, wt, 1, 1, &fit1, &fit2, &sz1);
+ if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
+ {
+ trace("Skipping remainder of text extents test on a Win9x platform\n");
+ SelectObject(hdc, hfont);
+ DeleteObject(hfont);
+ ReleaseDC(0, hdc);
+ return;
+ }
+
len = lstrlenW(wt);
extents = HeapAlloc(GetProcessHeap(), 0, len * sizeof extents[0]);
memset(extents, 0, len * sizeof extents[0]);
@@ -511,6 +522,128 @@ static void test_GetGlyphIndices()
textm.tmDefaultChar, glyphs[4]);
}
+static void test_GetKerningPairs(void)
+{
+ static const struct kerning_data
+ {
+ const char face_name[LF_FACESIZE];
+ LONG height;
+ /* small subset of kerning pairs to test */
+ DWORD total_kern_pairs;
+ const KERNINGPAIR kern_pair[20];
+ } kd[] =
+ {
+ {"Arial", -34, 20,
+ {
+ {' ','A',-2},{' ','T',-1},{' ','Y',-1},{'1','1',-3},
+ {'A',' ',-2},{'A','T',-3},{'A','V',-3},{'A','W',-1},
+ {'A','Y',-3},{'A','v',-1},{'A','w',-1},{'A','y',-1},
+ {'F',',',-4},{'F','.',-4},{'F','A',-2},{'L',' ',-1},
+ {'L','T',-3},{'L','V',-3},{'L','W',-3},{'L','Y',-3}
+ }
+ },
+ { "Arial", 120, 20,
+ {
+ {' ','A',-6},{' ','T',-2},{' ','Y',-2},{'1','1',-8},
+ {'A',' ',-6},{'A','T',-8},{'A','V',-8},{'A','W',-4},
+ {'A','Y',-8},{'A','v',-2},{'A','w',-2},{'A','y',-2},
+ {'F',',',-12},{'F','.',-12},{'F','A',-6},{'L',' ',-4},
+ {'L','T',-8},{'L','V',-8},{'L','W',-8},{'L','Y',-8}
+ }
+ }
+ };
+ LOGFONT lf;
+ HFONT hfont, hfont_old;
+ KERNINGPAIR *kern_pair;
+ HDC hdc;
+ DWORD total_kern_pairs, ret, i, n, matches;
+
+ hdc = GetDC(0);
+
+ /* GetKerningPairsA maps unicode set of kerning pairs to current code page
+ * which may render this test unusable, so we're trying to avoid that.
+ */
+ SetLastError(0xdeadbeef);
+ GetKerningPairsW(hdc, 0, NULL);
+ if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
+ {
+ trace("Skipping the GetKerningPairs test on a Win9x platform\n");
+ ReleaseDC(0, hdc);
+ return;
+ }
+
+ for (i = 0; i < sizeof(kd)/sizeof(kd[0]); i++)
+ {
+ if (!is_font_installed(kd[i].face_name))
+ {
+ trace("%s is not installed so skipping this test\n", kd[i].face_name);
+ continue;
+ }
+
+ memset(&lf, 0, sizeof(lf));
+ strcpy(lf.lfFaceName, kd[i].face_name);
+ lf.lfHeight = kd[i].height;
+ hfont = CreateFontIndirect(&lf);
+ assert(hfont != 0);
+
+ hfont_old = SelectObject(hdc, hfont);
+
+ total_kern_pairs = GetKerningPairsW(hdc, 0, NULL);
+ trace("font %s, height %ld, total_kern_pairs %lu\n",
+ kd[i].face_name, kd[i].height, total_kern_pairs);
+ kern_pair = HeapAlloc(GetProcessHeap(), 0, total_kern_pairs * sizeof(*kern_pair));
+
+#if 0 /* Win98 (GetKerningPairsA) and XP behave differently here, the test passes on XP */
+ SetLastError(0xdeadbeef);
+ ret = GetKerningPairsW(hdc, 0, kern_pair);
+ ok(GetLastError() == ERROR_INVALID_PARAMETER,
+ "got error %ld, expected ERROR_INVALID_PARAMETER\n", GetLastError());
+ ok(ret == 0, "got %lu, expected 0\n", ret);
+#endif
+
+ ret = GetKerningPairsW(hdc, 100, NULL);
+ ok(ret == total_kern_pairs, "got %lu, expected %lu\n", ret, total_kern_pairs);
+
+ ret = GetKerningPairsW(hdc, total_kern_pairs/2, kern_pair);
+ ok(ret == total_kern_pairs/2, "got %lu, expected %lu\n", ret, total_kern_pairs/2);
+
+ ret = GetKerningPairsW(hdc, total_kern_pairs, kern_pair);
+ ok(ret == total_kern_pairs, "got %lu, expected %lu\n", ret, total_kern_pairs);
+
+ matches = 0;
+
+ for (n = 0; n < ret; n++)
+ {
+ DWORD j;
+#if 0
+ if (kern_pair[n].wFirst < 127 && kern_pair[n].wSecond < 127)
+ trace("wFirst '%c', wSecond '%c', iKernAmount %d\n",
+ kern_pair[n].wFirst, kern_pair[n].wSecond, kern_pair[n].iKernAmount);
+#endif
+ for (j = 0; j < kd[i].total_kern_pairs; j++)
+ {
+ if (kern_pair[n].wFirst == kd[i].kern_pair[j].wFirst &&
+ kern_pair[n].wSecond == kd[i].kern_pair[j].wSecond &&
+ kern_pair[n].iKernAmount == kd[i].kern_pair[j].iKernAmount)
+ {
+ /*trace("match\n");*/
+ matches++;
+ }
+ }
+ }
+
+ ok(matches == kd[i].total_kern_pairs, "got matches %lu, expected %lu\n",
+ matches, kd[i].total_kern_pairs);
+
+ HeapFree(GetProcessHeap(), 0, kern_pair);
+
+ SelectObject(hdc, hfont_old);
+ DeleteObject(hfont);
+ }
+
+ ReleaseDC(0, hdc);
+}
+
START_TEST(font)
{
test_logfont();
@@ -520,4 +653,5 @@ START_TEST(font)
test_GetCharABCWidthsW();
test_text_extents();
test_GetGlyphIndices();
+ test_GetKerningPairs();
}
More information about the wine-cvs
mailing list