gdiplus: GdipIsMatrixInvertible implementation with tests.
[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 nonexistant[] = {'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;
45     GpFont* font = NULL;
46     GpStatus stat;
47     Unit unit;
48     UINT i;
49     REAL size;
50
51     stat = GdipCreateFontFamilyFromName(nonexistant, NULL, &fontfamily);
52     expect (FontFamilyNotFound, stat);
53     stat = GdipDeleteFont(font);
54     expect (InvalidParameter, stat);
55     stat = GdipCreateFontFamilyFromName(arial, NULL, &fontfamily);
56     expect (Ok, stat);
57     stat = GdipCreateFont(fontfamily, 12, FontStyleRegular, UnitPoint, &font);
58     expect (Ok, stat);
59     stat = GdipGetFontUnit (font, &unit);
60     expect (Ok, stat);
61     expect (UnitPoint, unit);
62
63     /* Test to see if returned size is based on unit (its not) */
64     GdipGetFontSize(font, &size);
65     ok (size == 12, "Expected 12, got %f\n", size);
66     GdipDeleteFont(font);
67
68     /* Make sure everything is converted correctly for all Units */
69     for (i = UnitWorld; i <=UnitMillimeter; i++)
70     {
71         if (i == UnitDisplay) continue; /* Crashes WindowsXP, wtf? */
72         GdipCreateFont(fontfamily, 24, FontStyleRegular, i, &font);
73         GdipGetFontSize (font, &size);
74         ok (size == 24, "Expected 24, got %f (with unit: %d)\n", size, i);
75         GdipGetFontUnit (font, &unit);
76         expect (i, unit);
77         GdipDeleteFont(font);
78     }
79
80     GdipDeleteFontFamily(fontfamily);
81 }
82
83 static void test_logfont(void)
84 {
85     LOGFONTW lfw, lfw2;
86     GpFont *font;
87     GpStatus stat;
88     GpGraphics *graphics;
89     HDC hdc = GetDC(0);
90
91     GdipCreateFromHDC(hdc, &graphics);
92     memset(&lfw, 0, sizeof(LOGFONTW));
93     memset(&lfw2, 0xff, sizeof(LOGFONTW));
94     memcpy(&lfw.lfFaceName, arial, 6 * sizeof(WCHAR));
95
96     stat = GdipCreateFontFromLogfontW(hdc, &lfw, &font);
97     expect(Ok, stat);
98     stat = GdipGetLogFontW(font, graphics, &lfw2);
99     expect(Ok, stat);
100
101     ok(lfw2.lfHeight < 0, "Expected negative height\n");
102     expect(0, lfw2.lfWidth);
103     expect(0, lfw2.lfEscapement);
104     expect(0, lfw2.lfOrientation);
105     ok((lfw2.lfWeight >= 100) && (lfw2.lfWeight <= 900), "Expected weight to be set\n");
106     expect(0, lfw2.lfItalic);
107     expect(0, lfw2.lfUnderline);
108     expect(0, lfw2.lfStrikeOut);
109     expect(0, lfw2.lfCharSet);
110     expect(0, lfw2.lfOutPrecision);
111     expect(0, lfw2.lfClipPrecision);
112     expect(0, lfw2.lfQuality);
113     expect(0, lfw2.lfPitchAndFamily);
114
115     GdipDeleteFont(font);
116
117     memset(&lfw, 0, sizeof(LOGFONTW));
118     lfw.lfHeight = 25;
119     lfw.lfWidth = 25;
120     lfw.lfEscapement = lfw.lfOrientation = 50;
121     lfw.lfItalic = lfw.lfUnderline = lfw.lfStrikeOut = TRUE;
122
123     memset(&lfw2, 0xff, sizeof(LOGFONTW));
124     memcpy(&lfw.lfFaceName, arial, 6 * sizeof(WCHAR));
125
126     stat = GdipCreateFontFromLogfontW(hdc, &lfw, &font);
127     expect(Ok, stat);
128     stat = GdipGetLogFontW(font, graphics, &lfw2);
129     expect(Ok, stat);
130
131     ok(lfw2.lfHeight < 0, "Expected negative height\n");
132     expect(0, lfw2.lfWidth);
133     expect(0, lfw2.lfEscapement);
134     expect(0, lfw2.lfOrientation);
135     ok((lfw2.lfWeight >= 100) && (lfw2.lfWeight <= 900), "Expected weight to be set\n");
136     expect(TRUE, lfw2.lfItalic);
137     expect(TRUE, lfw2.lfUnderline);
138     expect(TRUE, lfw2.lfStrikeOut);
139     expect(0, lfw2.lfCharSet);
140     expect(0, lfw2.lfOutPrecision);
141     expect(0, lfw2.lfClipPrecision);
142     expect(0, lfw2.lfQuality);
143     expect(0, lfw2.lfPitchAndFamily);
144
145     GdipDeleteFont(font);
146
147     GdipDeleteGraphics(graphics);
148     ReleaseDC(0, hdc);
149 }
150
151 static void test_fontfamily (void)
152 {
153     GpFontFamily *family, *clonedFontFamily;
154     WCHAR itsName[LF_FACESIZE];
155     GpStatus stat;
156
157     /* FontFamily can not be NULL */
158     stat = GdipCreateFontFamilyFromName (arial , NULL, NULL);
159     expect (InvalidParameter, stat);
160
161     /* FontFamily must be able to actually find the family.
162      * If it can't, any subsequent calls should fail.
163      */
164     stat = GdipCreateFontFamilyFromName (nonexistant, NULL, &family);
165     expect (FontFamilyNotFound, stat);
166     ok ((lstrcmpiW(itsName, nonexistant) != 0),
167         "Expected a non-zero value for nonexistant font!\n");
168
169     stat = GdipCreateFontFamilyFromName (arial, NULL, &family);
170     expect (Ok, stat);
171
172     stat = GdipGetFamilyName (family, itsName, LANG_NEUTRAL);
173     expect (Ok, stat);
174     expect (0, lstrcmpiW(itsName, arial));
175
176     if (0)
177     {
178         /* Crashes on Windows XP SP2, Vista, and so Wine as well */
179         stat = GdipGetFamilyName (family, NULL, LANG_NEUTRAL);
180         expect (Ok, stat);
181     }
182
183     /* Make sure we don't read old data */
184     ZeroMemory (itsName, sizeof(itsName));
185     stat = GdipCloneFontFamily(family, &clonedFontFamily);
186     expect (Ok, stat);
187     GdipDeleteFontFamily(family);
188     stat = GdipGetFamilyName(clonedFontFamily, itsName, LANG_NEUTRAL);
189     expect(Ok, stat);
190     expect(0, lstrcmpiW(itsName, arial));
191
192     GdipDeleteFontFamily(clonedFontFamily);
193 }
194
195 static void test_fontfamily_properties (void)
196 {
197     GpFontFamily* FontFamily = NULL;
198     GpStatus stat;
199     UINT16 result = 0;
200
201     GdipCreateFontFamilyFromName(arial, NULL, &FontFamily);
202 todo_wine
203 {
204     stat = GdipGetLineSpacing(FontFamily, FontStyleRegular, &result);
205     expect(Ok, stat);
206     ok (result == 2355, "Expected 2355, got %d\n", result);
207 }
208     result = 0;
209     stat = GdipGetEmHeight(FontFamily, FontStyleRegular, &result);
210     expect(Ok, stat);
211     ok(result == 2048, "Expected 2048, got %d\n", result);
212     result = 0;
213     stat = GdipGetCellAscent(FontFamily, FontStyleRegular, &result);
214     expect(Ok, stat);
215     ok(result == 1854, "Expected 1854, got %d\n", result);
216     result = 0;
217     stat = GdipGetCellDescent(FontFamily, FontStyleRegular, &result);
218     ok(result == 434, "Expected 434, got %d\n", result);
219     GdipDeleteFontFamily(FontFamily);
220
221     GdipCreateFontFamilyFromName(TimesNewRoman, NULL, &FontFamily);
222     result = 0;
223 todo_wine
224 {
225     stat = GdipGetLineSpacing(FontFamily, FontStyleRegular, &result);
226     expect(Ok, stat);
227     ok(result == 2355, "Expected 2355, got %d\n", result);
228 }
229     result = 0;
230     stat = GdipGetEmHeight(FontFamily, FontStyleRegular, &result);
231     expect(Ok, stat);
232     ok(result == 2048, "Expected 2048, got %d\n", result);
233     result = 0;
234     stat = GdipGetCellAscent(FontFamily, FontStyleRegular, &result);
235     expect(Ok, stat);
236     ok(result == 1825, "Expected 1825, got %d\n", result);
237     result = 0;
238     stat = GdipGetCellDescent(FontFamily, FontStyleRegular, &result);
239     ok(result == 443, "Expected 443 got %d\n", result);
240     GdipDeleteFontFamily(FontFamily);
241 }
242
243 static void test_getgenerics (void)
244 {
245     GpStatus stat;
246     GpFontFamily* family;
247     WCHAR familyName[LF_FACESIZE];
248     ZeroMemory(familyName, sizeof(familyName)/sizeof(WCHAR));
249
250     stat = GdipGetGenericFontFamilySansSerif (&family);
251     expect (Ok, stat);
252     stat = GdipGetFamilyName (family, familyName, LANG_NEUTRAL);
253     expect (Ok, stat);
254     ok ((lstrcmpiW(familyName, MicrosoftSansSerif) == 0) ||
255         (lstrcmpiW(familyName,MSSansSerif) == 0),
256         "Expected Microsoft Sans Serif or MS Sans Serif, got %s\n",
257         debugstr_w(familyName));
258     stat = GdipDeleteFontFamily (family);
259     expect (Ok, stat);
260
261     stat = GdipGetGenericFontFamilySerif (&family);
262     expect (Ok, stat);
263     stat = GdipGetFamilyName (family, familyName, LANG_NEUTRAL);
264     expect (Ok, stat);
265     ok (lstrcmpiW(familyName, TimesNewRoman) == 0,
266         "Expected Times New Roman, got %s\n", debugstr_w(familyName));
267     stat = GdipDeleteFontFamily (family);
268     expect (Ok, stat);
269
270     stat = GdipGetGenericFontFamilyMonospace (&family);
271     expect (Ok, stat);
272     stat = GdipGetFamilyName (family, familyName, LANG_NEUTRAL);
273     expect (Ok, stat);
274     ok (lstrcmpiW(familyName, CourierNew) == 0,
275         "Expected Courier New, got %s\n", debugstr_w(familyName));
276     stat = GdipDeleteFontFamily (family);
277     expect (Ok, stat);
278 }
279
280 START_TEST(font)
281 {
282     struct GdiplusStartupInput gdiplusStartupInput;
283     ULONG_PTR gdiplusToken;
284
285     gdiplusStartupInput.GdiplusVersion              = 1;
286     gdiplusStartupInput.DebugEventCallback          = NULL;
287     gdiplusStartupInput.SuppressBackgroundThread    = 0;
288     gdiplusStartupInput.SuppressExternalCodecs      = 0;
289
290     GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
291
292     test_createfont();
293     test_logfont();
294     test_fontfamily();
295     test_fontfamily_properties();
296     test_getgenerics();
297
298     GdiplusShutdown(gdiplusToken);
299 }