[GDI32_APITEST] Add tests for font creation. Patch by Katayama Hirofumi MZ. CORE...
[reactos.git] / rostests / apitests / gdi32 / CreateFontIndirect.c
1 /*
2 * PROJECT: ReactOS api tests
3 * LICENSE: GPL - See COPYING in the top level directory
4 * PURPOSE: Test for CreateFontIndirect
5 * PROGRAMMERS: Timo Kreuzer
6 * Katayama Hirofumi MZ
7 */
8
9 #include <apitest.h>
10 #include <wingdi.h>
11
12 #define trace_if(val, msg) do { if (!(val)) trace(msg); } while (0)
13
14 void
15 Test_CreateFontIndirectA(void)
16 {
17 LOGFONTA logfont;
18 HFONT hFont;
19 ULONG ret;
20 ENUMLOGFONTEXDVW elfedv2;
21
22 logfont.lfHeight = 12;
23 logfont.lfWidth = 0;
24 logfont.lfEscapement = 0;
25 logfont.lfOrientation = 0;
26 logfont.lfWeight = FW_NORMAL;
27 logfont.lfItalic = 0;
28 logfont.lfUnderline = 0;
29 logfont.lfStrikeOut = 0;
30 logfont.lfCharSet = DEFAULT_CHARSET;
31 logfont.lfOutPrecision = OUT_DEFAULT_PRECIS;
32 logfont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
33 logfont.lfQuality = PROOF_QUALITY;
34 logfont.lfPitchAndFamily = DEFAULT_PITCH;
35 memset(logfont.lfFaceName, 'A', LF_FACESIZE);
36 hFont = CreateFontIndirectA(&logfont);
37 ok(hFont != 0, "CreateFontIndirectA failed\n");
38
39 memset(&elfedv2, 0, sizeof(elfedv2));
40 ret = GetObjectW(hFont, sizeof(elfedv2), &elfedv2);
41 ok(ret == sizeof(ENUMLOGFONTEXW) + 2*sizeof(DWORD), "ret = %ld\n", ret);
42 ok(elfedv2.elfEnumLogfontEx.elfLogFont.lfFaceName[LF_FACESIZE-1] == 0, "\n");
43 ok(elfedv2.elfEnumLogfontEx.elfFullName[0] == 0, "\n");
44 }
45
46 void
47 Test_CreateFontIndirectW(void)
48 {
49 LOGFONTW logfont;
50 HFONT hFont;
51 ULONG ret;
52 ENUMLOGFONTEXDVW elfedv2;
53
54 logfont.lfHeight = 12;
55 logfont.lfWidth = 0;
56 logfont.lfEscapement = 0;
57 logfont.lfOrientation = 0;
58 logfont.lfWeight = FW_NORMAL;
59 logfont.lfItalic = 0;
60 logfont.lfUnderline = 0;
61 logfont.lfStrikeOut = 0;
62 logfont.lfCharSet = DEFAULT_CHARSET;
63 logfont.lfOutPrecision = OUT_DEFAULT_PRECIS;
64 logfont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
65 logfont.lfQuality = PROOF_QUALITY;
66 logfont.lfPitchAndFamily = DEFAULT_PITCH;
67 memset(logfont.lfFaceName, 'A', LF_FACESIZE * 2);
68 hFont = CreateFontIndirectW(&logfont);
69 ok(hFont != 0, "CreateFontIndirectW failed\n");
70
71 memset(&elfedv2, 0, sizeof(elfedv2));
72 ret = GetObjectW(hFont, sizeof(elfedv2), &elfedv2);
73 ok(ret == sizeof(ENUMLOGFONTEXW) + 2*sizeof(DWORD), "\n");
74 ok(elfedv2.elfEnumLogfontEx.elfLogFont.lfFaceName[LF_FACESIZE-1] == ((WCHAR)'A' << 8) + 'A', "\n");
75 ok(elfedv2.elfEnumLogfontEx.elfFullName[0] == 0, "\n");
76 /* Theres a bunch of data in elfFullName ... */
77 }
78
79 void
80 Test_CreateFontIndirectExA(void)
81 {
82 ENUMLOGFONTEXDVA elfedva, elfedva2;
83 ENUMLOGFONTEXDVW elfedvw;
84 ENUMLOGFONTEXA *penumlfa;
85 LOGFONTA *plogfonta;
86 HFONT hFont;
87 ULONG ret;
88
89 memset(&elfedva, 0, sizeof(elfedva));
90 penumlfa = &elfedva.elfEnumLogfontEx;
91 plogfonta = &elfedva.elfEnumLogfontEx.elfLogFont;
92
93 plogfonta->lfHeight = 12;
94 plogfonta->lfWidth = 0;
95 plogfonta->lfEscapement = 0;
96 plogfonta->lfOrientation = 0;
97 plogfonta->lfWeight = FW_NORMAL;
98 plogfonta->lfItalic = 0;
99 plogfonta->lfUnderline = 0;
100 plogfonta->lfStrikeOut = 0;
101 plogfonta->lfCharSet = DEFAULT_CHARSET;
102 plogfonta->lfOutPrecision = OUT_DEFAULT_PRECIS;
103 plogfonta->lfClipPrecision = CLIP_DEFAULT_PRECIS;
104 plogfonta->lfQuality = PROOF_QUALITY;
105 plogfonta->lfPitchAndFamily = DEFAULT_PITCH;
106
107 memset(plogfonta->lfFaceName, 'A', LF_FACESIZE * sizeof(WCHAR));
108 memset(penumlfa->elfFullName, 'B', LF_FULLFACESIZE * sizeof(WCHAR));
109
110 hFont = CreateFontIndirectExA(&elfedva);
111 ok(hFont != 0, "CreateFontIndirectExA failed\n");
112
113 ret = GetObjectW(hFont, sizeof(elfedvw), &elfedvw);
114 ok(ret == sizeof(ENUMLOGFONTEXW) + 2*sizeof(DWORD), "\n");
115 ok(elfedvw.elfEnumLogfontEx.elfLogFont.lfFaceName[LF_FACESIZE-1] == 0, "\n");
116 ok(elfedvw.elfEnumLogfontEx.elfFullName[LF_FULLFACESIZE-1] == 0, "\n");
117
118 memset(&elfedva2, 0, sizeof(elfedva2));
119 ret = GetObjectA(hFont, sizeof(elfedva2), &elfedva2);
120 ok(ret == sizeof(ENUMLOGFONTEXDVA), "ret = %ld\n", ret);
121 ok(elfedva2.elfEnumLogfontEx.elfLogFont.lfFaceName[LF_FACESIZE-1] == 0, "\n");
122 ok(elfedva2.elfEnumLogfontEx.elfFullName[LF_FULLFACESIZE-1] == 0, "\n");
123 }
124
125 void
126 Test_CreateFontIndirectExW(void)
127 {
128 ENUMLOGFONTEXDVW elfedv, elfedv2;
129 ENUMLOGFONTEXDVA elfedva;
130 ENUMLOGFONTEXW *penumlfw;
131 LOGFONTW *plogfontw;
132 HFONT hFont;
133 ULONG ret;
134
135 memset(&elfedv, 0, sizeof(elfedv));
136 penumlfw = &elfedv.elfEnumLogfontEx;
137 plogfontw = &elfedv.elfEnumLogfontEx.elfLogFont;
138
139 plogfontw->lfHeight = 12;
140 plogfontw->lfWidth = 0;
141 plogfontw->lfEscapement = 0;
142 plogfontw->lfOrientation = 0;
143 plogfontw->lfWeight = FW_NORMAL;
144 plogfontw->lfItalic = 0;
145 plogfontw->lfUnderline = 0;
146 plogfontw->lfStrikeOut = 0;
147 plogfontw->lfCharSet = DEFAULT_CHARSET;
148 plogfontw->lfOutPrecision = OUT_DEFAULT_PRECIS;
149 plogfontw->lfClipPrecision = CLIP_DEFAULT_PRECIS;
150 plogfontw->lfQuality = PROOF_QUALITY;
151 plogfontw->lfPitchAndFamily = DEFAULT_PITCH;
152
153 memset(plogfontw->lfFaceName, 'A', LF_FACESIZE * sizeof(WCHAR));
154 memset(penumlfw->elfFullName, 'B', LF_FULLFACESIZE * sizeof(WCHAR));
155
156 hFont = CreateFontIndirectExW(&elfedv);
157 ok(hFont != 0, "CreateFontIndirectExW failed\n");
158
159 memset(&elfedv2, 0, sizeof(elfedv2));
160 ret = GetObjectW(hFont, sizeof(elfedv2), &elfedv2);
161 ok(ret == sizeof(ENUMLOGFONTEXW) + 2*sizeof(DWORD), "\n");
162 ok(elfedv2.elfEnumLogfontEx.elfLogFont.lfFaceName[LF_FACESIZE-1] == ((WCHAR)'A' << 8) + 'A', "\n");
163 ok(elfedv2.elfEnumLogfontEx.elfFullName[LF_FULLFACESIZE-1] == ((WCHAR)'B' << 8) + 'B', "\n");
164
165 memset(&elfedva, 0, sizeof(elfedva));
166 ret = GetObjectA(hFont, sizeof(elfedva), &elfedva);
167 ok(ret == sizeof(ENUMLOGFONTEXDVA), "\n");
168 ok(elfedva.elfEnumLogfontEx.elfLogFont.lfFaceName[LF_FACESIZE-1] == '?', "\n");
169 ok(elfedva.elfEnumLogfontEx.elfFullName[LF_FULLFACESIZE-1] == 0, "\n");
170 }
171
172 static INT CALLBACK
173 is_truetype_font_proc(const LOGFONTA *elf, const TEXTMETRICA *ntm,
174 DWORD type, LPARAM lParam)
175 {
176 if (type != TRUETYPE_FONTTYPE) return 1;
177
178 return 0;
179 }
180
181 static BOOL is_truetype_font_installed(HDC hDC, const char *name)
182 {
183 if (!EnumFontFamiliesA(hDC, name, is_truetype_font_proc, 0))
184 return TRUE;
185 return FALSE;
186 }
187
188 static INT CALLBACK
189 is_charset_font_proc(const LOGFONTA *elf, const TEXTMETRICA *ntm,
190 DWORD type, LPARAM lParam)
191 {
192 if (ntm->tmCharSet == (BYTE)lParam)
193 return 0;
194 return 1;
195 }
196
197 static BOOL is_charset_font_installed(HDC hDC, BYTE CharSet)
198 {
199 if (!EnumFontFamiliesA(hDC, NULL, is_charset_font_proc, CharSet))
200 return TRUE;
201 return FALSE;
202 }
203
204 /* TMPF_FIXED_PITCH is confusing. brain-damaged api */
205 #define _TMPF_VAR_PITCH TMPF_FIXED_PITCH
206
207 static INT CALLBACK
208 is_fixed_charset_font_proc(const LOGFONTA *elf, const TEXTMETRICA *ntm,
209 DWORD type, LPARAM lParam)
210 {
211 if (ntm->tmCharSet == (BYTE)lParam && !(ntm->tmPitchAndFamily & _TMPF_VAR_PITCH))
212 return 0;
213 return 1;
214 }
215
216 static BOOL
217 is_fixed_charset_font_installed(HDC hDC, BYTE CharSet)
218 {
219 if (!EnumFontFamiliesA(hDC, NULL, is_fixed_charset_font_proc, CharSet))
220 return TRUE;
221 return FALSE;
222 }
223
224 static void
225 Test_FontPresence(void)
226 {
227 HDC hDC;
228
229 hDC = CreateCompatibleDC(NULL);
230
231 ok(is_truetype_font_installed(hDC, "Arial"), "'Arial' is not found\n");
232 ok(is_truetype_font_installed(hDC, "Courier New"), "'Courier New' is not found\n");
233 ok(is_truetype_font_installed(hDC, "Marlett"), "'Marlett' is not found\n");
234 ok(is_truetype_font_installed(hDC, "MS Shell Dlg"), "'MS Shell Dlg' is not found\n");
235 ok(is_truetype_font_installed(hDC, "Tahoma"), "'Tahoma' is not found\n");
236 ok(is_truetype_font_installed(hDC, "Times New Roman"), "'Times New Roman' is not found\n");
237
238 ok(is_charset_font_installed(hDC, ANSI_CHARSET), "ANSI_CHARSET fonts are not found\n");
239 ok(is_charset_font_installed(hDC, SYMBOL_CHARSET), "SYMBOL_CHARSET fonts are not found\n");
240 trace_if(is_charset_font_installed(hDC, SHIFTJIS_CHARSET), "SHIFTJIS_CHARSET fonts are not found\n");
241 trace_if(is_charset_font_installed(hDC, HANGUL_CHARSET), "HANGUL_CHARSET fonts are not found\n");
242 trace_if(is_charset_font_installed(hDC, GB2312_CHARSET), "GB2312_CHARSET fonts are not found\n");
243 trace_if(is_charset_font_installed(hDC, CHINESEBIG5_CHARSET), "CHINESEBIG5_CHARSET fonts are not found\n");
244 ok(is_charset_font_installed(hDC, OEM_CHARSET), "OEM_CHARSET fonts are not found\n");
245 trace_if(is_charset_font_installed(hDC, JOHAB_CHARSET), "JOHAB_CHARSET fonts are not found\n");
246 trace_if(is_charset_font_installed(hDC, HEBREW_CHARSET), "HEBREW_CHARSET fonts are not found\n");
247 trace_if(is_charset_font_installed(hDC, ARABIC_CHARSET), "ARABIC_CHARSET fonts are not found\n");
248 trace_if(is_charset_font_installed(hDC, GREEK_CHARSET), "GREEK_CHARSET fonts are not found\n");
249 trace_if(is_charset_font_installed(hDC, TURKISH_CHARSET), "TURKISH_CHARSET fonts are not found\n");
250 trace_if(is_charset_font_installed(hDC, VIETNAMESE_CHARSET), "VIETNAMESE_CHARSET fonts are not found\n");
251 trace_if(is_charset_font_installed(hDC, THAI_CHARSET), "THAI_CHARSET fonts are not found\n");
252 trace_if(is_charset_font_installed(hDC, EASTEUROPE_CHARSET), "EASTEUROPE_CHARSET fonts are not found\n");
253 trace_if(is_charset_font_installed(hDC, RUSSIAN_CHARSET), "RUSSIAN_CHARSET fonts are not found\n");
254 trace_if(is_charset_font_installed(hDC, MAC_CHARSET), "MAC_CHARSET fonts are not found\n");
255 trace_if(is_charset_font_installed(hDC, BALTIC_CHARSET), "BALTIC_CHARSET fonts are not found\n");
256
257 ok(is_fixed_charset_font_installed(hDC, ANSI_CHARSET), "fixed ANSI_CHARSET fonts are not found\n");
258 trace_if(is_fixed_charset_font_installed(hDC, SHIFTJIS_CHARSET), "fixed SHIFTJIS_CHARSET fonts are not found\n");
259 trace_if(is_fixed_charset_font_installed(hDC, HANGUL_CHARSET), "fixed HANGUL_CHARSET fonts are not found\n");
260 trace_if(is_fixed_charset_font_installed(hDC, GB2312_CHARSET), "fixed GB2312_CHARSET fonts are not found\n");
261 trace_if(is_fixed_charset_font_installed(hDC, CHINESEBIG5_CHARSET), "fixed CHINESEBIG5_CHARSET fonts are not found\n");
262 ok(is_fixed_charset_font_installed(hDC, OEM_CHARSET), "fixed OEM_CHARSET fonts are not found\n");
263 trace_if(is_fixed_charset_font_installed(hDC, JOHAB_CHARSET), "fixed JOHAB_CHARSET fonts are not found\n");
264 trace_if(is_fixed_charset_font_installed(hDC, HEBREW_CHARSET), "fixed HEBREW_CHARSET fonts are not found\n");
265 trace_if(is_fixed_charset_font_installed(hDC, ARABIC_CHARSET), "fixed ARABIC_CHARSET fonts are not found\n");
266 trace_if(is_fixed_charset_font_installed(hDC, GREEK_CHARSET), "fixed GREEK_CHARSET fonts are not found\n");
267 trace_if(is_fixed_charset_font_installed(hDC, TURKISH_CHARSET), "fixed TURKISH_CHARSET fonts are not found\n");
268 trace_if(is_fixed_charset_font_installed(hDC, VIETNAMESE_CHARSET), "fixed VIETNAMESE_CHARSET fonts are not found\n");
269 trace_if(is_fixed_charset_font_installed(hDC, THAI_CHARSET), "fixed THAI_CHARSET fonts are not found\n");
270 trace_if(is_fixed_charset_font_installed(hDC, EASTEUROPE_CHARSET), "fixed EASTEUROPE_CHARSET fonts are not found\n");
271 trace_if(is_fixed_charset_font_installed(hDC, RUSSIAN_CHARSET), "fixed RUSSIAN_CHARSET fonts are not found\n");
272 trace_if(is_fixed_charset_font_installed(hDC, MAC_CHARSET), "fixed MAC_CHARSET fonts are not found\n");
273 trace_if(is_fixed_charset_font_installed(hDC, BALTIC_CHARSET), "fixed BALTIC_CHARSET fonts are not found\n");
274
275 DeleteDC(hDC);
276 }
277
278 /* NOTE: TMPF_FIXED_PITCH is confusing and brain-dead. */
279 #define _TMPF_VAR_PITCH TMPF_FIXED_PITCH
280
281 typedef enum TRISTATE {
282 TS_UNKNOWN,
283 TS_TRUE,
284 TS_FALSE
285 } TRISTATE;
286
287 typedef struct FONT_SEL_TEST {
288 CHAR FaceNameBefore[LF_FACESIZE];
289
290 BYTE CharSetBefore;
291 BYTE CharSetAfter;
292
293 TRISTATE BoldBefore;
294 TRISTATE BoldAfter;
295
296 BYTE ItalicBefore;
297 TRISTATE ItalicAfter;
298
299 BYTE UnderlineBefore;
300 TRISTATE UnderlineAfter;
301
302 BYTE StruckOutBefore;
303 TRISTATE StruckOutAfter;
304
305 TRISTATE FixedPitchBefore;
306 TRISTATE FixedPitchAfter;
307 } FONT_SEL_TEST;
308
309 static FONT_SEL_TEST g_Entries[] =
310 {
311 /* Entry #0: default */
312 {
313 "",
314 DEFAULT_CHARSET, DEFAULT_CHARSET,
315 TS_UNKNOWN, TS_FALSE,
316 TS_UNKNOWN, TS_FALSE,
317 TS_UNKNOWN, TS_FALSE,
318 TS_UNKNOWN, TS_FALSE,
319 TS_UNKNOWN, TS_FALSE
320 },
321 /* Entry #1: symbol font*/
322 {
323 "",
324 SYMBOL_CHARSET, SYMBOL_CHARSET
325 },
326 /* Entry #2: non-bold */
327 {
328 "",
329 DEFAULT_CHARSET, DEFAULT_CHARSET,
330 TS_FALSE, TS_FALSE
331 },
332 /* Entry #3: bold */
333 {
334 "",
335 DEFAULT_CHARSET, DEFAULT_CHARSET,
336 TS_TRUE, TS_TRUE
337 },
338 /* Entry #4: non-italic (without specifying bold) */
339 {
340 "",
341 DEFAULT_CHARSET, DEFAULT_CHARSET,
342 TS_UNKNOWN, TS_FALSE,
343 FALSE, TS_FALSE
344 },
345 /* Entry #5: italic (without specifying bold) */
346 {
347 "",
348 DEFAULT_CHARSET, DEFAULT_CHARSET,
349 TS_UNKNOWN, TS_FALSE,
350 TRUE, TS_TRUE
351 },
352 /* Entry #6: non-underline (without specifying bold) */
353 {
354 "",
355 DEFAULT_CHARSET, DEFAULT_CHARSET,
356 TS_UNKNOWN, TS_FALSE,
357 FALSE, TS_UNKNOWN,
358 FALSE, TS_FALSE
359 },
360 /* Entry #7: underline (without specifying bold) */
361 {
362 "",
363 DEFAULT_CHARSET, DEFAULT_CHARSET,
364 TS_UNKNOWN, TS_FALSE,
365 FALSE, TS_UNKNOWN,
366 TRUE, TS_TRUE
367 },
368 /* Entry #8: struck-out (without specifying bold) */
369 {
370 "",
371 DEFAULT_CHARSET, DEFAULT_CHARSET,
372 TS_UNKNOWN, TS_FALSE,
373 FALSE, TS_UNKNOWN,
374 FALSE, TS_UNKNOWN,
375 TRUE, TS_TRUE
376 },
377 /* Entry #9: non-struck-out (without specifying bold) */
378 {
379 "",
380 DEFAULT_CHARSET, DEFAULT_CHARSET,
381 TS_UNKNOWN, TS_FALSE,
382 FALSE, TS_UNKNOWN,
383 FALSE, TS_UNKNOWN,
384 FALSE, TS_FALSE
385 },
386 /* Entry #10: fixed-pitch (without specifying bold) */
387 {
388 "",
389 DEFAULT_CHARSET, DEFAULT_CHARSET,
390 TS_UNKNOWN, TS_FALSE,
391 FALSE, TS_UNKNOWN,
392 FALSE, TS_UNKNOWN,
393 FALSE, TS_UNKNOWN,
394 TS_TRUE, TS_TRUE
395 },
396 /* Entry #11: non-fixed-pitch (without specifying bold) */
397 {
398 "",
399 DEFAULT_CHARSET, DEFAULT_CHARSET,
400 TS_UNKNOWN, TS_FALSE,
401 FALSE, TS_UNKNOWN,
402 FALSE, TS_UNKNOWN,
403 FALSE, TS_UNKNOWN,
404 TS_FALSE, TS_FALSE
405 },
406 /* Entry #12: fixed-pitch and bold */
407 {
408 "",
409 DEFAULT_CHARSET, DEFAULT_CHARSET,
410 TS_TRUE, TS_TRUE,
411 FALSE, TS_UNKNOWN,
412 FALSE, TS_UNKNOWN,
413 FALSE, TS_UNKNOWN,
414 TS_TRUE, TS_TRUE
415 },
416 /* Entry #13: non-fixed-pitch and bold */
417 {
418 "",
419 DEFAULT_CHARSET, DEFAULT_CHARSET,
420 TS_TRUE, TS_TRUE,
421 FALSE, TS_UNKNOWN,
422 FALSE, TS_UNKNOWN,
423 FALSE, TS_UNKNOWN,
424 TS_FALSE, TS_FALSE
425 },
426 /* Entry #14: OEM_CHARSET */
427 {
428 "",
429 OEM_CHARSET, OEM_CHARSET,
430 TS_UNKNOWN, TS_FALSE
431 },
432 /* Entry #15: OEM_CHARSET and bold */
433 {
434 "",
435 OEM_CHARSET, OEM_CHARSET,
436 TS_TRUE, TS_TRUE
437 },
438 /* Entry #16: OEM_CHARSET and fixed-pitch */
439 {
440 "",
441 OEM_CHARSET, OEM_CHARSET,
442 TS_UNKNOWN, TS_FALSE,
443 FALSE, TS_UNKNOWN,
444 FALSE, TS_UNKNOWN,
445 FALSE, TS_UNKNOWN,
446 TS_TRUE, TS_TRUE
447 },
448 /* Entry #17: CHINESEBIG5_CHARSET (Chinese) */
449 {
450 "",
451 CHINESEBIG5_CHARSET, CHINESEBIG5_CHARSET,
452 TS_UNKNOWN, TS_FALSE
453 },
454 /* Entry #18: CHINESEBIG5_CHARSET and bold */
455 {
456 "",
457 CHINESEBIG5_CHARSET, CHINESEBIG5_CHARSET,
458 TS_TRUE, TS_TRUE
459 },
460 /* Entry #19: CHINESEBIG5_CHARSET and fixed-pitch */
461 {
462 "",
463 CHINESEBIG5_CHARSET, CHINESEBIG5_CHARSET,
464 TS_UNKNOWN, TS_FALSE,
465 FALSE, TS_UNKNOWN,
466 FALSE, TS_UNKNOWN,
467 FALSE, TS_UNKNOWN,
468 TS_TRUE, TS_TRUE
469 },
470 /* Entry #20: GB2312_CHARSET (Chinese) */
471 {
472 "",
473 GB2312_CHARSET, GB2312_CHARSET,
474 TS_UNKNOWN, TS_FALSE
475 },
476 /* Entry #21: GB2312_CHARSET and bold */
477 {
478 "",
479 GB2312_CHARSET, GB2312_CHARSET,
480 TS_TRUE, TS_TRUE
481 },
482 /* Entry #22: GB2312_CHARSET and fixed-pitch */
483 {
484 "",
485 GB2312_CHARSET, GB2312_CHARSET,
486 TS_UNKNOWN, TS_FALSE,
487 FALSE, TS_UNKNOWN,
488 FALSE, TS_UNKNOWN,
489 FALSE, TS_UNKNOWN,
490 TS_TRUE, TS_TRUE
491 },
492 /* Entry #23: RUSSIAN_CHARSET (Russian) */
493 {
494 "",
495 RUSSIAN_CHARSET, RUSSIAN_CHARSET,
496 TS_UNKNOWN, TS_FALSE
497 },
498 /* Entry #24: RUSSIAN_CHARSET and bold */
499 {
500 "",
501 RUSSIAN_CHARSET, RUSSIAN_CHARSET,
502 TS_TRUE, TS_TRUE
503 },
504 /* Entry #25: RUSSIAN_CHARSET and italic */
505 {
506 "",
507 RUSSIAN_CHARSET, RUSSIAN_CHARSET,
508 TS_UNKNOWN, TS_FALSE,
509 TRUE, TS_TRUE,
510 },
511 /* Entry #26: RUSSIAN_CHARSET and fixed-pitch */
512 {
513 "",
514 RUSSIAN_CHARSET, RUSSIAN_CHARSET,
515 TS_UNKNOWN, TS_FALSE,
516 FALSE, TS_UNKNOWN,
517 FALSE, TS_UNKNOWN,
518 FALSE, TS_UNKNOWN,
519 TS_TRUE, TS_TRUE
520 },
521 /* Entry #27: SHIFTJIS_CHARSET (Japanese) */
522 {
523 "",
524 SHIFTJIS_CHARSET, SHIFTJIS_CHARSET,
525 TS_UNKNOWN, TS_FALSE
526 },
527 /* Entry #28: SHIFTJIS_CHARSET and bold */
528 {
529 "",
530 SHIFTJIS_CHARSET, SHIFTJIS_CHARSET,
531 TS_TRUE, TS_TRUE
532 },
533 /* Entry #29: SHIFTJIS_CHARSET and fixed-pitch */
534 {
535 "",
536 SHIFTJIS_CHARSET, SHIFTJIS_CHARSET,
537 TS_UNKNOWN, TS_FALSE,
538 FALSE, TS_UNKNOWN,
539 FALSE, TS_UNKNOWN,
540 FALSE, TS_UNKNOWN,
541 TS_TRUE, TS_TRUE
542 },
543 /* Entry #30: HANGUL_CHARSET (Korean) */
544 {
545 "",
546 HANGUL_CHARSET, HANGUL_CHARSET,
547 TS_UNKNOWN, TS_FALSE
548 },
549 /* Entry #31: HANGUL_CHARSET and bold */
550 {
551 "",
552 HANGUL_CHARSET, HANGUL_CHARSET,
553 TS_TRUE, TS_TRUE
554 },
555 /* Entry #32: HANGUL_CHARSET and fixed-pitch */
556 {
557 "",
558 HANGUL_CHARSET, HANGUL_CHARSET,
559 TS_UNKNOWN, TS_FALSE,
560 FALSE, TS_UNKNOWN,
561 FALSE, TS_UNKNOWN,
562 FALSE, TS_UNKNOWN,
563 TS_TRUE, TS_TRUE
564 },
565 /* Entry #33: JOHAB_CHARSET (Korean) */
566 {
567 "",
568 JOHAB_CHARSET, JOHAB_CHARSET,
569 TS_UNKNOWN, TS_UNKNOWN
570 },
571 /* Entry #34: JOHAB_CHARSET and bold */
572 {
573 "",
574 JOHAB_CHARSET, JOHAB_CHARSET,
575 TS_TRUE, TS_TRUE
576 },
577 /* Entry #35: JOHAB_CHARSET and fixed-pitch */
578 {
579 "",
580 JOHAB_CHARSET, JOHAB_CHARSET,
581 TS_UNKNOWN, TS_UNKNOWN,
582 FALSE, TS_UNKNOWN,
583 FALSE, TS_UNKNOWN,
584 FALSE, TS_UNKNOWN,
585 TS_TRUE, TS_TRUE
586 },
587 /* Entry #36: THAI_CHARSET (Thai) */
588 {
589 "",
590 THAI_CHARSET, THAI_CHARSET,
591 TS_UNKNOWN, TS_FALSE
592 },
593 /* Entry #37: THAI_CHARSET and bold */
594 {
595 "",
596 THAI_CHARSET, THAI_CHARSET,
597 TS_TRUE, TS_TRUE
598 },
599 /* Entry #38: THAI_CHARSET and fixed-pitch */
600 {
601 "",
602 THAI_CHARSET, THAI_CHARSET,
603 TS_UNKNOWN, TS_FALSE,
604 FALSE, TS_UNKNOWN,
605 FALSE, TS_UNKNOWN,
606 FALSE, TS_UNKNOWN,
607 TS_TRUE, TS_TRUE
608 },
609 /* Entry #39: GREEK_CHARSET (Greek) */
610 {
611 "",
612 GREEK_CHARSET, GREEK_CHARSET,
613 TS_UNKNOWN, TS_FALSE
614 },
615 /* Entry #40: GREEK_CHARSET and bold */
616 {
617 "",
618 GREEK_CHARSET, GREEK_CHARSET,
619 TS_TRUE, TS_TRUE
620 },
621 /* Entry #41: GREEK_CHARSET and italic */
622 {
623 "",
624 GREEK_CHARSET, GREEK_CHARSET,
625 TS_UNKNOWN, TS_FALSE,
626 TRUE, TS_TRUE
627 },
628 /* Entry #42: GREEK_CHARSET and fixed-pitch */
629 {
630 "",
631 GREEK_CHARSET, GREEK_CHARSET,
632 TS_UNKNOWN, TS_FALSE,
633 FALSE, TS_UNKNOWN,
634 FALSE, TS_UNKNOWN,
635 FALSE, TS_UNKNOWN,
636 TS_TRUE, TS_TRUE
637 },
638 /* Entry #43: "Marlett" */
639 {
640 "Marlett",
641 DEFAULT_CHARSET, SYMBOL_CHARSET
642 },
643 /* Entry #43: "Arial" */
644 {
645 "Arial",
646 DEFAULT_CHARSET, DEFAULT_CHARSET,
647 TS_UNKNOWN, TS_FALSE,
648 FALSE, TS_UNKNOWN,
649 FALSE, TS_UNKNOWN,
650 FALSE, TS_UNKNOWN,
651 TS_UNKNOWN, TS_FALSE
652 },
653 /* Entry #44: "Courier" */
654 {
655 "Courier",
656 DEFAULT_CHARSET, DEFAULT_CHARSET,
657 TS_UNKNOWN, TS_FALSE,
658 FALSE, TS_UNKNOWN,
659 FALSE, TS_UNKNOWN,
660 FALSE, TS_UNKNOWN,
661 TS_UNKNOWN, TS_TRUE
662 }
663 };
664
665 static void
666 Test_FontSelectionEntry(HDC hDC, UINT nIndex, FONT_SEL_TEST *Entry)
667 {
668 LOGFONTA lf;
669 HFONT hFont;
670 HGDIOBJ hFontOld;
671 TEXTMETRICA tm;
672
673 ZeroMemory(&lf, sizeof(lf));
674
675 if (Entry->FaceNameBefore[0])
676 lstrcpynA(lf.lfFaceName, Entry->FaceNameBefore, _countof(lf.lfFaceName));
677
678 lf.lfCharSet = Entry->CharSetBefore;
679
680 if (Entry->BoldBefore == TS_TRUE)
681 lf.lfWeight = FW_BOLD;
682 else if (Entry->BoldBefore == TS_FALSE)
683 lf.lfWeight = FW_NORMAL;
684 else
685 lf.lfWeight = FW_DONTCARE;
686
687 lf.lfItalic = Entry->ItalicBefore;
688 lf.lfUnderline = Entry->UnderlineBefore;
689 lf.lfStrikeOut = Entry->StruckOutBefore;
690
691 if (Entry->FixedPitchBefore == TS_TRUE)
692 lf.lfPitchAndFamily = FIXED_PITCH | FF_DONTCARE;
693 else if (Entry->FixedPitchBefore == TS_FALSE)
694 lf.lfPitchAndFamily = VARIABLE_PITCH | FF_DONTCARE;
695 else
696 lf.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE;
697
698 hFont = CreateFontIndirectA(&lf);
699 ok(hFont != NULL, "Entry #%u: hFont failed\n", nIndex);
700
701 hFontOld = SelectObject(hDC, hFont);
702 {
703 ok(GetTextMetricsA(hDC, &tm), "Entry #%u: GetTextMetricsA failed\n", nIndex);
704
705 if (Entry->CharSetAfter != DEFAULT_CHARSET)
706 ok(tm.tmCharSet == Entry->CharSetAfter, "Entry #%u: CharSet mismatched, it was %u\n", nIndex, tm.tmCharSet);
707
708 if (Entry->BoldAfter == TS_TRUE)
709 ok(tm.tmWeight >= FW_BOLD, "Entry #%u: Weight was non-bold\n", nIndex);
710 else if (Entry->BoldAfter == TS_FALSE)
711 ok(tm.tmWeight <= FW_MEDIUM, "Entry #%u: Weight was bold\n", nIndex);
712
713 if (Entry->ItalicAfter == TS_TRUE)
714 ok(tm.tmItalic, "Entry #%u: Italic was non-italic\n", nIndex);
715 else if (Entry->ItalicAfter == TS_FALSE)
716 ok(!tm.tmItalic, "Entry #%u: Italic was italic\n", nIndex);
717
718 if (Entry->UnderlineAfter == TS_TRUE)
719 ok(tm.tmUnderlined, "Entry #%u: Underlined was FALSE\n", nIndex);
720 else if (Entry->UnderlineAfter == TS_FALSE)
721 ok(!tm.tmUnderlined, "Entry #%u: Underlined was TRUE\n", nIndex);
722
723 if (Entry->StruckOutAfter == TS_TRUE)
724 ok(tm.tmStruckOut, "Entry #%u: Struck-out was FALSE\n", nIndex);
725 else if (Entry->StruckOutAfter == TS_FALSE)
726 ok(!tm.tmStruckOut, "Entry #%u: Struck-out was TRUE\n", nIndex);
727
728 if (Entry->FixedPitchAfter == TS_TRUE)
729 ok(!(tm.tmPitchAndFamily & _TMPF_VAR_PITCH), "Entry #%u: Pitch mismatched, it was non-fixed-pitch\n", nIndex);
730 else if (Entry->FixedPitchAfter == TS_FALSE)
731 ok((tm.tmPitchAndFamily & _TMPF_VAR_PITCH), "Entry #%u: Pitch mismatched, it was fixed-pitch\n", nIndex);
732 }
733 SelectObject(hDC, hFontOld);
734 DeleteObject(hFont);
735 }
736
737 static void
738 Test_FontSelection(void)
739 {
740 UINT nIndex;
741 HDC hDC;
742
743 hDC = CreateCompatibleDC(NULL);
744 for (nIndex = 0; nIndex < _countof(g_Entries); ++nIndex)
745 {
746 if (!is_charset_font_installed(hDC, g_Entries[nIndex].CharSetBefore))
747 skip("charset not available: 0x%x\n", g_Entries[nIndex].CharSetBefore);
748 else
749 Test_FontSelectionEntry(hDC, nIndex, g_Entries + nIndex);
750 }
751 DeleteDC(hDC);
752 }
753
754
755 START_TEST(CreateFontIndirect)
756 {
757 Test_CreateFontIndirectA();
758 Test_CreateFontIndirectW();
759 Test_CreateFontIndirectExA();
760 Test_CreateFontIndirectExW();
761 Test_FontPresence();
762 Test_FontSelection();
763 }
764