2 * Unit test suite for brushes
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
23 #include "wine/test.h"
26 #define expect(expected, got) ok(got == expected, "Expected %.8x, got %.8x\n", expected, got)
27 #define expectf(expected, got) ok(fabs(expected - got) < 0.0001, "Expected %.2f, got %.2f\n", expected, got)
29 static void test_constructor_destructor(void)
32 GpSolidFill
*brush
= NULL
;
34 status
= GdipCreateSolidFill((ARGB
)0xdeadbeef, &brush
);
36 ok(brush
!= NULL
, "Expected brush to be initialized\n");
38 status
= GdipDeleteBrush(NULL
);
39 expect(InvalidParameter
, status
);
41 status
= GdipDeleteBrush((GpBrush
*) brush
);
45 static void test_type(void)
49 GpSolidFill
*brush
= NULL
;
51 GdipCreateSolidFill((ARGB
)0xdeadbeef, &brush
);
53 status
= GdipGetBrushType((GpBrush
*)brush
, &bt
);
55 expect(BrushTypeSolidColor
, bt
);
57 GdipDeleteBrush((GpBrush
*) brush
);
59 static GpPointF blendcount_ptf
[] = {{0.0, 0.0},
61 static void test_gradientblendcount(void)
64 GpPathGradient
*brush
;
67 status
= GdipCreatePathGradient(blendcount_ptf
, 2, WrapModeClamp
, &brush
);
70 status
= GdipGetPathGradientBlendCount(NULL
, NULL
);
71 expect(InvalidParameter
, status
);
72 status
= GdipGetPathGradientBlendCount(NULL
, &count
);
73 expect(InvalidParameter
, status
);
74 status
= GdipGetPathGradientBlendCount(brush
, NULL
);
75 expect(InvalidParameter
, status
);
77 status
= GdipGetPathGradientBlendCount(brush
, &count
);
81 GdipDeleteBrush((GpBrush
*) brush
);
84 static GpPointF getblend_ptf
[] = {{0.0, 0.0},
86 static void test_getblend(void)
89 GpPathGradient
*brush
;
93 status
= GdipCreatePathGradient(getblend_ptf
, 2, WrapModeClamp
, &brush
);
96 /* check some invalid parameters combinations */
97 status
= GdipGetPathGradientBlend(NULL
, NULL
, NULL
, -1);
98 expect(InvalidParameter
, status
);
99 status
= GdipGetPathGradientBlend(brush
,NULL
, NULL
, -1);
100 expect(InvalidParameter
, status
);
101 status
= GdipGetPathGradientBlend(NULL
, blends
,NULL
, -1);
102 expect(InvalidParameter
, status
);
103 status
= GdipGetPathGradientBlend(NULL
, NULL
, pos
, -1);
104 expect(InvalidParameter
, status
);
105 status
= GdipGetPathGradientBlend(NULL
, NULL
, NULL
, 1);
106 expect(InvalidParameter
, status
);
108 blends
[0] = (REAL
)0xdeadbeef;
109 pos
[0] = (REAL
)0xdeadbeef;
110 status
= GdipGetPathGradientBlend(brush
, blends
, pos
, 1);
112 expectf(1.0, blends
[0]);
113 expectf((REAL
)0xdeadbeef, pos
[0]);
115 GdipDeleteBrush((GpBrush
*) brush
);
118 static GpPointF getbounds_ptf
[] = {{0.0, 20.0},
122 static void test_getbounds(void)
125 GpPathGradient
*brush
;
128 status
= GdipCreatePathGradient(getbounds_ptf
, 4, WrapModeClamp
, &brush
);
131 status
= GdipGetPathGradientRect(NULL
, NULL
);
132 expect(InvalidParameter
, status
);
133 status
= GdipGetPathGradientRect(brush
, NULL
);
134 expect(InvalidParameter
, status
);
135 status
= GdipGetPathGradientRect(NULL
, &bounds
);
136 expect(InvalidParameter
, status
);
138 status
= GdipGetPathGradientRect(brush
, &bounds
);
140 expectf(0.0, bounds
.X
);
141 expectf(20.0, bounds
.Y
);
142 expectf(50.0, bounds
.Width
);
143 expectf(30.0, bounds
.Height
);
145 GdipDeleteBrush((GpBrush
*) brush
);
148 static void test_getgamma(void)
151 GpLineGradient
*line
;
155 start
.X
= start
.Y
= 0.0;
156 end
.X
= end
.Y
= 100.0;
158 status
= GdipCreateLineBrush(&start
, &end
, (ARGB
)0xdeadbeef, 0xdeadbeef, WrapModeTile
, &line
);
162 status
= GdipGetLineGammaCorrection(NULL
, NULL
);
163 expect(InvalidParameter
, status
);
164 status
= GdipGetLineGammaCorrection(line
, NULL
);
165 expect(InvalidParameter
, status
);
166 status
= GdipGetLineGammaCorrection(NULL
, &gamma
);
167 expect(InvalidParameter
, status
);
169 GdipDeleteBrush((GpBrush
*)line
);
172 static void test_transform(void)
176 GpGraphics
*graphics
= NULL
;
182 status
= GdipCreateMatrix2(2.0, 0.0, 0.0, 0.0, 0.0, 0.0, &m
);
185 status
= GdipCreateFromHDC(hdc
, &graphics
);
187 status
= GdipCreateBitmapFromGraphics(1, 1, graphics
, &bitmap
);
190 status
= GdipCreateTexture((GpImage
*)bitmap
, WrapModeTile
, &texture
);
194 status
= GdipGetTextureTransform(NULL
, NULL
);
195 expect(InvalidParameter
, status
);
196 status
= GdipGetTextureTransform(texture
, NULL
);
197 expect(InvalidParameter
, status
);
199 /* get default value - identity matrix */
200 status
= GdipGetTextureTransform(texture
, m
);
202 status
= GdipIsMatrixIdentity(m
, &res
);
205 /* set and get then */
206 status
= GdipCreateMatrix2(2.0, 0.0, 0.0, 2.0, 0.0, 0.0, &m1
);
208 status
= GdipSetTextureTransform(texture
, m1
);
210 status
= GdipGetTextureTransform(texture
, m
);
212 status
= GdipIsMatrixEqual(m
, m1
, &res
);
216 status
= GdipResetTextureTransform(texture
);
218 status
= GdipGetTextureTransform(texture
, m
);
220 status
= GdipIsMatrixIdentity(m
, &res
);
224 status
= GdipDeleteBrush((GpBrush
*)texture
);
227 status
= GdipDeleteMatrix(m1
);
229 status
= GdipDeleteMatrix(m
);
231 status
= GdipDisposeImage((GpImage
*)bitmap
);
233 status
= GdipDeleteGraphics(graphics
);
238 static void test_texturewrap(void)
242 GpGraphics
*graphics
= NULL
;
247 status
= GdipCreateFromHDC(hdc
, &graphics
);
249 status
= GdipCreateBitmapFromGraphics(1, 1, graphics
, &bitmap
);
252 status
= GdipCreateTexture((GpImage
*)bitmap
, WrapModeTile
, &texture
);
256 status
= GdipGetTextureWrapMode(NULL
, NULL
);
257 expect(InvalidParameter
, status
);
258 status
= GdipGetTextureWrapMode(texture
, NULL
);
259 expect(InvalidParameter
, status
);
260 status
= GdipGetTextureWrapMode(NULL
, &wrap
);
261 expect(InvalidParameter
, status
);
264 wrap
= WrapModeClamp
;
265 status
= GdipGetTextureWrapMode(texture
, &wrap
);
267 expect(WrapModeTile
, wrap
);
269 wrap
= WrapModeClamp
;
270 status
= GdipSetTextureWrapMode(texture
, wrap
);
273 status
= GdipGetTextureWrapMode(texture
, &wrap
);
275 expect(WrapModeClamp
, wrap
);
277 status
= GdipDeleteBrush((GpBrush
*)texture
);
279 status
= GdipDisposeImage((GpImage
*)bitmap
);
281 status
= GdipDeleteGraphics(graphics
);
286 static void test_gradientgetrect(void)
288 GpLineGradient
*brush
;
294 pt2
.X
= pt2
.Y
= 100.0;
295 status
= GdipCreateLineBrush(&pt1
, &pt2
, 0, 0, WrapModeTile
, &brush
);
297 memset(&rectf
, 0, sizeof(GpRectF
));
298 status
= GdipGetLineRect(brush
, &rectf
);
300 expectf(1.0, rectf
.X
);
301 expectf(1.0, rectf
.Y
);
302 expectf(99.0, rectf
.Width
);
303 expectf(99.0, rectf
.Height
);
304 status
= GdipDeleteBrush((GpBrush
*)brush
);
305 /* vertical gradient */
306 pt1
.X
= pt1
.Y
= pt2
.X
= 0.0;
308 status
= GdipCreateLineBrush(&pt1
, &pt2
, 0, 0, WrapModeTile
, &brush
);
310 memset(&rectf
, 0, sizeof(GpRectF
));
311 status
= GdipGetLineRect(brush
, &rectf
);
313 expectf(-5.0, rectf
.X
);
314 expectf(0.0, rectf
.Y
);
315 expectf(10.0, rectf
.Width
);
316 expectf(10.0, rectf
.Height
);
317 status
= GdipDeleteBrush((GpBrush
*)brush
);
318 /* horizontal gradient */
319 pt1
.X
= pt1
.Y
= pt2
.Y
= 0.0;
321 status
= GdipCreateLineBrush(&pt1
, &pt2
, 0, 0, WrapModeTile
, &brush
);
323 memset(&rectf
, 0, sizeof(GpRectF
));
324 status
= GdipGetLineRect(brush
, &rectf
);
326 expectf(0.0, rectf
.X
);
327 expectf(-5.0, rectf
.Y
);
328 expectf(10.0, rectf
.Width
);
329 expectf(10.0, rectf
.Height
);
330 status
= GdipDeleteBrush((GpBrush
*)brush
);
335 status
= GdipCreateLineBrush(&pt1
, &pt2
, 0, 0, WrapModeTile
, &brush
);
337 memset(&rectf
, 0, sizeof(GpRectF
));
338 status
= GdipGetLineRect(brush
, &rectf
);
340 expectf(0.0, rectf
.X
);
341 expectf(-20.0, rectf
.Y
);
342 expectf(20.0, rectf
.Width
);
343 expectf(20.0, rectf
.Height
);
344 status
= GdipDeleteBrush((GpBrush
*)brush
);
349 status
= GdipCreateLineBrush(&pt1
, &pt2
, 0, 0, WrapModeTile
, &brush
);
351 memset(&rectf
, 0, sizeof(GpRectF
));
352 status
= GdipGetLineRect(brush
, &rectf
);
354 expectf(0.0, rectf
.X
);
355 expectf(0.0, rectf
.Y
);
356 expectf(100.0, rectf
.Width
);
357 expectf(1.0, rectf
.Height
);
358 status
= GdipDeleteBrush((GpBrush
*)brush
);
359 /* from rect with LinearGradientModeHorizontal */
360 rectf
.X
= rectf
.Y
= 10.0;
361 rectf
.Width
= rectf
.Height
= 100.0;
362 status
= GdipCreateLineBrushFromRect(&rectf
, 0, 0, LinearGradientModeHorizontal
,
363 WrapModeTile
, &brush
);
365 memset(&rectf
, 0, sizeof(GpRectF
));
366 status
= GdipGetLineRect(brush
, &rectf
);
368 expectf(10.0, rectf
.X
);
369 expectf(10.0, rectf
.Y
);
370 expectf(100.0, rectf
.Width
);
371 expectf(100.0, rectf
.Height
);
372 status
= GdipDeleteBrush((GpBrush
*)brush
);
373 /* passing negative Width/Height to LinearGradientModeHorizontal */
374 rectf
.X
= rectf
.Y
= 10.0;
375 rectf
.Width
= rectf
.Height
= -100.0;
376 status
= GdipCreateLineBrushFromRect(&rectf
, 0, 0, LinearGradientModeHorizontal
,
377 WrapModeTile
, &brush
);
379 memset(&rectf
, 0, sizeof(GpRectF
));
380 status
= GdipGetLineRect(brush
, &rectf
);
382 expectf(10.0, rectf
.X
);
383 expectf(10.0, rectf
.Y
);
384 expectf(-100.0, rectf
.Width
);
385 expectf(-100.0, rectf
.Height
);
386 status
= GdipDeleteBrush((GpBrush
*)brush
);
389 static void test_lineblend(void)
391 GpLineGradient
*brush
;
396 const REAL factors
[5] = {0.0f
, 0.1f
, 0.5f
, 0.9f
, 1.0f
};
397 const REAL positions
[5] = {0.0f
, 0.2f
, 0.5f
, 0.8f
, 1.0f
};
398 const REAL two_positions
[2] = {0.0f
, 1.0f
};
399 const ARGB colors
[5] = {0xff0000ff, 0xff00ff00, 0xff00ffff, 0xffff0000, 0xffffffff};
400 REAL res_factors
[6] = {0.3f
, 0.0f
, 0.0f
, 0.0f
, 0.0f
};
401 REAL res_positions
[6] = {0.3f
, 0.0f
, 0.0f
, 0.0f
, 0.0f
};
402 ARGB res_colors
[6] = {0xdeadbeef, 0, 0, 0, 0};
405 pt2
.X
= pt2
.Y
= 100.0;
406 status
= GdipCreateLineBrush(&pt1
, &pt2
, 0, 0, WrapModeTile
, &brush
);
409 status
= GdipGetLineBlendCount(NULL
, &count
);
410 expect(InvalidParameter
, status
);
412 status
= GdipGetLineBlendCount(brush
, NULL
);
413 expect(InvalidParameter
, status
);
415 status
= GdipGetLineBlendCount(brush
, &count
);
419 status
= GdipGetLineBlend(NULL
, res_factors
, res_positions
, 1);
420 expect(InvalidParameter
, status
);
422 status
= GdipGetLineBlend(brush
, NULL
, res_positions
, 1);
423 expect(InvalidParameter
, status
);
425 status
= GdipGetLineBlend(brush
, res_factors
, NULL
, 1);
426 expect(InvalidParameter
, status
);
428 status
= GdipGetLineBlend(brush
, res_factors
, res_positions
, 0);
429 expect(InvalidParameter
, status
);
431 status
= GdipGetLineBlend(brush
, res_factors
, res_positions
, -1);
432 expect(InvalidParameter
, status
);
434 status
= GdipGetLineBlend(brush
, res_factors
, res_positions
, 1);
437 status
= GdipGetLineBlend(brush
, res_factors
, res_positions
, 2);
440 status
= GdipSetLineBlend(NULL
, factors
, positions
, 5);
441 expect(InvalidParameter
, status
);
443 status
= GdipSetLineBlend(brush
, NULL
, positions
, 5);
444 expect(InvalidParameter
, status
);
446 status
= GdipSetLineBlend(brush
, factors
, NULL
, 5);
447 expect(InvalidParameter
, status
);
449 status
= GdipSetLineBlend(brush
, factors
, positions
, 0);
450 expect(InvalidParameter
, status
);
452 status
= GdipSetLineBlend(brush
, factors
, positions
, -1);
453 expect(InvalidParameter
, status
);
455 /* leave off the 0.0 position */
456 status
= GdipSetLineBlend(brush
, &factors
[1], &positions
[1], 4);
457 expect(InvalidParameter
, status
);
459 /* leave off the 1.0 position */
460 status
= GdipSetLineBlend(brush
, factors
, positions
, 4);
461 expect(InvalidParameter
, status
);
463 status
= GdipSetLineBlend(brush
, factors
, positions
, 5);
466 status
= GdipGetLineBlendCount(brush
, &count
);
470 status
= GdipGetLineBlend(brush
, res_factors
, res_positions
, 4);
471 expect(InsufficientBuffer
, status
);
473 status
= GdipGetLineBlend(brush
, res_factors
, res_positions
, 5);
478 expectf(factors
[i
], res_factors
[i
]);
479 expectf(positions
[i
], res_positions
[i
]);
482 status
= GdipGetLineBlend(brush
, res_factors
, res_positions
, 6);
485 status
= GdipSetLineBlend(brush
, factors
, positions
, 1);
488 status
= GdipGetLineBlendCount(brush
, &count
);
492 status
= GdipGetLineBlend(brush
, res_factors
, res_positions
, 1);
495 status
= GdipGetLinePresetBlendCount(NULL
, &count
);
496 expect(InvalidParameter
, status
);
498 status
= GdipGetLinePresetBlendCount(brush
, NULL
);
499 expect(InvalidParameter
, status
);
501 status
= GdipGetLinePresetBlendCount(brush
, &count
);
505 status
= GdipGetLinePresetBlend(NULL
, res_colors
, res_positions
, 1);
506 expect(InvalidParameter
, status
);
508 status
= GdipGetLinePresetBlend(brush
, NULL
, res_positions
, 1);
509 expect(InvalidParameter
, status
);
511 status
= GdipGetLinePresetBlend(brush
, res_colors
, NULL
, 1);
512 expect(InvalidParameter
, status
);
514 status
= GdipGetLinePresetBlend(brush
, res_colors
, res_positions
, 0);
515 expect(InvalidParameter
, status
);
517 status
= GdipGetLinePresetBlend(brush
, res_colors
, res_positions
, -1);
518 expect(InvalidParameter
, status
);
520 status
= GdipGetLinePresetBlend(brush
, res_colors
, res_positions
, 1);
521 expect(InvalidParameter
, status
);
523 status
= GdipGetLinePresetBlend(brush
, res_colors
, res_positions
, 2);
524 expect(GenericError
, status
);
526 status
= GdipSetLinePresetBlend(NULL
, colors
, positions
, 5);
527 expect(InvalidParameter
, status
);
529 status
= GdipSetLinePresetBlend(brush
, NULL
, positions
, 5);
530 expect(InvalidParameter
, status
);
532 status
= GdipSetLinePresetBlend(brush
, colors
, NULL
, 5);
533 expect(InvalidParameter
, status
);
535 status
= GdipSetLinePresetBlend(brush
, colors
, positions
, 0);
536 expect(InvalidParameter
, status
);
538 status
= GdipSetLinePresetBlend(brush
, colors
, positions
, -1);
539 expect(InvalidParameter
, status
);
541 status
= GdipSetLinePresetBlend(brush
, colors
, positions
, 1);
542 expect(InvalidParameter
, status
);
544 /* leave off the 0.0 position */
545 status
= GdipSetLinePresetBlend(brush
, &colors
[1], &positions
[1], 4);
546 expect(InvalidParameter
, status
);
548 /* leave off the 1.0 position */
549 status
= GdipSetLinePresetBlend(brush
, colors
, positions
, 4);
550 expect(InvalidParameter
, status
);
552 status
= GdipSetLinePresetBlend(brush
, colors
, positions
, 5);
555 status
= GdipGetLinePresetBlendCount(brush
, &count
);
559 status
= GdipGetLinePresetBlend(brush
, res_colors
, res_positions
, 4);
560 expect(InsufficientBuffer
, status
);
562 status
= GdipGetLinePresetBlend(brush
, res_colors
, res_positions
, 5);
567 expect(colors
[i
], res_colors
[i
]);
568 expectf(positions
[i
], res_positions
[i
]);
571 status
= GdipGetLinePresetBlend(brush
, res_colors
, res_positions
, 6);
574 status
= GdipSetLinePresetBlend(brush
, colors
, two_positions
, 2);
577 status
= GdipDeleteBrush((GpBrush
*)brush
);
581 static void test_linelinearblend(void)
583 GpLineGradient
*brush
;
587 REAL res_factors
[3] = {0.3f
};
588 REAL res_positions
[3] = {0.3f
};
590 status
= GdipSetLineLinearBlend(NULL
, 0.6, 0.8);
591 expect(InvalidParameter
, status
);
594 pt2
.X
= pt2
.Y
= 100.0;
595 status
= GdipCreateLineBrush(&pt1
, &pt2
, 0, 0, WrapModeTile
, &brush
);
599 status
= GdipSetLineLinearBlend(brush
, 0.6, 0.8);
602 status
= GdipGetLineBlendCount(brush
, &count
);
606 status
= GdipGetLineBlend(brush
, res_factors
, res_positions
, 3);
608 expectf(0.0, res_factors
[0]);
609 expectf(0.0, res_positions
[0]);
610 expectf(0.8, res_factors
[1]);
611 expectf(0.6, res_positions
[1]);
612 expectf(0.0, res_factors
[2]);
613 expectf(1.0, res_positions
[2]);
616 status
= GdipSetLineLinearBlend(brush
, 0.0, 0.8);
619 status
= GdipGetLineBlendCount(brush
, &count
);
623 status
= GdipGetLineBlend(brush
, res_factors
, res_positions
, 3);
625 expectf(0.8, res_factors
[0]);
626 expectf(0.0, res_positions
[0]);
627 expectf(0.0, res_factors
[1]);
628 expectf(1.0, res_positions
[1]);
631 status
= GdipSetLineLinearBlend(brush
, 1.0, 0.8);
634 status
= GdipGetLineBlendCount(brush
, &count
);
638 status
= GdipGetLineBlend(brush
, res_factors
, res_positions
, 3);
640 expectf(0.0, res_factors
[0]);
641 expectf(0.0, res_positions
[0]);
642 expectf(0.8, res_factors
[1]);
643 expectf(1.0, res_positions
[1]);
645 status
= GdipDeleteBrush((GpBrush
*)brush
);
649 static void test_gradientsurroundcolorcount(void)
652 GpPathGradient
*grad
;
656 status
= GdipCreatePathGradient(blendcount_ptf
, 2, WrapModeClamp
, &grad
);
659 color
= GdipAlloc(sizeof(ARGB
[3]));
661 status
= GdipSetPathGradientSurroundColorsWithCount(grad
, color
, &count
);
662 expect(InvalidParameter
, status
);
667 color
= GdipAlloc(sizeof(ARGB
[2]));
669 color
[0] = 0x00ff0000;
670 color
[1] = 0x0000ff00;
672 status
= GdipSetPathGradientSurroundColorsWithCount(NULL
, color
, &count
);
673 expect(InvalidParameter
, status
);
675 status
= GdipSetPathGradientSurroundColorsWithCount(grad
, NULL
, &count
);
676 expect(InvalidParameter
, status
);
678 /* WinXP crashes on this test */
681 status
= GdipSetPathGradientSurroundColorsWithCount(grad
, color
, NULL
);
682 expect(InvalidParameter
, status
);
685 status
= GdipSetPathGradientSurroundColorsWithCount(grad
, color
, &count
);
686 todo_wine
expect(Ok
, status
);
689 status
= GdipGetPathGradientSurroundColorCount(NULL
, &count
);
690 expect(InvalidParameter
, status
);
692 status
= GdipGetPathGradientSurroundColorCount(grad
, NULL
);
693 expect(InvalidParameter
, status
);
696 status
= GdipGetPathGradientSurroundColorCount(grad
, &count
);
697 todo_wine
expect(Ok
, status
);
698 todo_wine
expect(2, count
);
701 GdipDeleteBrush((GpBrush
*)grad
);
706 struct GdiplusStartupInput gdiplusStartupInput
;
707 ULONG_PTR gdiplusToken
;
709 gdiplusStartupInput
.GdiplusVersion
= 1;
710 gdiplusStartupInput
.DebugEventCallback
= NULL
;
711 gdiplusStartupInput
.SuppressBackgroundThread
= 0;
712 gdiplusStartupInput
.SuppressExternalCodecs
= 0;
714 GdiplusStartup(&gdiplusToken
, &gdiplusStartupInput
, NULL
);
716 test_constructor_destructor();
718 test_gradientblendcount();
724 test_gradientgetrect();
726 test_linelinearblend();
727 test_gradientsurroundcolorcount();
729 GdiplusShutdown(gdiplusToken
);