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