gdiplus: Don't create a font if there is no facename.
[wine] / dlls / gdiplus / tests / font.c
1 /*
2  * Unit test suite for fonts
3  *
4  * Copyright (C) 2007 Google (Evan Stade)
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20
21 #include "windows.h"
22 #include "gdiplus.h"
23 #include "wine/test.h"
24
25 #define expect(expected, got) ok(got == expected, "Expected %.8x, got %.8x\n", expected, got)
26
27 static const WCHAR arial[] = {'A','r','i','a','l','\0'};
28 static const WCHAR nonexistent[] = {'T','h','i','s','F','o','n','t','s','h','o','u','l','d','N','o','t','E','x','i','s','t','\0'};
29 static const WCHAR MSSansSerif[] = {'M','S',' ','S','a','n','s',' ','S','e','r','i','f','\0'};
30 static const WCHAR MicrosoftSansSerif[] = {'M','i','c','r','o','s','o','f','t',' ','S','a','n','s',' ','S','e','r','i','f','\0'};
31 static const WCHAR TimesNewRoman[] = {'T','i','m','e','s',' ','N','e','w',' ','R','o','m','a','n','\0'};
32 static const WCHAR CourierNew[] = {'C','o','u','r','i','e','r',' ','N','e','w','\0'};
33
34 static const char *debugstr_w(LPCWSTR str)
35 {
36    static char buf[1024];
37    WideCharToMultiByte(CP_ACP, 0, str, -1, buf, sizeof(buf), NULL, NULL);
38    return buf;
39 }
40
41
42 static void test_createfont(void)
43 {
44     GpFontFamily* fontfamily = NULL, *fontfamily2;
45     GpFont* font = NULL;
46     GpStatus stat;
47     Unit unit;
48     UINT i;
49     REAL size;
50     WCHAR familyname[LF_FACESIZE];
51
52     stat = GdipCreateFontFamilyFromName(nonexistent, NULL, &fontfamily);
53     expect (FontFamilyNotFound, stat);
54     stat = GdipDeleteFont(font);
55     expect (InvalidParameter, stat);
56     stat = GdipCreateFontFamilyFromName(arial, NULL, &fontfamily);
57     if(stat == FontFamilyNotFound)
58     {
59         skip("Arial not installed\n");
60         return;
61     }
62     expect (Ok, stat);
63     stat = GdipCreateFont(fontfamily, 12, FontStyleRegular, UnitPoint, &font);
64     expect (Ok, stat);
65     stat = GdipGetFontUnit (font, &unit);
66     expect (Ok, stat);
67     expect (UnitPoint, unit);
68
69     stat = GdipGetFamily(font, &fontfamily2);
70     expect(Ok, stat);
71     stat = GdipGetFamilyName(fontfamily2, familyname, 0);
72     expect(Ok, stat);
73     ok (lstrcmpiW(arial, familyname) == 0, "Expected arial, got %s\n",
74             debugstr_w(familyname));
75     stat = GdipDeleteFontFamily(fontfamily2);
76     expect(Ok, stat);
77
78     /* Test to see if returned size is based on unit (its not) */
79     GdipGetFontSize(font, &size);
80     ok (size == 12, "Expected 12, got %f\n", size);
81     GdipDeleteFont(font);
82
83     /* Make sure everything is converted correctly for all Units */
84     for (i = UnitWorld; i <=UnitMillimeter; i++)
85     {
86         if (i == UnitDisplay) continue; /* Crashes WindowsXP, wtf? */
87         GdipCreateFont(fontfamily, 24, FontStyleRegular, i, &font);
88         GdipGetFontSize (font, &size);
89         ok (size == 24, "Expected 24, got %f (with unit: %d)\n", size, i);
90         GdipGetFontUnit (font, &unit);
91         expect (i, unit);
92         GdipDeleteFont(font);
93     }
94
95     GdipDeleteFontFamily(fontfamily);
96 }
97
98 static void test_logfont(void)
99 {
100     LOGFONTW lfw, lfw2;
101     GpFont *font;
102     GpStatus stat;
103     GpGraphics *graphics;
104     HDC hdc = GetDC(0);
105     INT style;
106
107     GdipCreateFromHDC(hdc, &graphics);
108     memset(&lfw, 0, sizeof(LOGFONTW));
109     memset(&lfw2, 0xff, sizeof(LOGFONTW));
110
111     /* empty FaceName */
112     lfw.lfFaceName[0] = 0;
113     stat = GdipCreateFontFromLogfontW(hdc, &lfw, &font);
114
115     expect(NotTrueTypeFont, stat);
116
117     memcpy(&lfw.lfFaceName, arial, 6 * sizeof(WCHAR));
118
119     stat = GdipCreateFontFromLogfontW(hdc, &lfw, &font);
120     if (stat == FileNotFound)
121     {
122         skip("Arial not installed.\n");
123         return;
124     }
125     expect(Ok, stat);
126     stat = GdipGetLogFontW(font, graphics, &lfw2);
127     expect(Ok, stat);
128
129     ok(lfw2.lfHeight < 0, "Expected negative height\n");
130     expect(0, lfw2.lfWidth);
131     expect(0, lfw2.lfEscapement);
132     expect(0, lfw2.lfOrientation);
133     ok((lfw2.lfWeight >= 100) && (lfw2.lfWeight <= 900), "Expected weight to be set\n");
134     expect(0, lfw2.lfItalic);
135     expect(0, lfw2.lfUnderline);
136     expect(0, lfw2.lfStrikeOut);
137     expect(0, lfw2.lfCharSet);
138     expect(0, lfw2.lfOutPrecision);
139     expect(0, lfw2.lfClipPrecision);
140     expect(0, lfw2.lfQuality);
141     expect(0, lfw2.lfPitchAndFamily);
142
143     GdipDeleteFont(font);
144
145     memset(&lfw, 0, sizeof(LOGFONTW));
146     lfw.lfHeight = 25;
147     lfw.lfWidth = 25;
148     lfw.lfEscapement = lfw.lfOrientation = 50;
149     lfw.lfItalic = lfw.lfUnderline = lfw.lfStrikeOut = TRUE;
150
151     memset(&lfw2, 0xff, sizeof(LOGFONTW));
152     memcpy(&lfw.lfFaceName, arial, 6 * sizeof(WCHAR));
153
154     stat = GdipCreateFontFromLogfontW(hdc, &lfw, &font);
155     expect(Ok, stat);
156     stat = GdipGetLogFontW(font, graphics, &lfw2);
157     expect(Ok, stat);
158
159     ok(lfw2.lfHeight < 0, "Expected negative height\n");
160     expect(0, lfw2.lfWidth);
161     expect(0, lfw2.lfEscapement);
162     expect(0, lfw2.lfOrientation);
163     ok((lfw2.lfWeight >= 100) && (lfw2.lfWeight <= 900), "Expected weight to be set\n");
164     expect(TRUE, lfw2.lfItalic);
165     expect(TRUE, lfw2.lfUnderline);
166     expect(TRUE, lfw2.lfStrikeOut);
167     expect(0, lfw2.lfCharSet);
168     expect(0, lfw2.lfOutPrecision);
169     expect(0, lfw2.lfClipPrecision);
170     expect(0, lfw2.lfQuality);
171     expect(0, lfw2.lfPitchAndFamily);
172
173     stat = GdipGetFontStyle(font, &style);
174     expect(Ok, stat);
175     ok (style == (FontStyleItalic | FontStyleUnderline | FontStyleStrikeout),
176             "Expected , got %d\n", style);
177
178     GdipDeleteFont(font);
179
180     GdipDeleteGraphics(graphics);
181     ReleaseDC(0, hdc);
182 }
183
184 static void test_fontfamily (void)
185 {
186     GpFontFamily *family, *clonedFontFamily;
187     WCHAR itsName[LF_FACESIZE];
188     GpStatus stat;
189
190     /* FontFamily cannot be NULL */
191     stat = GdipCreateFontFamilyFromName (arial , NULL, NULL);
192     expect (InvalidParameter, stat);
193
194     /* FontFamily must be able to actually find the family.
195      * If it can't, any subsequent calls should fail.
196      */
197     stat = GdipCreateFontFamilyFromName (nonexistent, NULL, &family);
198     expect (FontFamilyNotFound, stat);
199
200     /* Bitmap fonts are not found */
201 todo_wine
202 {
203     stat = GdipCreateFontFamilyFromName (MSSansSerif, NULL, &family);
204     expect (FontFamilyNotFound, stat);
205 }
206
207     stat = GdipCreateFontFamilyFromName (arial, NULL, &family);
208     if(stat == FontFamilyNotFound)
209     {
210         skip("Arial not installed\n");
211         return;
212     }
213     expect (Ok, stat);
214
215     stat = GdipGetFamilyName (family, itsName, LANG_NEUTRAL);
216     expect (Ok, stat);
217     expect (0, lstrcmpiW(itsName, arial));
218
219     if (0)
220     {
221         /* Crashes on Windows XP SP2, Vista, and so Wine as well */
222         stat = GdipGetFamilyName (family, NULL, LANG_NEUTRAL);
223         expect (Ok, stat);
224     }
225
226     /* Make sure we don't read old data */
227     ZeroMemory (itsName, sizeof(itsName));
228     stat = GdipCloneFontFamily(family, &clonedFontFamily);
229     expect (Ok, stat);
230     GdipDeleteFontFamily(family);
231     stat = GdipGetFamilyName(clonedFontFamily, itsName, LANG_NEUTRAL);
232     expect(Ok, stat);
233     expect(0, lstrcmpiW(itsName, arial));
234
235     GdipDeleteFontFamily(clonedFontFamily);
236 }
237
238 static void test_fontfamily_properties (void)
239 {
240     GpFontFamily* FontFamily = NULL;
241     GpStatus stat;
242     UINT16 result = 0;
243
244     stat = GdipCreateFontFamilyFromName(arial, NULL, &FontFamily);
245     if(stat == FontFamilyNotFound)
246         skip("Arial not installed\n");
247     else
248     {
249 todo_wine
250 {
251         stat = GdipGetLineSpacing(FontFamily, FontStyleRegular, &result);
252         expect(Ok, stat);
253         ok (result == 2355, "Expected 2355, got %d\n", result);
254 }
255         result = 0;
256         stat = GdipGetEmHeight(FontFamily, FontStyleRegular, &result);
257         expect(Ok, stat);
258         ok(result == 2048, "Expected 2048, got %d\n", result);
259         result = 0;
260         stat = GdipGetCellAscent(FontFamily, FontStyleRegular, &result);
261         expect(Ok, stat);
262         ok(result == 1854, "Expected 1854, got %d\n", result);
263         result = 0;
264         stat = GdipGetCellDescent(FontFamily, FontStyleRegular, &result);
265         ok(result == 434, "Expected 434, got %d\n", result);
266         GdipDeleteFontFamily(FontFamily);
267     }
268
269     stat = GdipCreateFontFamilyFromName(TimesNewRoman, NULL, &FontFamily);
270     if(stat == FontFamilyNotFound)
271         skip("Times New Roman not installed\n");
272     else
273     {
274         result = 0;
275 todo_wine
276 {
277         stat = GdipGetLineSpacing(FontFamily, FontStyleRegular, &result);
278         expect(Ok, stat);
279         ok(result == 2355, "Expected 2355, got %d\n", result);
280 }
281         result = 0;
282         stat = GdipGetEmHeight(FontFamily, FontStyleRegular, &result);
283         expect(Ok, stat);
284         ok(result == 2048, "Expected 2048, got %d\n", result);
285         result = 0;
286         stat = GdipGetCellAscent(FontFamily, FontStyleRegular, &result);
287         expect(Ok, stat);
288         ok(result == 1825, "Expected 1825, got %d\n", result);
289         result = 0;
290         stat = GdipGetCellDescent(FontFamily, FontStyleRegular, &result);
291         ok(result == 443, "Expected 443 got %d\n", result);
292         GdipDeleteFontFamily(FontFamily);
293     }
294 }
295
296 static void test_getgenerics (void)
297 {
298     GpStatus stat;
299     GpFontFamily* family;
300     WCHAR familyName[LF_FACESIZE];
301     ZeroMemory(familyName, sizeof(familyName)/sizeof(WCHAR));
302
303     stat = GdipGetGenericFontFamilySansSerif (&family);
304     if (stat == FontFamilyNotFound)
305     {
306         skip("Microsoft Sans Serif not installed\n");
307         goto serif;
308     }
309     expect (Ok, stat);
310     stat = GdipGetFamilyName (family, familyName, LANG_NEUTRAL);
311     expect (Ok, stat);
312     ok ((lstrcmpiW(familyName, MicrosoftSansSerif) == 0) ||
313         (lstrcmpiW(familyName,MSSansSerif) == 0),
314         "Expected Microsoft Sans Serif or MS Sans Serif, got %s\n",
315         debugstr_w(familyName));
316     stat = GdipDeleteFontFamily (family);
317     expect (Ok, stat);
318
319 serif:
320     stat = GdipGetGenericFontFamilySerif (&family);
321     if (stat == FontFamilyNotFound)
322     {
323         skip("Times New Roman not installed\n");
324         goto monospace;
325     }
326     expect (Ok, stat);
327     stat = GdipGetFamilyName (family, familyName, LANG_NEUTRAL);
328     expect (Ok, stat);
329     ok (lstrcmpiW(familyName, TimesNewRoman) == 0,
330         "Expected Times New Roman, got %s\n", debugstr_w(familyName));
331     stat = GdipDeleteFontFamily (family);
332     expect (Ok, stat);
333
334 monospace:
335     stat = GdipGetGenericFontFamilyMonospace (&family);
336     if (stat == FontFamilyNotFound)
337     {
338         skip("Courier New not installed\n");
339         return;
340     }
341     expect (Ok, stat);
342     stat = GdipGetFamilyName (family, familyName, LANG_NEUTRAL);
343     expect (Ok, stat);
344     ok (lstrcmpiW(familyName, CourierNew) == 0,
345         "Expected Courier New, got %s\n", debugstr_w(familyName));
346     stat = GdipDeleteFontFamily (family);
347     expect (Ok, stat);
348 }
349
350 START_TEST(font)
351 {
352     struct GdiplusStartupInput gdiplusStartupInput;
353     ULONG_PTR gdiplusToken;
354
355     gdiplusStartupInput.GdiplusVersion              = 1;
356     gdiplusStartupInput.DebugEventCallback          = NULL;
357     gdiplusStartupInput.SuppressBackgroundThread    = 0;
358     gdiplusStartupInput.SuppressExternalCodecs      = 0;
359
360     GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
361
362     test_createfont();
363     test_logfont();
364     test_fontfamily();
365     test_fontfamily_properties();
366     test_getgenerics();
367
368     GdiplusShutdown(gdiplusToken);
369 }