2 * Unit test suite for pens (and init)
4 * Copyright (C) 2007 Google (Evan Stade)
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.
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.
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
25 #include "wine/test.h"
27 #define expect(expected, got) ok(got == expected, "Expected %.8x, got %.8x\n", expected, got)
28 #define expectf(expected, got) ok(fabs(got - expected) < 0.1, "Expected %.2f, got %.2f\n", expected, got)
30 static void test_startup(void)
34 struct GdiplusStartupInput gdiplusStartupInput;
35 ULONG_PTR gdiplusToken;
38 gdiplusStartupInput.DebugEventCallback = NULL;
39 gdiplusStartupInput.SuppressBackgroundThread = 0;
40 gdiplusStartupInput.SuppressExternalCodecs = 0;
42 for (gpversion=1; gpversion<256; gpversion++)
44 gdiplusStartupInput.GdiplusVersion = gpversion;
45 status = GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
46 ok(status == Ok || status == UnsupportedGdiplusVersion,
47 "GdiplusStartup returned %x\n", status);
48 GdiplusShutdown(gdiplusToken);
56 ok(gpversion > 0 && gpversion < 42, "unexpected gdiplus version %i\n", gpversion);
57 trace("gdiplus version is %i\n", gpversion);
59 status = GdipCreatePen1((ARGB)0xffff00ff, 10.0f, UnitPixel, &pen);
62 expect(GdiplusNotInitialized, status);
67 static void test_constructor_destructor(void)
72 status = GdipCreatePen1((ARGB)0xffff00ff, 10.0f, UnitPixel, NULL);
73 expect(InvalidParameter, status);
74 ok(pen == NULL, "Expected pen to be NULL\n");
76 status = GdipCreatePen1((ARGB)0xffff00ff, 10.0f, UnitPixel, &pen);
78 ok(pen != NULL, "Expected pen to be initialized\n");
80 status = GdipDeletePen(NULL);
81 expect(InvalidParameter, status);
83 status = GdipDeletePen(pen);
87 static void test_constructor_destructor2(void)
91 GpBrush *brush = NULL;
94 status = GdipCreatePen2(NULL, 10.0f, UnitPixel, &pen);
95 expect(InvalidParameter, status);
96 ok(pen == NULL, "Expected pen to be NULL\n");
103 status = GdipCreateLineBrush(&points[0], &points[1], (ARGB)0xffff00ff,
104 (ARGB)0xff0000ff, WrapModeTile, (GpLineGradient **)&brush);
106 ok(brush != NULL, "Expected brush to be initialized\n");
108 status = GdipCreatePen2(brush, 10.0f, UnitPixel, &pen);
110 ok(pen != NULL, "Expected pen to be initialized\n");
112 status = GdipDeletePen(pen);
115 status = GdipDeleteBrush(brush);
119 static void test_brushfill(void)
123 GpBrush *brush, *brush2;
128 GdipCreatePen1(0xdeadbeef, 4.5, UnitWorld, &pen);
129 status = GdipGetPenBrushFill(pen, &brush);
131 GdipGetBrushType(brush, &type);
132 expect(BrushTypeSolidColor, type);
133 GdipGetPenColor(pen, &color);
134 expect(0xdeadbeef, color);
135 GdipDeleteBrush(brush);
137 /* color controlled by brush */
138 GdipCreateSolidFill(0xabaddeed, (GpSolidFill**)&brush);
139 status = GdipSetPenBrushFill(pen, brush);
141 GdipGetPenColor(pen, &color);
142 expect(0xabaddeed, color);
143 GdipDeleteBrush(brush);
146 /* get returns a clone, not a reference */
147 GdipGetPenBrushFill(pen, &brush);
148 GdipSetSolidFillColor((GpSolidFill*)brush, 0xbeadfeed);
149 GdipGetPenBrushFill(pen, &brush2);
150 ok(brush != brush2, "Expected to get a clone, not a copy of the reference\n");
151 GdipGetSolidFillColor((GpSolidFill*)brush2, &color);
152 expect(0xabaddeed, color);
153 GdipDeleteBrush(brush);
154 GdipDeleteBrush(brush2);
156 /* brush cannot be NULL */
157 status = GdipSetPenBrushFill(pen, NULL);
158 expect(InvalidParameter, status);
163 static void test_dasharray(void)
170 GdipCreatePen1(0xdeadbeef, 10.0, UnitWorld, &pen);
178 dashes[7] = dashes[8] = dashes[9] = dashes[10] = dashes[11] = 0.0;
180 /* setting the array sets the type to custom */
181 GdipGetPenDashStyle(pen, &style);
182 expect(DashStyleSolid, style);
183 status = GdipSetPenDashArray(pen, dashes, 2);
185 GdipGetPenDashStyle(pen, &style);
186 expect(DashStyleCustom, style);
188 /* Getting the array on a non-custom pen returns invalid parameter (unless
189 * you are getting 0 elements).*/
190 GdipSetPenDashStyle(pen, DashStyleSolid);
191 status = GdipGetPenDashArray(pen, &dashes[5], 2);
192 expect(InvalidParameter, status);
193 status = GdipGetPenDashArray(pen, &dashes[5], 0);
196 /* What does setting DashStyleCustom do to the array length? */
197 GdipSetPenDashArray(pen, dashes, 2);
198 GdipSetPenDashStyle(pen, DashStyleCustom);
199 status = GdipGetPenDashArray(pen, &dashes[5], 2);
201 expectf(10.0, dashes[5]);
202 expectf(11.0, dashes[6]);
204 /* Set the array, then get with different sized buffers. */
205 status = GdipSetPenDashArray(pen, dashes, 5);
209 status = GdipGetPenDashArray(pen, &dashes[5], 1);
210 expect(Ok, status); /* not InsufficientBuffer! */
211 expectf(10.0, dashes[5]);
212 expectf(-100.0, dashes[6]);
214 status = GdipGetPenDashArray(pen, &dashes[5], 6);
215 expect(InvalidParameter, status); /* not Ok! */
216 expectf(-100.0, dashes[5]);
217 expectf(-100.0, dashes[6]);
219 /* Some invalid array values. */
220 status = GdipSetPenDashArray(pen, &dashes[7], 5);
221 expect(InvalidParameter, status);
223 status = GdipSetPenDashArray(pen, &dashes[7], 5);
224 expect(InvalidParameter, status);
226 /* Try to set with count = 0. */
227 GdipSetPenDashStyle(pen, DashStyleDot);
228 status = GdipSetPenDashArray(pen, dashes, 0);
229 ok(status == OutOfMemory || status == InvalidParameter,
230 "Expected OutOfMemory or InvalidParameter, got %.8x\n", status);
231 GdipGetPenDashStyle(pen, &style);
232 expect(DashStyleDot, style);
237 static void test_customcap(void)
241 GpCustomLineCap *custom;
243 status = GdipCreatePen1((ARGB)0xffff00ff, 10.0f, UnitPixel, &pen);
247 status = GdipGetPenCustomStartCap(NULL, NULL);
248 expect(InvalidParameter, status);
249 status = GdipGetPenCustomStartCap(pen, NULL);
250 expect(InvalidParameter, status);
251 status = GdipGetPenCustomStartCap(NULL, &custom);
252 expect(InvalidParameter, status);
254 status = GdipGetPenCustomEndCap(NULL, NULL);
255 expect(InvalidParameter, status);
256 status = GdipGetPenCustomEndCap(pen, NULL);
257 expect(InvalidParameter, status);
258 status = GdipGetPenCustomEndCap(NULL, &custom);
259 expect(InvalidParameter, status);
261 /* native crashes on pen == NULL, custom != NULL */
262 status = GdipSetPenCustomStartCap(NULL, NULL);
263 expect(InvalidParameter, status);
264 status = GdipSetPenCustomStartCap(pen, NULL);
265 expect(InvalidParameter, status);
267 status = GdipSetPenCustomEndCap(NULL, NULL);
268 expect(InvalidParameter, status);
269 status = GdipSetPenCustomEndCap(pen, NULL);
270 expect(InvalidParameter, status);
272 /* get without setting previously */
273 custom = (GpCustomLineCap*)0xdeadbeef;
274 status = GdipGetPenCustomEndCap(pen, &custom);
276 ok(custom == NULL,"Expect CustomCap == NULL\n");
278 custom = (GpCustomLineCap*)0xdeadbeef;
279 status = GdipGetPenCustomStartCap(pen, &custom);
281 ok(custom == NULL,"Expect CustomCap == NULL\n");
286 static void test_penfilltype(void)
290 GpLineGradient *line;
296 status = GdipGetPenFillType(NULL, NULL);
297 expect(InvalidParameter, status);
299 status = GdipCreatePen1((ARGB)0xffff00ff, 10.0f, UnitPixel, &pen);
301 status = GdipGetPenFillType(pen, NULL);
302 expect(InvalidParameter, status);
304 /* created with GdipCreatePen1() */
305 status = GdipGetPenFillType(pen, &type);
307 expect(PenTypeSolidColor, type);
310 /* based on SolidBrush */
311 status = GdipCreateSolidFill((ARGB)0xffff00ff, &solid);
313 status = GdipCreatePen2((GpBrush*)solid, 10.0f, UnitPixel, &pen);
315 status = GdipGetPenFillType(pen, &type);
317 expect(PenTypeSolidColor, type);
319 GdipDeleteBrush((GpBrush*)solid);
321 /* based on LinearGradientBrush */
324 status = GdipCreateLineBrush(&a, &b, (ARGB)0xffff00ff, (ARGB)0xffff0000,
325 WrapModeTile, &line);
327 status = GdipCreatePen2((GpBrush*)line, 10.0f, UnitPixel, &pen);
329 status = GdipGetPenFillType(pen, &type);
331 expect(PenTypeLinearGradient, type);
333 GdipDeleteBrush((GpBrush*)line);
336 static void test_compoundarray(void)
340 static const REAL testvalues[] = {0.2, 0.4, 0.6, 0.8};
342 status = GdipSetPenCompoundArray(NULL, testvalues, 4);
343 expect(InvalidParameter, status);
345 status = GdipCreatePen1((ARGB)0xffff00ff, 10.0f, UnitPixel, &pen);
348 status = GdipSetPenCompoundArray(pen, NULL, 4);
349 expect(InvalidParameter, status);
350 status = GdipSetPenCompoundArray(pen, testvalues, 3);
351 expect(InvalidParameter, status);
352 status = GdipSetPenCompoundArray(pen, testvalues, 0);
353 expect(InvalidParameter, status);
354 status = GdipSetPenCompoundArray(pen, testvalues, -2);
355 expect(InvalidParameter, status);
357 status = GdipSetPenCompoundArray(pen, testvalues, 4);
358 todo_wine expect(Ok, status);
365 struct GdiplusStartupInput gdiplusStartupInput;
366 ULONG_PTR gdiplusToken;
370 gdiplusStartupInput.GdiplusVersion = 1;
371 gdiplusStartupInput.DebugEventCallback = NULL;
372 gdiplusStartupInput.SuppressBackgroundThread = 0;
373 gdiplusStartupInput.SuppressExternalCodecs = 0;
375 GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
377 test_constructor_destructor();
378 test_constructor_destructor2();
383 test_compoundarray();
385 GdiplusShutdown(gdiplusToken);