[GDI32_APITEST] Add test for AddFontMemResourceEx. Uses PanosePitchTest.ttf from...
[reactos.git] / rostests / apitests / gdi32 / AddFontMemResourceEx.c
1 /*
2 * PROJECT: ReactOS api tests
3 * LICENSE: GPL - See COPYING in the top level directory
4 * PURPOSE: Test for AddFontMemResourceEx
5 * PROGRAMMERS: Mark Jansen
6 *
7 * PanosePitchTest by Katayama Hirofumi MZ, licensed under CC BY
8 */
9
10
11 #include <apitest.h>
12 #include <wingdi.h>
13 #include <winuser.h>
14
15
16 static void test_font_caps(HDC hdc)
17 {
18 HGDIOBJ old;
19 TEXTMETRICA tm = { 0 };
20 char name[64];
21 BOOL ret;
22 HFONT font = CreateFont(0, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, DEFAULT_CHARSET,
23 OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, TEXT("PanosePitchTest"));
24
25 if (font)
26 {
27 old = SelectObject(hdc, font);
28
29 memset(&tm, 0xaa, sizeof(tm));
30 ret = GetTextMetricsA(hdc, &tm);
31 ok_int(ret, TRUE);
32
33 SetLastError(0xdeadbeef);
34 ret = GetTextFaceA(hdc, sizeof(name), name);
35 ok(ret, "GetTextFaceA error %lu\n", GetLastError());
36 if (ret)
37 {
38 ok_str(name, "PanosePitchTest");
39 }
40
41 ok_int(tm.tmHeight, 11);
42 ok_int(tm.tmAscent, 11);
43 ok_int(tm.tmDescent, 0);
44 ok_int(tm.tmInternalLeading, -5);
45 ok_int(tm.tmExternalLeading, 1);
46 ok_int(tm.tmAveCharWidth, 8);
47 ok_int(tm.tmMaxCharWidth, 11);
48 ok_int(tm.tmWeight, FW_NORMAL);
49 ok_int(tm.tmOverhang, 0);
50 ok_int(tm.tmDigitizedAspectX, 96);
51 ok_int(tm.tmDigitizedAspectY, 96);
52 ok_int(tm.tmFirstChar, 63);
53 ok_int(tm.tmLastChar, 65);
54 ok_int(tm.tmDefaultChar, 165);
55 ok_int(tm.tmBreakChar, 65);
56 ok_int(tm.tmItalic, 0);
57 ok_int(tm.tmUnderlined, 0);
58 ok_int(tm.tmStruckOut, 0);
59 ok_hex(tm.tmPitchAndFamily, TMPF_TRUETYPE | TMPF_VECTOR);
60 ok_int(tm.tmCharSet, SHIFTJIS_CHARSET);
61
62 SelectObject(hdc, old);
63 DeleteObject(font);
64 }
65
66 font = CreateFont(0, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, DEFAULT_CHARSET,
67 OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, TEXT("@PanosePitchTest"));
68
69 if (font)
70 {
71 old = SelectObject(hdc, font);
72
73 memset(&tm, 0xaa, sizeof(tm));
74 ret = GetTextMetricsA(hdc, &tm);
75 ok_int(ret, TRUE);
76
77 SetLastError(0xdeadbeef);
78 ret = GetTextFaceA(hdc, sizeof(name), name);
79 ok(ret, "GetTextFaceA error %lu\n", GetLastError());
80 if (ret)
81 {
82 ok_str(name, "@PanosePitchTest");
83 }
84
85 ok_int(tm.tmHeight, 11);
86 ok_int(tm.tmAscent, 11);
87 ok_int(tm.tmDescent, 0);
88 ok_int(tm.tmInternalLeading, -5);
89 ok_int(tm.tmExternalLeading, 1);
90 ok_int(tm.tmAveCharWidth, 8);
91 ok_int(tm.tmMaxCharWidth, 11);
92 ok_int(tm.tmWeight, FW_NORMAL);
93 ok_int(tm.tmOverhang, 0);
94 ok_int(tm.tmDigitizedAspectX, 96);
95 ok_int(tm.tmDigitizedAspectY, 96);
96 ok_int(tm.tmFirstChar, 63);
97 ok_int(tm.tmLastChar, 65);
98 ok_int(tm.tmDefaultChar, 165);
99 ok_int(tm.tmBreakChar, 65);
100 ok_int(tm.tmItalic, 0);
101 ok_int(tm.tmUnderlined, 0);
102 ok_int(tm.tmStruckOut, 0);
103 ok_hex(tm.tmPitchAndFamily, TMPF_TRUETYPE | TMPF_VECTOR);
104 ok_int(tm.tmCharSet, SHIFTJIS_CHARSET);
105
106 SelectObject(hdc, old);
107 DeleteObject(font);
108 }
109 }
110
111 /* Not working as of 2017-04-08 on ReactOS */
112 static BOOL is_font_available(HDC hdc, const char* fontName)
113 {
114 char name[64];
115 BOOL ret;
116
117 HFONT font = CreateFontA(0, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, DEFAULT_CHARSET,
118 OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, fontName);
119 HGDIOBJ old = SelectObject(hdc, font);
120
121
122 SetLastError(0xdeadbeef);
123
124 ret = GetTextFaceA(hdc, sizeof(name), name);
125 ok(ret, "GetTextFaceA error %lu\n", GetLastError());
126 SelectObject(hdc, old);
127 DeleteObject(font);
128
129 if (ret)
130 {
131 return !_strcmpi(name, fontName);
132 }
133 return FALSE;
134 }
135
136
137
138 START_TEST(AddFontMemResourceEx)
139 {
140 HMODULE mod;
141 HRSRC hRsrc;
142
143 HGLOBAL hTemplate;
144 DWORD dwSize, dwNumFonts;
145 LPVOID pFont;
146
147 HANDLE hFont;
148
149 HDC hdc = CreateCompatibleDC(NULL);
150 BOOL is_font_available_broken = is_font_available(hdc, "Nonexisting font name here");
151
152 ok(!is_font_available_broken, "Validating font is broken! (CORE-13053) !\n");
153
154 if (is_font_available_broken || !is_font_available(hdc, "PanosePitchTest"))
155 {
156 mod = GetModuleHandle(NULL);
157 hRsrc = FindResource(mod, TEXT("PanosePitchTest.ttf"), MAKEINTRESOURCE(RT_RCDATA));
158
159 hTemplate = LoadResource(mod, hRsrc);
160 dwSize = SizeofResource(mod, hRsrc);
161 pFont = LockResource(hTemplate);
162
163 dwNumFonts = 0;
164 hFont = AddFontMemResourceEx(pFont, dwSize, NULL, &dwNumFonts);
165 ok_int(dwNumFonts, 2);
166 ok(hFont != NULL, "Expected valid handle\n");
167
168 if (hFont)
169 {
170 test_font_caps(hdc);
171 RemoveFontMemResourceEx(hFont);
172 if (!is_font_available_broken)
173 {
174 ok (!is_font_available(hdc, "PanosePitchTest"), "Expected font to be unregistered again\n");
175 }
176 else
177 {
178 skip("Font unregister test\n");
179 }
180 }
181
182 UnlockResource(hTemplate);
183 FreeResource(hTemplate);
184 }
185 else
186 {
187 skip("Font PanosePitchTest already available\n");
188 }
189 DeleteDC(hdc);
190 }
191