From 4e56b66072dd7a7edbee34e7dde7c1c2fec1198f Mon Sep 17 00:00:00 2001 From: Mark Jansen Date: Sat, 8 Apr 2017 22:25:54 +0000 Subject: [PATCH] [GDI32_APITEST] Add test for AddFontMemResourceEx. Uses PanosePitchTest.ttf from Katayama Hirofumi MZ. CORE-13046 CORE-13038 CORE-13053 svn path=/trunk/; revision=74287 --- .../apitests/gdi32/AddFontMemResourceEx.c | 191 ++++++++++++++++++ rostests/apitests/gdi32/CMakeLists.txt | 1 + rostests/apitests/gdi32/PanosePitchTest.ttf | Bin 0 -> 1848 bytes rostests/apitests/gdi32/resource.rc | 1 + rostests/apitests/gdi32/testlist.c | 2 + 5 files changed, 195 insertions(+) create mode 100644 rostests/apitests/gdi32/AddFontMemResourceEx.c create mode 100644 rostests/apitests/gdi32/PanosePitchTest.ttf diff --git a/rostests/apitests/gdi32/AddFontMemResourceEx.c b/rostests/apitests/gdi32/AddFontMemResourceEx.c new file mode 100644 index 00000000000..b249998e785 --- /dev/null +++ b/rostests/apitests/gdi32/AddFontMemResourceEx.c @@ -0,0 +1,191 @@ +/* + * PROJECT: ReactOS api tests + * LICENSE: GPL - See COPYING in the top level directory + * PURPOSE: Test for AddFontMemResourceEx + * PROGRAMMERS: Mark Jansen + * + * PanosePitchTest by Katayama Hirofumi MZ, licensed under CC BY + */ + + +#include +#include +#include + + +static void test_font_caps(HDC hdc) +{ + HGDIOBJ old; + TEXTMETRICA tm = { 0 }; + char name[64]; + BOOL ret; + HFONT font = CreateFont(0, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, DEFAULT_CHARSET, + OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, TEXT("PanosePitchTest")); + + if (font) + { + old = SelectObject(hdc, font); + + memset(&tm, 0xaa, sizeof(tm)); + ret = GetTextMetricsA(hdc, &tm); + ok_int(ret, TRUE); + + SetLastError(0xdeadbeef); + ret = GetTextFaceA(hdc, sizeof(name), name); + ok(ret, "GetTextFaceA error %lu\n", GetLastError()); + if (ret) + { + ok_str(name, "PanosePitchTest"); + } + + ok_int(tm.tmHeight, 11); + ok_int(tm.tmAscent, 11); + ok_int(tm.tmDescent, 0); + ok_int(tm.tmInternalLeading, -5); + ok_int(tm.tmExternalLeading, 1); + ok_int(tm.tmAveCharWidth, 8); + ok_int(tm.tmMaxCharWidth, 11); + ok_int(tm.tmWeight, FW_NORMAL); + ok_int(tm.tmOverhang, 0); + ok_int(tm.tmDigitizedAspectX, 96); + ok_int(tm.tmDigitizedAspectY, 96); + ok_int(tm.tmFirstChar, 63); + ok_int(tm.tmLastChar, 65); + ok_int(tm.tmDefaultChar, 165); + ok_int(tm.tmBreakChar, 65); + ok_int(tm.tmItalic, 0); + ok_int(tm.tmUnderlined, 0); + ok_int(tm.tmStruckOut, 0); + ok_hex(tm.tmPitchAndFamily, TMPF_TRUETYPE | TMPF_VECTOR); + ok_int(tm.tmCharSet, SHIFTJIS_CHARSET); + + SelectObject(hdc, old); + DeleteObject(font); + } + + font = CreateFont(0, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, DEFAULT_CHARSET, + OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, TEXT("@PanosePitchTest")); + + if (font) + { + old = SelectObject(hdc, font); + + memset(&tm, 0xaa, sizeof(tm)); + ret = GetTextMetricsA(hdc, &tm); + ok_int(ret, TRUE); + + SetLastError(0xdeadbeef); + ret = GetTextFaceA(hdc, sizeof(name), name); + ok(ret, "GetTextFaceA error %lu\n", GetLastError()); + if (ret) + { + ok_str(name, "@PanosePitchTest"); + } + + ok_int(tm.tmHeight, 11); + ok_int(tm.tmAscent, 11); + ok_int(tm.tmDescent, 0); + ok_int(tm.tmInternalLeading, -5); + ok_int(tm.tmExternalLeading, 1); + ok_int(tm.tmAveCharWidth, 8); + ok_int(tm.tmMaxCharWidth, 11); + ok_int(tm.tmWeight, FW_NORMAL); + ok_int(tm.tmOverhang, 0); + ok_int(tm.tmDigitizedAspectX, 96); + ok_int(tm.tmDigitizedAspectY, 96); + ok_int(tm.tmFirstChar, 63); + ok_int(tm.tmLastChar, 65); + ok_int(tm.tmDefaultChar, 165); + ok_int(tm.tmBreakChar, 65); + ok_int(tm.tmItalic, 0); + ok_int(tm.tmUnderlined, 0); + ok_int(tm.tmStruckOut, 0); + ok_hex(tm.tmPitchAndFamily, TMPF_TRUETYPE | TMPF_VECTOR); + ok_int(tm.tmCharSet, SHIFTJIS_CHARSET); + + SelectObject(hdc, old); + DeleteObject(font); + } +} + +/* Not working as of 2017-04-08 on ReactOS */ +static BOOL is_font_available(HDC hdc, const char* fontName) +{ + char name[64]; + BOOL ret; + + HFONT font = CreateFontA(0, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, DEFAULT_CHARSET, + OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, fontName); + HGDIOBJ old = SelectObject(hdc, font); + + + SetLastError(0xdeadbeef); + + ret = GetTextFaceA(hdc, sizeof(name), name); + ok(ret, "GetTextFaceA error %lu\n", GetLastError()); + SelectObject(hdc, old); + DeleteObject(font); + + if (ret) + { + return !_strcmpi(name, fontName); + } + return FALSE; +} + + + +START_TEST(AddFontMemResourceEx) +{ + HMODULE mod; + HRSRC hRsrc; + + HGLOBAL hTemplate; + DWORD dwSize, dwNumFonts; + LPVOID pFont; + + HANDLE hFont; + + HDC hdc = CreateCompatibleDC(NULL); + BOOL is_font_available_broken = is_font_available(hdc, "Nonexisting font name here"); + + ok(!is_font_available_broken, "Validating font is broken! (CORE-13053) !\n"); + + if (is_font_available_broken || !is_font_available(hdc, "PanosePitchTest")) + { + mod = GetModuleHandle(NULL); + hRsrc = FindResource(mod, TEXT("PanosePitchTest.ttf"), MAKEINTRESOURCE(RT_RCDATA)); + + hTemplate = LoadResource(mod, hRsrc); + dwSize = SizeofResource(mod, hRsrc); + pFont = LockResource(hTemplate); + + dwNumFonts = 0; + hFont = AddFontMemResourceEx(pFont, dwSize, NULL, &dwNumFonts); + ok_int(dwNumFonts, 2); + ok(hFont != NULL, "Expected valid handle\n"); + + if (hFont) + { + test_font_caps(hdc); + RemoveFontMemResourceEx(hFont); + if (!is_font_available_broken) + { + ok (!is_font_available(hdc, "PanosePitchTest"), "Expected font to be unregistered again\n"); + } + else + { + skip("Font unregister test\n"); + } + } + + UnlockResource(hTemplate); + FreeResource(hTemplate); + } + else + { + skip("Font PanosePitchTest already available\n"); + } + DeleteDC(hdc); +} + diff --git a/rostests/apitests/gdi32/CMakeLists.txt b/rostests/apitests/gdi32/CMakeLists.txt index 7c593ebff20..e1edb91c269 100644 --- a/rostests/apitests/gdi32/CMakeLists.txt +++ b/rostests/apitests/gdi32/CMakeLists.txt @@ -2,6 +2,7 @@ include_directories(${REACTOS_SOURCE_DIR}/win32ss) list(APPEND SOURCE + AddFontMemResourceEx.c AddFontResource.c AddFontResourceEx.c BeginPath.c diff --git a/rostests/apitests/gdi32/PanosePitchTest.ttf b/rostests/apitests/gdi32/PanosePitchTest.ttf new file mode 100644 index 0000000000000000000000000000000000000000..cfdd9c64a4f6c87b6075c028334396fba76340c7 GIT binary patch literal 1848 zcmdT_&u<$=7=5$5wp$e0jf$W`t~;a=`9b44c1zM?5TU6FO(U$t+$IY_IWd z(xzN;LE;45pqzjMf+8W3zo0@?0+9n8Dp3ifBEbm?mllaC#k?7Bf>a@-9vN%q``(-R ze$33bV+a6otir@Xp-`H6)j0775KEFxJ~Mf|fB_5x(VN7NJU4eRyZZ5k&j3*)UMM&0 z782&~#NV+$U0x0(`i$2BQ`uWp+i!I`^o;1Q#5=0>mCD(#uG7DHfcTx7V=wkhKmH?i zHUC(RMCAHkAJA7naeu85oHxG4DdI1Qch$YJjb)T*FNyDK*ymfA!g0<|5zD6CaQu?- z8t15;w(Lh|tqTV}s0_T`7J+PV6L$2*sAL9O;9xDq0&H%*#S#oCUisedLz_^(36|9>}K%d8vqJISpW>WoE}H((-$^qRoI z{Cdp7jqF-9@_l~YG^k?DRCGkq>#?ZV%&+qZZ)9`55BCn_diVEjLmg68tjr^x=R}m6)cf)$;|L=NK=;R#f49;LRp7Ht&3Y+dxnfl z{}PL|R=!*`iG1xVz&SE)Z8L}>CV75C>YF|0wN~10wHC<1@{r7CM#to|9oQ>&!|+z_1>8LP>-KI0Xc zN5H&l%-{t>kQ>l z_WzF4U2_B@IK;kn<|ug0py0Kuj?AVr@~FHk8!|^m4vnajxc80BGsQMH>FUHKFS(m6 z=AE|hdQCaXkoWF(`(^5^BB#HEy9f2e3x2ukAB7s5&HlD literal 0 HcmV?d00001 diff --git a/rostests/apitests/gdi32/resource.rc b/rostests/apitests/gdi32/resource.rc index 5b3c2dba09d..fbf571fdac5 100644 --- a/rostests/apitests/gdi32/resource.rc +++ b/rostests/apitests/gdi32/resource.rc @@ -1,3 +1,4 @@ #include "windef.h" ReactOSTestTahoma.ttf RCDATA ReactOSTestTahoma.ttf +PanosePitchTest.ttf RCDATA PanosePitchTest.ttf diff --git a/rostests/apitests/gdi32/testlist.c b/rostests/apitests/gdi32/testlist.c index 48204c0b919..db6ded95cc7 100644 --- a/rostests/apitests/gdi32/testlist.c +++ b/rostests/apitests/gdi32/testlist.c @@ -3,6 +3,7 @@ #define STANDALONE #include +extern void func_AddFontMemResourceEx(void); extern void func_AddFontResource(void); extern void func_AddFontResourceEx(void); extern void func_BeginPath(void); @@ -75,6 +76,7 @@ extern void func_SetWorldTransform(void); const struct test winetest_testlist[] = { + { "AddFontMemResourceEx", func_AddFontMemResourceEx }, { "AddFontResource", func_AddFontResource }, { "AddFontResourceEx", func_AddFontResourceEx }, { "BeginPath", func_BeginPath }, -- 2.17.1