1 #ifdef WIN32
2 #ifndef __cplusplus
3 #error Please compile with a C++ compiler.
4 #endif
5 #endif
6 
7 #if defined(USE_WINDOWS_GDIPLUS)
8 #include <Windows.h>
9 #include <GdiPlus.h>
10 
11 #pragma comment(lib, "gdiplus.lib")
12 #else
13 #include <GdiPlusFlat.h>
14 #endif
15 
16 #if defined(USE_WINDOWS_GDIPLUS)
17 using namespace Gdiplus;
18 using namespace DllExports;
19 #endif
20 
21 #include <assert.h>
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include "testhelpers.h"
25 
test_clone()26 static void test_clone ()
27 {
28     GpStatus status;
29     GpSolidFill *brush;
30     GpBrushType brushType;
31     GpBrush *clone;
32     ARGB solidColor;
33 
34     status = GdipCreateSolidFill (0x010203040, &brush);
35     assertEqualInt (status, Ok);
36 
37     status = GdipCloneBrush ((GpBrush *) brush, &clone);
38     assertEqualInt (status, Ok);
39     assert (clone && brush != clone);
40 
41     status = GdipGetBrushType (clone, &brushType);
42     assertEqualInt (status, Ok);
43     assertEqualInt (brushType, BrushTypeSolidColor);
44 
45     status = GdipGetSolidFillColor ((GpSolidFill *) clone, &solidColor);
46     assertEqualInt (status, Ok);
47     assertEqualARGB (solidColor, 0x010203040);
48 
49     GdipDeleteBrush ((GpBrush *) brush);
50     GdipDeleteBrush (clone);
51 }
52 
test_delete()53 static void test_delete ()
54 {
55     GpStatus status;
56     GpSolidFill *brush;
57 
58     status = GdipCreateSolidFill (0x010203040, &brush);
59     assertEqualInt (status, Ok);
60 
61     status =  GdipDeleteBrush ((GpBrush *) brush);
62     assertEqualInt (status, Ok);
63 }
64 
test_createSolidFill()65 static void test_createSolidFill ()
66 {
67     GpStatus status;
68     GpSolidFill *brush;
69     GpBrushType brushType;
70     ARGB color;
71 
72     status = GdipCreateSolidFill (0x010203040, &brush);
73     assertEqualInt (status, Ok);
74     assert (brush && "Expected the brush to be initialized.");
75 
76     status = GdipGetBrushType ((GpBrush *) brush, &brushType);
77     assertEqualInt (status, Ok);
78     assertEqualInt (brushType, BrushTypeSolidColor);
79 
80     status = GdipGetSolidFillColor (brush, &color);
81     assertEqualInt (status, Ok);
82     assertEqualARGB (color, 0x010203040);
83 
84     GdipDeleteBrush ((GpBrush *) brush);
85 
86     // Negative tests.
87     status = GdipCreateSolidFill (0x010203040, NULL);
88     assertEqualInt (status, InvalidParameter);
89 }
90 
test_getSolidFillColor()91 static void test_getSolidFillColor ()
92 {
93     GpStatus status;
94     GpSolidFill *brush;
95     ARGB color;
96 
97     status = GdipCreateSolidFill (0xFF000000, &brush);
98     assertEqualInt (status, Ok);
99 
100     // Negative tests.
101     status = GdipGetSolidFillColor (NULL, &color);
102     assertEqualInt (status, InvalidParameter);
103 
104     status = GdipGetSolidFillColor (brush, NULL);
105     assertEqualInt (status, InvalidParameter);
106 
107     GdipDeleteBrush ((GpBrush *) brush);
108 }
109 
test_setSolidFillColor()110 static void test_setSolidFillColor ()
111 {
112     GpStatus status;
113     GpSolidFill *brush;
114     ARGB color;
115 
116     status = GdipCreateSolidFill (0xFF000000, &brush);
117     assertEqualInt (status, Ok);
118 
119     // Set new.
120     status = GdipSetSolidFillColor (brush, 0x010203040);
121     assertEqualInt (status, Ok);
122 
123     status = GdipGetSolidFillColor (brush, &color);
124     assertEqualInt (status, Ok);
125     assertEqualARGB (color, 0x010203040);
126 
127     // Set same.
128     status = GdipSetSolidFillColor (brush, 0x010203040);
129     assertEqualInt (status, Ok);
130 
131     status = GdipGetSolidFillColor (brush, &color);
132     assertEqualInt (status, Ok);
133     assertEqualARGB (color, 0x010203040);
134 
135     // Negative tests.
136     status = GdipSetSolidFillColor (NULL, 0x010203040);
137     assertEqualInt (status, InvalidParameter);
138 
139     GdipDeleteBrush ((GpBrush *) brush);
140 }
141 
test_fill()142 static void test_fill ()
143 {
144     GpStatus status;
145     GpSolidFill *brush;
146     GpBitmap *bitmap;
147     GpGraphics *graphics;
148     ARGB color;
149 
150     status = GdipCreateSolidFill (0xDDA03040, &brush);
151     assertEqualInt (status, Ok);
152 
153 	// PixelFormat32bppARGB.
154     status = GdipCreateBitmapFromScan0 (256, 256, 0, PixelFormat32bppARGB, NULL, &bitmap);
155     assertEqualInt (status, Ok);
156 
157     status = GdipGetImageGraphicsContext ((GpImage *) bitmap, &graphics);
158     assertEqualInt (status, Ok);
159 
160     status = GdipBitmapSetPixel (bitmap, 0, 0, 0x00000000);
161     assertEqualInt (status, Ok);
162 
163     // Fill with brush - CompositingModeSourceOver.
164     status = GdipSetCompositingMode (graphics, CompositingModeSourceOver);
165     assertEqualInt (status, Ok);
166 
167     status = GdipFillRectangle (graphics, brush, 0, 0, 1, 1);
168     assertEqualInt (status, Ok);
169 
170     status = GdipBitmapGetPixel (bitmap, 0, 0, &color);
171     assertEqualInt (status, Ok);
172 #if defined(USE_WINDOWS_GDIPLUS)
173     assertEqualARGB (color, 0xDDA0303F);
174 #else
175     assertEqualARGB (color, 0xDDA02F3F);
176 #endif
177 
178     status = GdipBitmapSetPixel (bitmap, 0, 0, 0x00000000);
179     assertEqualInt (status, Ok);
180 
181     // Fill with brush - unchanged, CompositingModeSourceOver.
182     status = GdipFillRectangle (graphics, brush, 0, 0, 1, 1);
183     assertEqualInt (status, Ok);
184 
185     status = GdipBitmapGetPixel (bitmap, 0, 0, &color);
186     assertEqualInt (status, Ok);
187 #if defined(USE_WINDOWS_GDIPLUS)
188     assertEqualARGB (color, 0xDDA0303F);
189 #else
190     assertEqualARGB (color, 0xDDA02F3F);
191 #endif
192 
193     status = GdipBitmapSetPixel (bitmap, 0, 0, 0x00000000);
194     assertEqualInt (status, Ok);
195 
196     // Fill with brush - changed, CompositingModeSourceOver.
197     status = GdipSetSolidFillColor (brush, 0xAABBCCDD);
198     assertEqualInt (status, Ok);
199 
200     status = GdipFillRectangle (graphics, brush, 0, 0, 1, 1);
201     assertEqualInt (status, Ok);
202 
203     status = GdipBitmapGetPixel (bitmap, 0, 0, &color);
204     assertEqualInt (status, Ok);
205     assertEqualARGB (color, 0xAABBCCDC);
206 
207     status = GdipBitmapSetPixel (bitmap, 0, 0, 0x00000000);
208     assertEqualInt (status, Ok);
209 
210     // Fill with brush - zero alpha, CompositingModeSourceOver.
211     status = GdipSetSolidFillColor (brush, 0x00BBCCDD);
212     assertEqualInt (status, Ok);
213 
214     status = GdipFillRectangle (graphics, brush, 0, 0, 1, 1);
215     assertEqualInt (status, Ok);
216 
217     status = GdipBitmapGetPixel (bitmap, 0, 0, &color);
218     assertEqualInt (status, Ok);
219     assertEqualARGB (color, 0x00000000);
220 
221     status = GdipBitmapSetPixel (bitmap, 0, 0, 0x00000000);
222     assertEqualInt (status, Ok);
223 
224     // Fill with brush - CompositingModeSourceCopy.
225     status = GdipSetSolidFillColor (brush, 0xDDA03040);
226     assertEqualInt (status, Ok);
227 
228     status = GdipSetCompositingMode (graphics, CompositingModeSourceCopy);
229     assertEqualInt (status, Ok);
230 
231     status = GdipFillRectangle (graphics, brush, 0, 0, 1, 1);
232     assertEqualInt (status, Ok);
233 
234     status = GdipBitmapGetPixel (bitmap, 0, 0, &color);
235     assertEqualInt (status, Ok);
236 #if defined(USE_WINDOWS_GDIPLUS)
237     assertEqualARGB (color, 0xDDA0303F);
238 #else
239     assertEqualARGB (color, 0xDDA02F3F);
240 #endif
241 
242     status = GdipBitmapSetPixel (bitmap, 0, 0, 0x00000000);
243     assertEqualInt (status, Ok);
244 
245     // Fill with brush - unchanged, CompositingModeSourceCopy.
246     status = GdipFillRectangle (graphics, brush, 0, 0, 1, 1);
247     assertEqualInt (status, Ok);
248 
249     status = GdipBitmapGetPixel (bitmap, 0, 0, &color);
250     assertEqualInt (status, Ok);
251 #if defined(USE_WINDOWS_GDIPLUS)
252     assertEqualARGB (color, 0xDDA0303F);
253 #else
254     assertEqualARGB (color, 0xDDA02F3F);
255 #endif
256 
257     status = GdipBitmapSetPixel (bitmap, 0, 0, 0x00000000);
258     assertEqualInt (status, Ok);
259 
260     // Fill with brush - changed, CompositingModeSourceCopy.
261     status = GdipSetSolidFillColor (brush, 0xAABBCCDD);
262     assertEqualInt (status, Ok);
263 
264     status = GdipFillRectangle (graphics, brush, 0, 0, 1, 1);
265     assertEqualInt (status, Ok);
266 
267     status = GdipBitmapGetPixel (bitmap, 0, 0, &color);
268     assertEqualInt (status, Ok);
269     assertEqualARGB (color, 0xAABBCCDC);
270 
271     status = GdipBitmapSetPixel (bitmap, 0, 0, 0x00000000);
272     assertEqualInt (status, Ok);
273 
274     // Fill with brush - zero alpha, CompositingModeSourceCopy.
275     status = GdipSetSolidFillColor (brush, 0x00BBCCDD);
276     assertEqualInt (status, Ok);
277 
278     status = GdipFillRectangle (graphics, brush, 0, 0, 1, 1);
279     assertEqualInt (status, Ok);
280 
281     status = GdipBitmapGetPixel (bitmap, 0, 0, &color);
282     assertEqualInt (status, Ok);
283     assertEqualARGB (color, 0x00000000);
284 
285     GdipDeleteGraphics (graphics);
286     GdipDisposeImage ((GpImage *) bitmap);
287 
288 	// PixelFormat32bppPARGB.
289     status = GdipCreateBitmapFromScan0 (256, 256, 0, PixelFormat32bppPARGB, NULL, &bitmap);
290     assertEqualInt (status, Ok);
291 
292     status = GdipGetImageGraphicsContext ((GpImage *) bitmap, &graphics);
293     assertEqualInt (status, Ok);
294 
295     status = GdipBitmapSetPixel (bitmap, 0, 0, 0x00000000);
296     assertEqualInt (status, Ok);
297 
298     status = GdipSetSolidFillColor (brush, 0xDDA03040);
299     assertEqualInt (status, Ok);
300 
301     // Fill with brush - CompositingModeSourceOver.
302     status = GdipSetCompositingMode (graphics, CompositingModeSourceOver);
303     assertEqualInt (status, Ok);
304 
305     status = GdipFillRectangle (graphics, brush, 0, 0, 1, 1);
306     assertEqualInt (status, Ok);
307 
308     status = GdipBitmapGetPixel (bitmap, 0, 0, &color);
309     assertEqualInt (status, Ok);
310 #if defined(USE_WINDOWS_GDIPLUS)
311     assertEqualARGB (color, 0xDDA0303F);
312 #else
313     assertEqualARGB (color, 0xDDA02F3F);
314 #endif
315 
316     status = GdipBitmapSetPixel (bitmap, 0, 0, 0x00000000);
317     assertEqualInt (status, Ok);
318 
319     // Fill with brush - unchanged, CompositingModeSourceOver.
320     status = GdipFillRectangle (graphics, brush, 0, 0, 1, 1);
321     assertEqualInt (status, Ok);
322 
323     status = GdipBitmapGetPixel (bitmap, 0, 0, &color);
324     assertEqualInt (status, Ok);
325 #if defined(USE_WINDOWS_GDIPLUS)
326     assertEqualARGB (color, 0xDDA0303F);
327 #else
328     assertEqualARGB (color, 0xDDA02F3F);
329 #endif
330 
331     status = GdipBitmapSetPixel (bitmap, 0, 0, 0x00000000);
332     assertEqualInt (status, Ok);
333 
334     // Fill with brush - changed, CompositingModeSourceOver.
335     status = GdipSetSolidFillColor (brush, 0xAABBCCDD);
336     assertEqualInt (status, Ok);
337 
338     status = GdipFillRectangle (graphics, brush, 0, 0, 1, 1);
339     assertEqualInt (status, Ok);
340 
341     status = GdipBitmapGetPixel (bitmap, 0, 0, &color);
342     assertEqualInt (status, Ok);
343     assertEqualARGB (color, 0xAABBCCDC);
344 
345     status = GdipBitmapSetPixel (bitmap, 0, 0, 0x00000000);
346     assertEqualInt (status, Ok);
347 
348     // Fill with brush - zero alpha, CompositingModeSourceOver.
349     status = GdipSetSolidFillColor (brush, 0x00BBCCDD);
350     assertEqualInt (status, Ok);
351 
352     status = GdipFillRectangle (graphics, brush, 0, 0, 1, 1);
353     assertEqualInt (status, Ok);
354 
355     status = GdipBitmapGetPixel (bitmap, 0, 0, &color);
356     assertEqualInt (status, Ok);
357     assertEqualARGB (color, 0x00000000);
358 
359     status = GdipBitmapSetPixel (bitmap, 0, 0, 0x00000000);
360     assertEqualInt (status, Ok);
361 
362     // Fill with brush - CompositingModeSourceCopy.
363     status = GdipSetSolidFillColor (brush, 0xDDA03040);
364     assertEqualInt (status, Ok);
365 
366     status = GdipSetCompositingMode (graphics, CompositingModeSourceCopy);
367     assertEqualInt (status, Ok);
368 
369     status = GdipFillRectangle (graphics, brush, 0, 0, 1, 1);
370     assertEqualInt (status, Ok);
371 
372     status = GdipBitmapGetPixel (bitmap, 0, 0, &color);
373     assertEqualInt (status, Ok);
374 #if defined(USE_WINDOWS_GDIPLUS)
375     assertEqualARGB (color, 0xDDA0303F);
376 #else
377     assertEqualARGB (color, 0xDDA02F3F);
378 #endif
379 
380     status = GdipBitmapSetPixel (bitmap, 0, 0, 0x00000000);
381     assertEqualInt (status, Ok);
382 
383     // Fill with brush - unchanged, CompositingModeSourceCopy.
384     status = GdipFillRectangle (graphics, brush, 0, 0, 1, 1);
385     assertEqualInt (status, Ok);
386 
387     status = GdipBitmapGetPixel (bitmap, 0, 0, &color);
388     assertEqualInt (status, Ok);
389 #if defined(USE_WINDOWS_GDIPLUS)
390     assertEqualARGB (color, 0xDDA0303F);
391 #else
392     assertEqualARGB (color, 0xDDA02F3F);
393 #endif
394 
395     status = GdipBitmapSetPixel (bitmap, 0, 0, 0x00000000);
396     assertEqualInt (status, Ok);
397 
398     // Fill with brush - changed, CompositingModeSourceCopy.
399     status = GdipSetSolidFillColor (brush, 0xAABBCCDD);
400     assertEqualInt (status, Ok);
401 
402     status = GdipFillRectangle (graphics, brush, 0, 0, 1, 1);
403     assertEqualInt (status, Ok);
404 
405     status = GdipBitmapGetPixel (bitmap, 0, 0, &color);
406     assertEqualInt (status, Ok);
407     assertEqualARGB (color, 0xAABBCCDC);
408 
409     status = GdipBitmapSetPixel (bitmap, 0, 0, 0x00000000);
410     assertEqualInt (status, Ok);
411 
412     // Fill with brush - zero alpha, CompositingModeSourceCopy.
413     status = GdipSetSolidFillColor (brush, 0x00BBCCDD);
414     assertEqualInt (status, Ok);
415 
416     status = GdipFillRectangle (graphics, brush, 0, 0, 1, 1);
417     assertEqualInt (status, Ok);
418 
419     status = GdipBitmapGetPixel (bitmap, 0, 0, &color);
420     assertEqualInt (status, Ok);
421     assertEqualARGB (color, 0x00000000);
422 
423     GdipDeleteGraphics (graphics);
424     GdipDisposeImage ((GpImage *) bitmap);
425 
426 	// PixelFormat32bppRGB.
427     status = GdipCreateBitmapFromScan0 (256, 256, 0, PixelFormat32bppRGB, NULL, &bitmap);
428     assertEqualInt (status, Ok);
429 
430     status = GdipGetImageGraphicsContext ((GpImage *) bitmap, &graphics);
431     assertEqualInt (status, Ok);
432 
433     status = GdipBitmapSetPixel (bitmap, 0, 0, 0x00000000);
434     assertEqualInt (status, Ok);
435 
436     status = GdipSetSolidFillColor (brush, 0xDDA03040);
437     assertEqualInt (status, Ok);
438 
439     // Fill with brush - CompositingModeSourceOver.
440     status = GdipSetCompositingMode (graphics, CompositingModeSourceOver);
441     assertEqualInt (status, Ok);
442 
443     status = GdipFillRectangle (graphics, brush, 0, 0, 1, 1);
444     assertEqualInt (status, Ok);
445 
446     status = GdipBitmapGetPixel (bitmap, 0, 0, &color);
447     assertEqualInt (status, Ok);
448 #if defined(USE_WINDOWS_GDIPLUS)
449     assertEqualARGB (color, 0xFF8B2A37);
450 #else
451     assertEqualARGB (color, 0xFF8B2937);
452 #endif
453 
454     status = GdipBitmapSetPixel (bitmap, 0, 0, 0x00000000);
455     assertEqualInt (status, Ok);
456 
457     // Fill with brush - unchanged, CompositingModeSourceOver.
458     status = GdipFillRectangle (graphics, brush, 0, 0, 1, 1);
459     assertEqualInt (status, Ok);
460 
461     status = GdipBitmapGetPixel (bitmap, 0, 0, &color);
462     assertEqualInt (status, Ok);
463 #if defined(USE_WINDOWS_GDIPLUS)
464     assertEqualARGB (color, 0xFF8B2A37);
465 #else
466     assertEqualARGB (color, 0xFF8B2937);
467 #endif
468 
469     status = GdipBitmapSetPixel (bitmap, 0, 0, 0x00000000);
470     assertEqualInt (status, Ok);
471 
472     // Fill with brush - changed, CompositingModeSourceOver.
473     status = GdipSetSolidFillColor (brush, 0xAABBCCDD);
474     assertEqualInt (status, Ok);
475 
476     status = GdipFillRectangle (graphics, brush, 0, 0, 1, 1);
477     assertEqualInt (status, Ok);
478 
479     status = GdipBitmapGetPixel (bitmap, 0, 0, &color);
480     assertEqualInt (status, Ok);
481 #if defined(USE_WINDOWS_GDIPLUS)
482     assertEqualARGB (color, 0xFF7D8893);
483 #else
484     assertEqualARGB (color, 0xFF7D8893);
485 #endif
486 
487     status = GdipBitmapSetPixel (bitmap, 0, 0, 0x00000000);
488     assertEqualInt (status, Ok);
489 
490     // Fill with brush - zero alpha, CompositingModeSourceOver.
491     status = GdipSetSolidFillColor (brush, 0x00BBCCDD);
492     assertEqualInt (status, Ok);
493 
494     status = GdipFillRectangle (graphics, brush, 0, 0, 1, 1);
495     assertEqualInt (status, Ok);
496 
497     status = GdipBitmapGetPixel (bitmap, 0, 0, &color);
498     assertEqualInt (status, Ok);
499     assertEqualARGB (color, 0xFF000000);
500 
501     status = GdipBitmapSetPixel (bitmap, 0, 0, 0x00000000);
502     assertEqualInt (status, Ok);
503 
504     // Fill with brush - CompositingModeSourceCopy.
505     status = GdipSetSolidFillColor (brush, 0xDDA03040);
506     assertEqualInt (status, Ok);
507 
508     status = GdipSetCompositingMode (graphics, CompositingModeSourceCopy);
509     assertEqualInt (status, Ok);
510 
511     status = GdipFillRectangle (graphics, brush, 0, 0, 1, 1);
512     assertEqualInt (status, Ok);
513 
514     status = GdipBitmapGetPixel (bitmap, 0, 0, &color);
515     assertEqualInt (status, Ok);
516 #if defined(USE_WINDOWS_GDIPLUS)
517     assertEqualARGB (color, 0xFF8B2A37);
518 #else
519     assertEqualARGB (color, 0xFF8B2937);
520 #endif
521 
522     status = GdipBitmapSetPixel (bitmap, 0, 0, 0x00000000);
523     assertEqualInt (status, Ok);
524 
525     // Fill with brush - unchanged, CompositingModeSourceCopy.
526     status = GdipFillRectangle (graphics, brush, 0, 0, 1, 1);
527     assertEqualInt (status, Ok);
528 
529     status = GdipBitmapGetPixel (bitmap, 0, 0, &color);
530     assertEqualInt (status, Ok);
531 #if defined(USE_WINDOWS_GDIPLUS)
532     assertEqualARGB (color, 0xFF8B2A37);
533 #else
534     assertEqualARGB (color, 0xFF8B2937);
535 #endif
536 
537     status = GdipBitmapSetPixel (bitmap, 0, 0, 0x00000000);
538     assertEqualInt (status, Ok);
539 
540     // Fill with brush - changed, CompositingModeSourceCopy.
541     status = GdipSetSolidFillColor (brush, 0xAABBCCDD);
542     assertEqualInt (status, Ok);
543 
544     status = GdipFillRectangle (graphics, brush, 0, 0, 1, 1);
545     assertEqualInt (status, Ok);
546 
547     status = GdipBitmapGetPixel (bitmap, 0, 0, &color);
548     assertEqualInt (status, Ok);
549     assertEqualARGB (color, 0xFF7D8893);
550 
551     status = GdipBitmapSetPixel (bitmap, 0, 0, 0x00000000);
552     assertEqualInt (status, Ok);
553 
554     // Fill with brush - zero alpha, CompositingModeSourceCopy.
555     status = GdipSetSolidFillColor (brush, 0x00BBCCDD);
556     assertEqualInt (status, Ok);
557 
558     status = GdipFillRectangle (graphics, brush, 0, 0, 1, 1);
559     assertEqualInt (status, Ok);
560 
561     status = GdipBitmapGetPixel (bitmap, 0, 0, &color);
562     assertEqualInt (status, Ok);
563     assertEqualARGB (color, 0xFF000000);
564 
565     GdipDeleteGraphics (graphics);
566     GdipDisposeImage ((GpImage *) bitmap);
567 
568     // Negative tests.
569     status = GdipSetSolidFillColor (NULL, 0x010203040);
570     assertEqualInt (status, InvalidParameter);
571 
572     GdipDeleteBrush ((GpBrush *) brush);
573 }
574 
575 int
main(int argc,char ** argv)576 main (int argc, char**argv)
577 {
578     STARTUP;
579 
580     test_clone ();
581     test_delete ();
582     test_createSolidFill ();
583     test_getSolidFillColor ();
584     test_setSolidFillColor ();
585     test_fill ();
586 
587     SHUTDOWN;
588     return 0;
589 }
590