2 * Unit test suite for graphics objects
4 * Copyright (C) 2007 Google (Evan Stade)
5 * Copyright (C) 2012 Dmitry Timoshkov
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
26 #include "wine/test.h"
28 #define expect(expected, got) ok((got) == (expected), "Expected %d, got %d\n", (INT)(expected), (INT)(got))
29 #define expectf_(expected, got, precision) ok(fabs((expected) - (got)) <= (precision), "Expected %f, got %f\n", (expected), (got))
30 #define expectf(expected, got) expectf_((expected), (got), 0.001)
31 #define TABLE_LEN (23)
33 static const REAL mm_per_inch
= 25.4;
34 static const REAL point_per_inch
= 72.0;
37 static void set_rect_empty(RectF
*rc
)
45 /* converts a given unit to its value in pixels */
46 static REAL
units_to_pixels(REAL units
, GpUnit unit
, REAL dpi
)
54 return units
* dpi
/ point_per_inch
;
58 return units
* dpi
/ 300.0; /* Per MSDN */
60 return units
* dpi
/ mm_per_inch
;
62 ok(0, "Unsupported unit: %d\n", unit
);
67 /* converts value in pixels to a given unit */
68 static REAL
pixels_to_units(REAL pixels
, GpUnit unit
, REAL dpi
)
76 return pixels
* point_per_inch
/ dpi
;
80 return pixels
* 300.0 / dpi
;
82 return pixels
* mm_per_inch
/ dpi
;
84 ok(0, "Unsupported unit: %d\n", unit
);
89 static REAL
units_scale(GpUnit from
, GpUnit to
, REAL dpi
)
91 REAL pixels
= units_to_pixels(1.0, from
, dpi
);
92 return pixels_to_units(pixels
, to
, dpi
);
95 static GpGraphics
*create_graphics(REAL res_x
, REAL res_y
, GpUnit unit
, REAL scale
)
103 GpGraphics
*graphics
= NULL
;
106 status
= GdipCreateBitmapFromScan0(1, 1, 4, PixelFormat24bppRGB
, NULL
, &u
.bitmap
);
109 status
= GdipBitmapSetResolution(u
.bitmap
, res_x
, res_y
);
111 status
= GdipGetImageHorizontalResolution(u
.image
, &res
);
114 status
= GdipGetImageVerticalResolution(u
.image
, &res
);
118 status
= GdipGetImageGraphicsContext(u
.image
, &graphics
);
120 /* image is intentionally leaked to make sure that there is no
121 side effects after its destruction.
122 status = GdipDisposeImage(u.image);
126 status
= GdipGetDpiX(graphics
, &res
);
129 status
= GdipGetDpiY(graphics
, &res
);
133 status
= GdipSetPageUnit(graphics
, unit
);
135 status
= GdipSetPageScale(graphics
, scale
);
141 static void test_constructor_destructor(void)
144 GpGraphics
*graphics
= NULL
;
145 HDC hdc
= GetDC( hwnd
);
147 stat
= GdipCreateFromHDC(NULL
, &graphics
);
148 expect(OutOfMemory
, stat
);
149 stat
= GdipDeleteGraphics(graphics
);
150 expect(InvalidParameter
, stat
);
152 stat
= GdipCreateFromHDC(hdc
, &graphics
);
154 stat
= GdipDeleteGraphics(graphics
);
157 stat
= GdipCreateFromHWND(NULL
, &graphics
);
159 stat
= GdipDeleteGraphics(graphics
);
162 stat
= GdipCreateFromHWNDICM(NULL
, &graphics
);
164 stat
= GdipDeleteGraphics(graphics
);
167 stat
= GdipDeleteGraphics(NULL
);
168 expect(InvalidParameter
, stat
);
169 ReleaseDC(hwnd
, hdc
);
177 /* Linked list prepend function. */
178 static void log_state(GraphicsState data
, node
** log
)
180 node
* new_entry
= HeapAlloc(GetProcessHeap(), 0, sizeof(node
));
182 new_entry
->data
= data
;
183 new_entry
->next
= *log
;
187 /* Checks if there are duplicates in the list, and frees it. */
188 static void check_no_duplicates(node
* log
)
200 while((temp
= temp
->next
)){
201 if(log
->data
== temp
->data
){
208 }while((log
= log
->next
));
213 HeapFree(GetProcessHeap(), 0, temp
);
221 static void test_save_restore(void)
224 GraphicsState state_a
, state_b
, state_c
;
225 InterpolationMode mode
;
226 GpGraphics
*graphics1
, *graphics2
;
227 node
* state_log
= NULL
;
228 HDC hdc
= GetDC( hwnd
);
229 state_a
= state_b
= state_c
= 0xdeadbeef;
231 /* Invalid saving. */
232 GdipCreateFromHDC(hdc
, &graphics1
);
233 stat
= GdipSaveGraphics(graphics1
, NULL
);
234 expect(InvalidParameter
, stat
);
235 stat
= GdipSaveGraphics(NULL
, &state_a
);
236 expect(InvalidParameter
, stat
);
237 GdipDeleteGraphics(graphics1
);
239 log_state(state_a
, &state_log
);
241 /* Basic save/restore. */
242 GdipCreateFromHDC(hdc
, &graphics1
);
243 GdipSetInterpolationMode(graphics1
, InterpolationModeBilinear
);
244 stat
= GdipSaveGraphics(graphics1
, &state_a
);
246 GdipSetInterpolationMode(graphics1
, InterpolationModeBicubic
);
247 stat
= GdipRestoreGraphics(graphics1
, state_a
);
249 GdipGetInterpolationMode(graphics1
, &mode
);
250 expect(InterpolationModeBilinear
, mode
);
251 GdipDeleteGraphics(graphics1
);
253 log_state(state_a
, &state_log
);
255 /* Restoring garbage doesn't affect saves. */
256 GdipCreateFromHDC(hdc
, &graphics1
);
257 GdipSetInterpolationMode(graphics1
, InterpolationModeBilinear
);
258 GdipSaveGraphics(graphics1
, &state_a
);
259 GdipSetInterpolationMode(graphics1
, InterpolationModeBicubic
);
260 GdipSaveGraphics(graphics1
, &state_b
);
261 GdipSetInterpolationMode(graphics1
, InterpolationModeNearestNeighbor
);
262 stat
= GdipRestoreGraphics(graphics1
, 0xdeadbeef);
264 GdipRestoreGraphics(graphics1
, state_b
);
265 GdipGetInterpolationMode(graphics1
, &mode
);
266 expect(InterpolationModeBicubic
, mode
);
267 GdipRestoreGraphics(graphics1
, state_a
);
268 GdipGetInterpolationMode(graphics1
, &mode
);
269 expect(InterpolationModeBilinear
, mode
);
270 GdipDeleteGraphics(graphics1
);
272 log_state(state_a
, &state_log
);
273 log_state(state_b
, &state_log
);
275 /* Restoring older state invalidates newer saves (but not older saves). */
276 GdipCreateFromHDC(hdc
, &graphics1
);
277 GdipSetInterpolationMode(graphics1
, InterpolationModeBilinear
);
278 GdipSaveGraphics(graphics1
, &state_a
);
279 GdipSetInterpolationMode(graphics1
, InterpolationModeBicubic
);
280 GdipSaveGraphics(graphics1
, &state_b
);
281 GdipSetInterpolationMode(graphics1
, InterpolationModeNearestNeighbor
);
282 GdipSaveGraphics(graphics1
, &state_c
);
283 GdipSetInterpolationMode(graphics1
, InterpolationModeHighQualityBilinear
);
284 GdipRestoreGraphics(graphics1
, state_b
);
285 GdipGetInterpolationMode(graphics1
, &mode
);
286 expect(InterpolationModeBicubic
, mode
);
287 GdipRestoreGraphics(graphics1
, state_c
);
288 GdipGetInterpolationMode(graphics1
, &mode
);
289 expect(InterpolationModeBicubic
, mode
);
290 GdipRestoreGraphics(graphics1
, state_a
);
291 GdipGetInterpolationMode(graphics1
, &mode
);
292 expect(InterpolationModeBilinear
, mode
);
293 GdipDeleteGraphics(graphics1
);
295 log_state(state_a
, &state_log
);
296 log_state(state_b
, &state_log
);
297 log_state(state_c
, &state_log
);
299 /* Restoring older save from one graphics object does not invalidate
300 * newer save from other graphics object. */
301 GdipCreateFromHDC(hdc
, &graphics1
);
302 GdipCreateFromHDC(hdc
, &graphics2
);
303 GdipSetInterpolationMode(graphics1
, InterpolationModeBilinear
);
304 GdipSaveGraphics(graphics1
, &state_a
);
305 GdipSetInterpolationMode(graphics2
, InterpolationModeBicubic
);
306 GdipSaveGraphics(graphics2
, &state_b
);
307 GdipSetInterpolationMode(graphics1
, InterpolationModeNearestNeighbor
);
308 GdipSetInterpolationMode(graphics2
, InterpolationModeNearestNeighbor
);
309 GdipRestoreGraphics(graphics1
, state_a
);
310 GdipGetInterpolationMode(graphics1
, &mode
);
311 expect(InterpolationModeBilinear
, mode
);
312 GdipRestoreGraphics(graphics2
, state_b
);
313 GdipGetInterpolationMode(graphics2
, &mode
);
314 expect(InterpolationModeBicubic
, mode
);
315 GdipDeleteGraphics(graphics1
);
316 GdipDeleteGraphics(graphics2
);
318 /* You can't restore a state to a graphics object that didn't save it. */
319 GdipCreateFromHDC(hdc
, &graphics1
);
320 GdipCreateFromHDC(hdc
, &graphics2
);
321 GdipSetInterpolationMode(graphics1
, InterpolationModeBilinear
);
322 GdipSaveGraphics(graphics1
, &state_a
);
323 GdipSetInterpolationMode(graphics1
, InterpolationModeNearestNeighbor
);
324 GdipSetInterpolationMode(graphics2
, InterpolationModeNearestNeighbor
);
325 GdipRestoreGraphics(graphics2
, state_a
);
326 GdipGetInterpolationMode(graphics2
, &mode
);
327 expect(InterpolationModeNearestNeighbor
, mode
);
328 GdipDeleteGraphics(graphics1
);
329 GdipDeleteGraphics(graphics2
);
331 log_state(state_a
, &state_log
);
333 /* The same state value should never be returned twice. */
335 check_no_duplicates(state_log
);
337 ReleaseDC(hwnd
, hdc
);
340 static void test_GdipFillClosedCurve2(void)
343 GpGraphics
*graphics
= NULL
;
344 GpSolidFill
*brush
= NULL
;
345 HDC hdc
= GetDC( hwnd
);
357 /* make a graphics object and brush object */
358 ok(hdc
!= NULL
, "Expected HDC to be initialized\n");
360 status
= GdipCreateFromHDC(hdc
, &graphics
);
362 ok(graphics
!= NULL
, "Expected graphics to be initialized\n");
364 GdipCreateSolidFill((ARGB
)0xdeadbeef, &brush
);
366 /* InvalidParameter cases: null graphics, null brush, null points */
367 status
= GdipFillClosedCurve2(NULL
, NULL
, NULL
, 3, 0.5, FillModeAlternate
);
368 expect(InvalidParameter
, status
);
370 status
= GdipFillClosedCurve2(graphics
, NULL
, NULL
, 3, 0.5, FillModeAlternate
);
371 expect(InvalidParameter
, status
);
373 status
= GdipFillClosedCurve2(NULL
, (GpBrush
*)brush
, NULL
, 3, 0.5, FillModeAlternate
);
374 expect(InvalidParameter
, status
);
376 status
= GdipFillClosedCurve2(NULL
, NULL
, points
, 3, 0.5, FillModeAlternate
);
377 expect(InvalidParameter
, status
);
379 status
= GdipFillClosedCurve2(graphics
, (GpBrush
*)brush
, NULL
, 3, 0.5, FillModeAlternate
);
380 expect(InvalidParameter
, status
);
382 status
= GdipFillClosedCurve2(graphics
, NULL
, points
, 3, 0.5, FillModeAlternate
);
383 expect(InvalidParameter
, status
);
385 status
= GdipFillClosedCurve2(NULL
, (GpBrush
*)brush
, points
, 3, 0.5, FillModeAlternate
);
386 expect(InvalidParameter
, status
);
388 /* InvalidParameter cases: invalid count */
389 status
= GdipFillClosedCurve2(graphics
, (GpBrush
*)brush
, points
, -1, 0.5, FillModeAlternate
);
390 expect(InvalidParameter
, status
);
392 status
= GdipFillClosedCurve2(graphics
, (GpBrush
*)brush
, points
, 0, 0.5, FillModeAlternate
);
393 expect(InvalidParameter
, status
);
395 /* Valid test cases */
396 status
= GdipFillClosedCurve2(graphics
, (GpBrush
*)brush
, points
, 1, 0.5, FillModeAlternate
);
399 status
= GdipFillClosedCurve2(graphics
, (GpBrush
*)brush
, points
, 2, 0.5, FillModeAlternate
);
402 status
= GdipFillClosedCurve2(graphics
, (GpBrush
*)brush
, points
, 3, 0.5, FillModeAlternate
);
405 GdipDeleteGraphics(graphics
);
406 GdipDeleteBrush((GpBrush
*)brush
);
408 ReleaseDC(hwnd
, hdc
);
411 static void test_GdipFillClosedCurve2I(void)
414 GpGraphics
*graphics
= NULL
;
415 GpSolidFill
*brush
= NULL
;
416 HDC hdc
= GetDC( hwnd
);
428 /* make a graphics object and brush object */
429 ok(hdc
!= NULL
, "Expected HDC to be initialized\n");
431 status
= GdipCreateFromHDC(hdc
, &graphics
);
433 ok(graphics
!= NULL
, "Expected graphics to be initialized\n");
435 GdipCreateSolidFill((ARGB
)0xdeadbeef, &brush
);
437 /* InvalidParameter cases: null graphics, null brush */
438 /* Note: GdipFillClosedCurveI and GdipFillClosedCurve2I hang in Windows
439 when points == NULL, so don't test this condition */
440 status
= GdipFillClosedCurve2I(NULL
, NULL
, points
, 3, 0.5, FillModeAlternate
);
441 expect(InvalidParameter
, status
);
443 status
= GdipFillClosedCurve2I(graphics
, NULL
, points
, 3, 0.5, FillModeAlternate
);
444 expect(InvalidParameter
, status
);
446 status
= GdipFillClosedCurve2I(NULL
, (GpBrush
*)brush
, points
, 3, 0.5, FillModeAlternate
);
447 expect(InvalidParameter
, status
);
449 /* InvalidParameter cases: invalid count */
450 status
= GdipFillClosedCurve2I(graphics
, (GpBrush
*)brush
, points
, 0, 0.5, FillModeAlternate
);
451 expect(InvalidParameter
, status
);
453 /* OutOfMemory cases: large (unsigned) int */
454 status
= GdipFillClosedCurve2I(graphics
, (GpBrush
*)brush
, points
, -1, 0.5, FillModeAlternate
);
455 expect(OutOfMemory
, status
);
457 /* Valid test cases */
458 status
= GdipFillClosedCurve2I(graphics
, (GpBrush
*)brush
, points
, 1, 0.5, FillModeAlternate
);
461 status
= GdipFillClosedCurve2I(graphics
, (GpBrush
*)brush
, points
, 2, 0.5, FillModeAlternate
);
464 status
= GdipFillClosedCurve2I(graphics
, (GpBrush
*)brush
, points
, 3, 0.5, FillModeAlternate
);
467 GdipDeleteGraphics(graphics
);
468 GdipDeleteBrush((GpBrush
*)brush
);
470 ReleaseDC(hwnd
, hdc
);
473 static void test_GdipDrawArc(void)
476 GpGraphics
*graphics
= NULL
;
478 HDC hdc
= GetDC( hwnd
);
480 /* make a graphics object and pen object */
481 ok(hdc
!= NULL
, "Expected HDC to be initialized\n");
483 status
= GdipCreateFromHDC(hdc
, &graphics
);
485 ok(graphics
!= NULL
, "Expected graphics to be initialized\n");
487 status
= GdipCreatePen1((ARGB
)0xffff00ff, 10.0f
, UnitPixel
, &pen
);
489 ok(pen
!= NULL
, "Expected pen to be initialized\n");
491 /* InvalidParameter cases: null graphics, null pen, non-positive width, non-positive height */
492 status
= GdipDrawArc(NULL
, NULL
, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
493 expect(InvalidParameter
, status
);
495 status
= GdipDrawArc(graphics
, NULL
, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0);
496 expect(InvalidParameter
, status
);
498 status
= GdipDrawArc(NULL
, pen
, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0);
499 expect(InvalidParameter
, status
);
501 status
= GdipDrawArc(graphics
, pen
, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0);
502 expect(InvalidParameter
, status
);
504 status
= GdipDrawArc(graphics
, pen
, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0);
505 expect(InvalidParameter
, status
);
507 /* successful case */
508 status
= GdipDrawArc(graphics
, pen
, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0);
512 GdipDeleteGraphics(graphics
);
514 ReleaseDC(hwnd
, hdc
);
517 static void test_GdipDrawArcI(void)
520 GpGraphics
*graphics
= NULL
;
522 HDC hdc
= GetDC( hwnd
);
524 /* make a graphics object and pen object */
525 ok(hdc
!= NULL
, "Expected HDC to be initialized\n");
527 status
= GdipCreateFromHDC(hdc
, &graphics
);
529 ok(graphics
!= NULL
, "Expected graphics to be initialized\n");
531 status
= GdipCreatePen1((ARGB
)0xffff00ff, 10.0f
, UnitPixel
, &pen
);
533 ok(pen
!= NULL
, "Expected pen to be initialized\n");
535 /* InvalidParameter cases: null graphics, null pen, non-positive width, non-positive height */
536 status
= GdipDrawArcI(NULL
, NULL
, 0, 0, 0, 0, 0, 0);
537 expect(InvalidParameter
, status
);
539 status
= GdipDrawArcI(graphics
, NULL
, 0, 0, 1, 1, 0, 0);
540 expect(InvalidParameter
, status
);
542 status
= GdipDrawArcI(NULL
, pen
, 0, 0, 1, 1, 0, 0);
543 expect(InvalidParameter
, status
);
545 status
= GdipDrawArcI(graphics
, pen
, 0, 0, 1, 0, 0, 0);
546 expect(InvalidParameter
, status
);
548 status
= GdipDrawArcI(graphics
, pen
, 0, 0, 0, 1, 0, 0);
549 expect(InvalidParameter
, status
);
551 /* successful case */
552 status
= GdipDrawArcI(graphics
, pen
, 0, 0, 1, 1, 0, 0);
556 GdipDeleteGraphics(graphics
);
558 ReleaseDC(hwnd
, hdc
);
561 static void test_BeginContainer2(void)
565 REAL defClip
[] = {5, 10, 15, 20};
566 REAL elems
[6], defTrans
[] = {1, 2, 3, 4, 5, 6};
567 GraphicsContainer cont1
, cont2
, cont3
, cont4
;
568 CompositingQuality compqual
, defCompqual
= CompositingQualityHighSpeed
;
569 CompositingMode compmode
, defCompmode
= CompositingModeSourceOver
;
570 InterpolationMode interp
, defInterp
= InterpolationModeHighQualityBicubic
;
571 REAL scale
, defScale
= 17;
572 GpUnit unit
, defUnit
= UnitPixel
;
573 PixelOffsetMode offsetmode
, defOffsetmode
= PixelOffsetModeHighSpeed
;
574 SmoothingMode smoothmode
, defSmoothmode
= SmoothingModeAntiAlias
;
575 UINT contrast
, defContrast
= 5;
576 TextRenderingHint texthint
, defTexthint
= TextRenderingHintAntiAlias
;
579 GpGraphics
*graphics
= NULL
;
580 HDC hdc
= GetDC( hwnd
);
582 ok(hdc
!= NULL
, "Expected HDC to be initialized\n");
584 status
= GdipCreateFromHDC(hdc
, &graphics
);
586 ok(graphics
!= NULL
, "Expected graphics to be initialized\n");
588 /* null graphics, null container */
589 status
= GdipBeginContainer2(NULL
, &cont1
);
590 expect(InvalidParameter
, status
);
592 status
= GdipBeginContainer2(graphics
, NULL
);
593 expect(InvalidParameter
, status
);
595 status
= GdipEndContainer(NULL
, cont1
);
596 expect(InvalidParameter
, status
);
598 /* test all quality-related values */
599 GdipSetCompositingMode(graphics
, defCompmode
);
600 GdipSetCompositingQuality(graphics
, defCompqual
);
601 GdipSetInterpolationMode(graphics
, defInterp
);
602 GdipSetPageScale(graphics
, defScale
);
603 GdipSetPageUnit(graphics
, defUnit
);
604 GdipSetPixelOffsetMode(graphics
, defOffsetmode
);
605 GdipSetSmoothingMode(graphics
, defSmoothmode
);
606 GdipSetTextContrast(graphics
, defContrast
);
607 GdipSetTextRenderingHint(graphics
, defTexthint
);
609 status
= GdipBeginContainer2(graphics
, &cont1
);
612 GdipSetCompositingMode(graphics
, CompositingModeSourceCopy
);
613 GdipSetCompositingQuality(graphics
, CompositingQualityHighQuality
);
614 GdipSetInterpolationMode(graphics
, InterpolationModeBilinear
);
615 GdipSetPageScale(graphics
, 10);
616 GdipSetPageUnit(graphics
, UnitDocument
);
617 GdipSetPixelOffsetMode(graphics
, PixelOffsetModeHalf
);
618 GdipSetSmoothingMode(graphics
, SmoothingModeNone
);
619 GdipSetTextContrast(graphics
, 7);
620 GdipSetTextRenderingHint(graphics
, TextRenderingHintClearTypeGridFit
);
622 status
= GdipEndContainer(graphics
, cont1
);
625 GdipGetCompositingMode(graphics
, &compmode
);
626 ok(defCompmode
== compmode
, "Expected Compositing Mode to be restored to %d, got %d\n", defCompmode
, compmode
);
628 GdipGetCompositingQuality(graphics
, &compqual
);
629 ok(defCompqual
== compqual
, "Expected Compositing Quality to be restored to %d, got %d\n", defCompqual
, compqual
);
631 GdipGetInterpolationMode(graphics
, &interp
);
632 ok(defInterp
== interp
, "Expected Interpolation Mode to be restored to %d, got %d\n", defInterp
, interp
);
634 GdipGetPageScale(graphics
, &scale
);
635 ok(fabs(defScale
- scale
) < 0.0001, "Expected Page Scale to be restored to %f, got %f\n", defScale
, scale
);
637 GdipGetPageUnit(graphics
, &unit
);
638 ok(defUnit
== unit
, "Expected Page Unit to be restored to %d, got %d\n", defUnit
, unit
);
640 GdipGetPixelOffsetMode(graphics
, &offsetmode
);
641 ok(defOffsetmode
== offsetmode
, "Expected Pixel Offset Mode to be restored to %d, got %d\n", defOffsetmode
, offsetmode
);
643 GdipGetSmoothingMode(graphics
, &smoothmode
);
644 ok(defSmoothmode
== smoothmode
, "Expected Smoothing Mode to be restored to %d, got %d\n", defSmoothmode
, smoothmode
);
646 GdipGetTextContrast(graphics
, &contrast
);
647 ok(defContrast
== contrast
, "Expected Text Contrast to be restored to %d, got %d\n", defContrast
, contrast
);
649 GdipGetTextRenderingHint(graphics
, &texthint
);
650 ok(defTexthint
== texthint
, "Expected Text Hint to be restored to %d, got %d\n", defTexthint
, texthint
);
652 /* test world transform */
653 status
= GdipBeginContainer2(graphics
, &cont1
);
656 status
= GdipCreateMatrix2(defTrans
[0], defTrans
[1], defTrans
[2], defTrans
[3],
657 defTrans
[4], defTrans
[5], &transform
);
659 GdipSetWorldTransform(graphics
, transform
);
660 GdipDeleteMatrix(transform
);
663 status
= GdipBeginContainer2(graphics
, &cont2
);
666 status
= GdipCreateMatrix2(10, 20, 30, 40, 50, 60, &transform
);
668 GdipSetWorldTransform(graphics
, transform
);
669 GdipDeleteMatrix(transform
);
672 status
= GdipEndContainer(graphics
, cont2
);
675 status
= GdipCreateMatrix(&transform
);
677 GdipGetWorldTransform(graphics
, transform
);
678 GdipGetMatrixElements(transform
, elems
);
679 ok(fabs(defTrans
[0] - elems
[0]) < 0.0001 &&
680 fabs(defTrans
[1] - elems
[1]) < 0.0001 &&
681 fabs(defTrans
[2] - elems
[2]) < 0.0001 &&
682 fabs(defTrans
[3] - elems
[3]) < 0.0001 &&
683 fabs(defTrans
[4] - elems
[4]) < 0.0001 &&
684 fabs(defTrans
[5] - elems
[5]) < 0.0001,
685 "Expected World Transform Matrix to be restored to [%f, %f, %f, %f, %f, %f], got [%f, %f, %f, %f, %f, %f]\n",
686 defTrans
[0], defTrans
[1], defTrans
[2], defTrans
[3], defTrans
[4], defTrans
[5],
687 elems
[0], elems
[1], elems
[2], elems
[3], elems
[4], elems
[5]);
688 GdipDeleteMatrix(transform
);
691 status
= GdipEndContainer(graphics
, cont1
);
695 status
= GdipBeginContainer2(graphics
, &cont1
);
698 GdipSetClipRect(graphics
, defClip
[0], defClip
[1], defClip
[2], defClip
[3], CombineModeReplace
);
700 status
= GdipBeginContainer2(graphics
, &cont2
);
703 GdipSetClipRect(graphics
, 2, 4, 6, 8, CombineModeReplace
);
705 status
= GdipEndContainer(graphics
, cont2
);
708 status
= GdipGetClipBounds(graphics
, &clip
);
711 ok(fabs(defClip
[0] - clip
.X
) < 0.0001 &&
712 fabs(defClip
[1] - clip
.Y
) < 0.0001 &&
713 fabs(defClip
[2] - clip
.Width
) < 0.0001 &&
714 fabs(defClip
[3] - clip
.Height
) < 0.0001,
715 "Expected Clipping Rectangle to be restored to [%f, %f, %f, %f], got [%f, %f, %f, %f]\n",
716 defClip
[0], defClip
[1], defClip
[2], defClip
[3],
717 clip
.X
, clip
.Y
, clip
.Width
, clip
.Height
);
719 status
= GdipEndContainer(graphics
, cont1
);
723 status
= GdipBeginContainer2(graphics
, &cont1
);
726 status
= GdipBeginContainer2(graphics
, &cont2
);
729 status
= GdipBeginContainer2(graphics
, &cont3
);
732 status
= GdipEndContainer(graphics
, cont3
);
735 status
= GdipBeginContainer2(graphics
, &cont4
);
738 status
= GdipEndContainer(graphics
, cont4
);
742 status
= GdipEndContainer(graphics
, cont1
);
745 /* end an already-ended container */
746 status
= GdipEndContainer(graphics
, cont1
);
749 GdipDeleteGraphics(graphics
);
750 ReleaseDC(hwnd
, hdc
);
753 static void test_GdipDrawBezierI(void)
756 GpGraphics
*graphics
= NULL
;
758 HDC hdc
= GetDC( hwnd
);
760 /* make a graphics object and pen object */
761 ok(hdc
!= NULL
, "Expected HDC to be initialized\n");
763 status
= GdipCreateFromHDC(hdc
, &graphics
);
765 ok(graphics
!= NULL
, "Expected graphics to be initialized\n");
767 status
= GdipCreatePen1((ARGB
)0xffff00ff, 10.0f
, UnitPixel
, &pen
);
769 ok(pen
!= NULL
, "Expected pen to be initialized\n");
771 /* InvalidParameter cases: null graphics, null pen */
772 status
= GdipDrawBezierI(NULL
, NULL
, 0, 0, 0, 0, 0, 0, 0, 0);
773 expect(InvalidParameter
, status
);
775 status
= GdipDrawBezierI(graphics
, NULL
, 0, 0, 0, 0, 0, 0, 0, 0);
776 expect(InvalidParameter
, status
);
778 status
= GdipDrawBezierI(NULL
, pen
, 0, 0, 0, 0, 0, 0, 0, 0);
779 expect(InvalidParameter
, status
);
781 /* successful case */
782 status
= GdipDrawBezierI(graphics
, pen
, 0, 0, 0, 0, 0, 0, 0, 0);
786 GdipDeleteGraphics(graphics
);
788 ReleaseDC(hwnd
, hdc
);
791 static void test_GdipDrawCurve3(void)
794 GpGraphics
*graphics
= NULL
;
796 HDC hdc
= GetDC( hwnd
);
808 /* make a graphics object and pen object */
809 ok(hdc
!= NULL
, "Expected HDC to be initialized\n");
811 status
= GdipCreateFromHDC(hdc
, &graphics
);
813 ok(graphics
!= NULL
, "Expected graphics to be initialized\n");
815 status
= GdipCreatePen1((ARGB
)0xffff00ff, 10.0f
, UnitPixel
, &pen
);
817 ok(pen
!= NULL
, "Expected pen to be initialized\n");
819 /* InvalidParameter cases: null graphics, null pen */
820 status
= GdipDrawCurve3(NULL
, NULL
, points
, 3, 0, 2, 1);
821 expect(InvalidParameter
, status
);
823 status
= GdipDrawCurve3(graphics
, NULL
, points
, 3, 0, 2, 1);
824 expect(InvalidParameter
, status
);
826 status
= GdipDrawCurve3(NULL
, pen
, points
, 3, 0, 2, 1);
827 expect(InvalidParameter
, status
);
829 /* InvalidParameter cases: invalid count */
830 status
= GdipDrawCurve3(graphics
, pen
, points
, -1, 0, 2, 1);
831 expect(InvalidParameter
, status
);
833 status
= GdipDrawCurve3(graphics
, pen
, points
, 0, 0, 2, 1);
834 expect(InvalidParameter
, status
);
836 status
= GdipDrawCurve3(graphics
, pen
, points
, 1, 0, 0, 1);
837 expect(InvalidParameter
, status
);
839 status
= GdipDrawCurve3(graphics
, pen
, points
, 3, 4, 2, 1);
840 expect(InvalidParameter
, status
);
842 /* InvalidParameter cases: invalid number of segments */
843 status
= GdipDrawCurve3(graphics
, pen
, points
, 3, 0, -1, 1);
844 expect(InvalidParameter
, status
);
846 status
= GdipDrawCurve3(graphics
, pen
, points
, 3, 1, 2, 1);
847 expect(InvalidParameter
, status
);
849 status
= GdipDrawCurve3(graphics
, pen
, points
, 2, 0, 2, 1);
850 expect(InvalidParameter
, status
);
852 /* Valid test cases */
853 status
= GdipDrawCurve3(graphics
, pen
, points
, 2, 0, 1, 1);
856 status
= GdipDrawCurve3(graphics
, pen
, points
, 3, 0, 2, 2);
859 status
= GdipDrawCurve3(graphics
, pen
, points
, 2, 0, 1, -2);
862 status
= GdipDrawCurve3(graphics
, pen
, points
, 3, 1, 1, 0);
866 GdipDeleteGraphics(graphics
);
868 ReleaseDC(hwnd
, hdc
);
871 static void test_GdipDrawCurve3I(void)
874 GpGraphics
*graphics
= NULL
;
876 HDC hdc
= GetDC( hwnd
);
888 /* make a graphics object and pen object */
889 ok(hdc
!= NULL
, "Expected HDC to be initialized\n");
891 status
= GdipCreateFromHDC(hdc
, &graphics
);
893 ok(graphics
!= NULL
, "Expected graphics to be initialized\n");
895 status
= GdipCreatePen1((ARGB
)0xffff00ff, 10.0f
, UnitPixel
, &pen
);
897 ok(pen
!= NULL
, "Expected pen to be initialized\n");
899 /* InvalidParameter cases: null graphics, null pen */
900 status
= GdipDrawCurve3I(NULL
, NULL
, points
, 3, 0, 2, 1);
901 expect(InvalidParameter
, status
);
903 status
= GdipDrawCurve3I(graphics
, NULL
, points
, 3, 0, 2, 1);
904 expect(InvalidParameter
, status
);
906 status
= GdipDrawCurve3I(NULL
, pen
, points
, 3, 0, 2, 1);
907 expect(InvalidParameter
, status
);
909 /* InvalidParameter cases: invalid count */
910 status
= GdipDrawCurve3I(graphics
, pen
, points
, -1, -1, -1, 1);
911 expect(OutOfMemory
, status
);
913 status
= GdipDrawCurve3I(graphics
, pen
, points
, 0, 0, 2, 1);
914 expect(InvalidParameter
, status
);
916 status
= GdipDrawCurve3I(graphics
, pen
, points
, 1, 0, 0, 1);
917 expect(InvalidParameter
, status
);
919 status
= GdipDrawCurve3I(graphics
, pen
, points
, 3, 4, 2, 1);
920 expect(InvalidParameter
, status
);
922 /* InvalidParameter cases: invalid number of segments */
923 status
= GdipDrawCurve3I(graphics
, pen
, points
, 3, 0, -1, 1);
924 expect(InvalidParameter
, status
);
926 status
= GdipDrawCurve3I(graphics
, pen
, points
, 3, 1, 2, 1);
927 expect(InvalidParameter
, status
);
929 status
= GdipDrawCurve3I(graphics
, pen
, points
, 2, 0, 2, 1);
930 expect(InvalidParameter
, status
);
932 /* Valid test cases */
933 status
= GdipDrawCurve3I(graphics
, pen
, points
, 2, 0, 1, 1);
936 status
= GdipDrawCurve3I(graphics
, pen
, points
, 3, 0, 2, 2);
939 status
= GdipDrawCurve3I(graphics
, pen
, points
, 2, 0, 1, -2);
942 status
= GdipDrawCurve3I(graphics
, pen
, points
, 3, 1, 1, 0);
946 GdipDeleteGraphics(graphics
);
948 ReleaseDC(hwnd
, hdc
);
951 static void test_GdipDrawCurve2(void)
954 GpGraphics
*graphics
= NULL
;
956 HDC hdc
= GetDC( hwnd
);
968 /* make a graphics object and pen object */
969 ok(hdc
!= NULL
, "Expected HDC to be initialized\n");
971 status
= GdipCreateFromHDC(hdc
, &graphics
);
973 ok(graphics
!= NULL
, "Expected graphics to be initialized\n");
975 status
= GdipCreatePen1((ARGB
)0xffff00ff, 10.0f
, UnitPixel
, &pen
);
977 ok(pen
!= NULL
, "Expected pen to be initialized\n");
979 /* InvalidParameter cases: null graphics, null pen */
980 status
= GdipDrawCurve2(NULL
, NULL
, points
, 3, 1);
981 expect(InvalidParameter
, status
);
983 status
= GdipDrawCurve2(graphics
, NULL
, points
, 3, 1);
984 expect(InvalidParameter
, status
);
986 status
= GdipDrawCurve2(NULL
, pen
, points
, 3, 1);
987 expect(InvalidParameter
, status
);
989 /* InvalidParameter cases: invalid count */
990 status
= GdipDrawCurve2(graphics
, pen
, points
, -1, 1);
991 expect(InvalidParameter
, status
);
993 status
= GdipDrawCurve2(graphics
, pen
, points
, 0, 1);
994 expect(InvalidParameter
, status
);
996 status
= GdipDrawCurve2(graphics
, pen
, points
, 1, 1);
997 expect(InvalidParameter
, status
);
999 /* Valid test cases */
1000 status
= GdipDrawCurve2(graphics
, pen
, points
, 2, 1);
1003 status
= GdipDrawCurve2(graphics
, pen
, points
, 3, 2);
1006 status
= GdipDrawCurve2(graphics
, pen
, points
, 3, -2);
1009 status
= GdipDrawCurve2(graphics
, pen
, points
, 3, 0);
1013 GdipDeleteGraphics(graphics
);
1015 ReleaseDC(hwnd
, hdc
);
1018 static void test_GdipDrawCurve2I(void)
1021 GpGraphics
*graphics
= NULL
;
1023 HDC hdc
= GetDC( hwnd
);
1035 /* make a graphics object and pen object */
1036 ok(hdc
!= NULL
, "Expected HDC to be initialized\n");
1038 status
= GdipCreateFromHDC(hdc
, &graphics
);
1040 ok(graphics
!= NULL
, "Expected graphics to be initialized\n");
1042 status
= GdipCreatePen1((ARGB
)0xffff00ff, 10.0f
, UnitPixel
, &pen
);
1044 ok(pen
!= NULL
, "Expected pen to be initialized\n");
1046 /* InvalidParameter cases: null graphics, null pen */
1047 status
= GdipDrawCurve2I(NULL
, NULL
, points
, 3, 1);
1048 expect(InvalidParameter
, status
);
1050 status
= GdipDrawCurve2I(graphics
, NULL
, points
, 3, 1);
1051 expect(InvalidParameter
, status
);
1053 status
= GdipDrawCurve2I(NULL
, pen
, points
, 3, 1);
1054 expect(InvalidParameter
, status
);
1056 /* InvalidParameter cases: invalid count */
1057 status
= GdipDrawCurve2I(graphics
, pen
, points
, -1, 1);
1058 expect(OutOfMemory
, status
);
1060 status
= GdipDrawCurve2I(graphics
, pen
, points
, 0, 1);
1061 expect(InvalidParameter
, status
);
1063 status
= GdipDrawCurve2I(graphics
, pen
, points
, 1, 1);
1064 expect(InvalidParameter
, status
);
1066 /* Valid test cases */
1067 status
= GdipDrawCurve2I(graphics
, pen
, points
, 2, 1);
1070 status
= GdipDrawCurve2I(graphics
, pen
, points
, 3, 2);
1073 status
= GdipDrawCurve2I(graphics
, pen
, points
, 3, -2);
1076 status
= GdipDrawCurve2I(graphics
, pen
, points
, 3, 0);
1080 GdipDeleteGraphics(graphics
);
1082 ReleaseDC(hwnd
, hdc
);
1085 static void test_GdipDrawCurve(void)
1088 GpGraphics
*graphics
= NULL
;
1090 HDC hdc
= GetDC( hwnd
);
1102 /* make a graphics object and pen object */
1103 ok(hdc
!= NULL
, "Expected HDC to be initialized\n");
1105 status
= GdipCreateFromHDC(hdc
, &graphics
);
1107 ok(graphics
!= NULL
, "Expected graphics to be initialized\n");
1109 status
= GdipCreatePen1((ARGB
)0xffff00ff, 10.0f
, UnitPixel
, &pen
);
1111 ok(pen
!= NULL
, "Expected pen to be initialized\n");
1113 /* InvalidParameter cases: null graphics, null pen */
1114 status
= GdipDrawCurve(NULL
, NULL
, points
, 3);
1115 expect(InvalidParameter
, status
);
1117 status
= GdipDrawCurve(graphics
, NULL
, points
, 3);
1118 expect(InvalidParameter
, status
);
1120 status
= GdipDrawCurve(NULL
, pen
, points
, 3);
1121 expect(InvalidParameter
, status
);
1123 /* InvalidParameter cases: invalid count */
1124 status
= GdipDrawCurve(graphics
, pen
, points
, -1);
1125 expect(InvalidParameter
, status
);
1127 status
= GdipDrawCurve(graphics
, pen
, points
, 0);
1128 expect(InvalidParameter
, status
);
1130 status
= GdipDrawCurve(graphics
, pen
, points
, 1);
1131 expect(InvalidParameter
, status
);
1133 /* Valid test cases */
1134 status
= GdipDrawCurve(graphics
, pen
, points
, 2);
1137 status
= GdipDrawCurve(graphics
, pen
, points
, 3);
1141 GdipDeleteGraphics(graphics
);
1143 ReleaseDC(hwnd
, hdc
);
1146 static void test_GdipDrawCurveI(void)
1149 GpGraphics
*graphics
= NULL
;
1151 HDC hdc
= GetDC( hwnd
);
1163 /* make a graphics object and pen object */
1164 ok(hdc
!= NULL
, "Expected HDC to be initialized\n");
1166 status
= GdipCreateFromHDC(hdc
, &graphics
);
1168 ok(graphics
!= NULL
, "Expected graphics to be initialized\n");
1170 status
= GdipCreatePen1((ARGB
)0xffff00ff, 10.0f
, UnitPixel
, &pen
);
1172 ok(pen
!= NULL
, "Expected pen to be initialized\n");
1174 /* InvalidParameter cases: null graphics, null pen */
1175 status
= GdipDrawCurveI(NULL
, NULL
, points
, 3);
1176 expect(InvalidParameter
, status
);
1178 status
= GdipDrawCurveI(graphics
, NULL
, points
, 3);
1179 expect(InvalidParameter
, status
);
1181 status
= GdipDrawCurveI(NULL
, pen
, points
, 3);
1182 expect(InvalidParameter
, status
);
1184 /* InvalidParameter cases: invalid count */
1185 status
= GdipDrawCurveI(graphics
, pen
, points
, -1);
1186 expect(OutOfMemory
, status
);
1188 status
= GdipDrawCurveI(graphics
, pen
, points
, 0);
1189 expect(InvalidParameter
, status
);
1191 status
= GdipDrawCurveI(graphics
, pen
, points
, 1);
1192 expect(InvalidParameter
, status
);
1194 /* Valid test cases */
1195 status
= GdipDrawCurveI(graphics
, pen
, points
, 2);
1198 status
= GdipDrawCurveI(graphics
, pen
, points
, 3);
1202 GdipDeleteGraphics(graphics
);
1204 ReleaseDC(hwnd
, hdc
);
1207 static void test_GdipDrawLineI(void)
1210 GpGraphics
*graphics
= NULL
;
1212 HDC hdc
= GetDC( hwnd
);
1214 /* make a graphics object and pen object */
1215 ok(hdc
!= NULL
, "Expected HDC to be initialized\n");
1217 status
= GdipCreateFromHDC(hdc
, &graphics
);
1219 ok(graphics
!= NULL
, "Expected graphics to be initialized\n");
1221 status
= GdipCreatePen1((ARGB
)0xffff00ff, 10.0f
, UnitPixel
, &pen
);
1223 ok(pen
!= NULL
, "Expected pen to be initialized\n");
1225 /* InvalidParameter cases: null graphics, null pen */
1226 status
= GdipDrawLineI(NULL
, NULL
, 0, 0, 0, 0);
1227 expect(InvalidParameter
, status
);
1229 status
= GdipDrawLineI(graphics
, NULL
, 0, 0, 0, 0);
1230 expect(InvalidParameter
, status
);
1232 status
= GdipDrawLineI(NULL
, pen
, 0, 0, 0, 0);
1233 expect(InvalidParameter
, status
);
1235 /* successful case */
1236 status
= GdipDrawLineI(graphics
, pen
, 0, 0, 0, 0);
1240 GdipDeleteGraphics(graphics
);
1242 ReleaseDC(hwnd
, hdc
);
1245 static void test_GdipDrawImagePointsRect(void)
1248 GpGraphics
*graphics
= NULL
;
1250 GpBitmap
*bm
= NULL
;
1251 BYTE rbmi
[sizeof(BITMAPINFOHEADER
)];
1253 BITMAPINFO
*bmi
= (BITMAPINFO
*)rbmi
;
1254 HDC hdc
= GetDC( hwnd
);
1258 memset(rbmi
, 0, sizeof(rbmi
));
1259 bmi
->bmiHeader
.biSize
= sizeof(BITMAPINFOHEADER
);
1260 bmi
->bmiHeader
.biWidth
= 10;
1261 bmi
->bmiHeader
.biHeight
= 10;
1262 bmi
->bmiHeader
.biPlanes
= 1;
1263 bmi
->bmiHeader
.biBitCount
= 32;
1264 bmi
->bmiHeader
.biCompression
= BI_RGB
;
1265 status
= GdipCreateBitmapFromGdiDib(bmi
, buff
, &bm
);
1267 ok(NULL
!= bm
, "Expected bitmap to be initialized\n");
1268 status
= GdipCreateFromHDC(hdc
, &graphics
);
1278 status
= GdipDrawImagePointsRect(graphics
, (GpImage
*)bm
, ptf
, 4, 0, 0, 10, 10, UnitPixel
, NULL
, NULL
, NULL
);
1279 expect(NotImplemented
, status
);
1280 status
= GdipDrawImagePointsRect(graphics
, (GpImage
*)bm
, ptf
, 2, 0, 0, 10, 10, UnitPixel
, NULL
, NULL
, NULL
);
1281 expect(InvalidParameter
, status
);
1282 status
= GdipDrawImagePointsRect(graphics
, (GpImage
*)bm
, ptf
, 3, 0, 0, 10, 10, UnitPixel
, NULL
, NULL
, NULL
);
1284 status
= GdipDrawImagePointsRect(graphics
, NULL
, ptf
, 3, 0, 0, 10, 10, UnitPixel
, NULL
, NULL
, NULL
);
1285 expect(InvalidParameter
, status
);
1286 status
= GdipDrawImagePointsRect(graphics
, (GpImage
*)bm
, NULL
, 3, 0, 0, 10, 10, UnitPixel
, NULL
, NULL
, NULL
);
1287 expect(InvalidParameter
, status
);
1288 status
= GdipDrawImagePointsRect(graphics
, (GpImage
*)bm
, ptf
, 3, 0, 0, 0, 0, UnitPixel
, NULL
, NULL
, NULL
);
1290 memset(ptf
, 0, sizeof(ptf
));
1291 status
= GdipDrawImagePointsRect(graphics
, (GpImage
*)bm
, ptf
, 3, 0, 0, 10, 10, UnitPixel
, NULL
, NULL
, NULL
);
1294 GdipDisposeImage((GpImage
*)bm
);
1295 GdipDeleteGraphics(graphics
);
1296 ReleaseDC(hwnd
, hdc
);
1299 static void test_GdipDrawLinesI(void)
1302 GpGraphics
*graphics
= NULL
;
1304 GpPoint
*ptf
= NULL
;
1305 HDC hdc
= GetDC( hwnd
);
1307 /* make a graphics object and pen object */
1308 ok(hdc
!= NULL
, "Expected HDC to be initialized\n");
1310 status
= GdipCreateFromHDC(hdc
, &graphics
);
1312 ok(graphics
!= NULL
, "Expected graphics to be initialized\n");
1314 status
= GdipCreatePen1((ARGB
)0xffff00ff, 10.0f
, UnitPixel
, &pen
);
1316 ok(pen
!= NULL
, "Expected pen to be initialized\n");
1318 /* make some arbitrary valid points*/
1319 ptf
= GdipAlloc(2 * sizeof(GpPointF
));
1327 /* InvalidParameter cases: null graphics, null pen, null points, count < 2*/
1328 status
= GdipDrawLinesI(NULL
, NULL
, NULL
, 0);
1329 expect(InvalidParameter
, status
);
1331 status
= GdipDrawLinesI(graphics
, pen
, ptf
, 0);
1332 expect(InvalidParameter
, status
);
1334 status
= GdipDrawLinesI(graphics
, NULL
, ptf
, 2);
1335 expect(InvalidParameter
, status
);
1337 status
= GdipDrawLinesI(NULL
, pen
, ptf
, 2);
1338 expect(InvalidParameter
, status
);
1340 /* successful case */
1341 status
= GdipDrawLinesI(graphics
, pen
, ptf
, 2);
1346 GdipDeleteGraphics(graphics
);
1348 ReleaseDC(hwnd
, hdc
);
1351 static void test_GdipFillClosedCurve(void)
1354 GpGraphics
*graphics
= NULL
;
1355 GpSolidFill
*brush
= NULL
;
1356 HDC hdc
= GetDC( hwnd
);
1368 /* make a graphics object and brush object */
1369 ok(hdc
!= NULL
, "Expected HDC to be initialized\n");
1371 status
= GdipCreateFromHDC(hdc
, &graphics
);
1373 ok(graphics
!= NULL
, "Expected graphics to be initialized\n");
1375 GdipCreateSolidFill((ARGB
)0xdeadbeef, &brush
);
1377 /* InvalidParameter cases: null graphics, null brush, null points */
1378 status
= GdipFillClosedCurve(NULL
, NULL
, NULL
, 3);
1379 expect(InvalidParameter
, status
);
1381 status
= GdipFillClosedCurve(graphics
, NULL
, NULL
, 3);
1382 expect(InvalidParameter
, status
);
1384 status
= GdipFillClosedCurve(NULL
, (GpBrush
*)brush
, NULL
, 3);
1385 expect(InvalidParameter
, status
);
1387 status
= GdipFillClosedCurve(NULL
, NULL
, points
, 3);
1388 expect(InvalidParameter
, status
);
1390 status
= GdipFillClosedCurve(graphics
, (GpBrush
*)brush
, NULL
, 3);
1391 expect(InvalidParameter
, status
);
1393 status
= GdipFillClosedCurve(graphics
, NULL
, points
, 3);
1394 expect(InvalidParameter
, status
);
1396 status
= GdipFillClosedCurve(NULL
, (GpBrush
*)brush
, points
, 3);
1397 expect(InvalidParameter
, status
);
1399 /* InvalidParameter cases: invalid count */
1400 status
= GdipFillClosedCurve(graphics
, (GpBrush
*)brush
, points
, -1);
1401 expect(InvalidParameter
, status
);
1403 status
= GdipFillClosedCurve(graphics
, (GpBrush
*)brush
, points
, 0);
1404 expect(InvalidParameter
, status
);
1406 /* Valid test cases */
1407 status
= GdipFillClosedCurve(graphics
, (GpBrush
*)brush
, points
, 1);
1410 status
= GdipFillClosedCurve(graphics
, (GpBrush
*)brush
, points
, 2);
1413 status
= GdipFillClosedCurve(graphics
, (GpBrush
*)brush
, points
, 3);
1416 GdipDeleteGraphics(graphics
);
1417 GdipDeleteBrush((GpBrush
*)brush
);
1419 ReleaseDC(hwnd
, hdc
);
1422 static void test_GdipFillClosedCurveI(void)
1425 GpGraphics
*graphics
= NULL
;
1426 GpSolidFill
*brush
= NULL
;
1427 HDC hdc
= GetDC( hwnd
);
1439 /* make a graphics object and brush object */
1440 ok(hdc
!= NULL
, "Expected HDC to be initialized\n");
1442 status
= GdipCreateFromHDC(hdc
, &graphics
);
1444 ok(graphics
!= NULL
, "Expected graphics to be initialized\n");
1446 GdipCreateSolidFill((ARGB
)0xdeadbeef, &brush
);
1448 /* InvalidParameter cases: null graphics, null brush */
1449 /* Note: GdipFillClosedCurveI and GdipFillClosedCurve2I hang in Windows
1450 when points == NULL, so don't test this condition */
1451 status
= GdipFillClosedCurveI(NULL
, NULL
, points
, 3);
1452 expect(InvalidParameter
, status
);
1454 status
= GdipFillClosedCurveI(graphics
, NULL
, points
, 3);
1455 expect(InvalidParameter
, status
);
1457 status
= GdipFillClosedCurveI(NULL
, (GpBrush
*)brush
, points
, 3);
1458 expect(InvalidParameter
, status
);
1460 /* InvalidParameter cases: invalid count */
1461 status
= GdipFillClosedCurveI(graphics
, (GpBrush
*)brush
, points
, 0);
1462 expect(InvalidParameter
, status
);
1464 /* OutOfMemory cases: large (unsigned) int */
1465 status
= GdipFillClosedCurveI(graphics
, (GpBrush
*)brush
, points
, -1);
1466 expect(OutOfMemory
, status
);
1468 /* Valid test cases */
1469 status
= GdipFillClosedCurveI(graphics
, (GpBrush
*)brush
, points
, 1);
1472 status
= GdipFillClosedCurveI(graphics
, (GpBrush
*)brush
, points
, 2);
1475 status
= GdipFillClosedCurveI(graphics
, (GpBrush
*)brush
, points
, 3);
1478 GdipDeleteGraphics(graphics
);
1479 GdipDeleteBrush((GpBrush
*)brush
);
1481 ReleaseDC(hwnd
, hdc
);
1484 static void test_Get_Release_DC(void)
1487 GpGraphics
*graphics
= NULL
;
1491 HDC hdc
= GetDC( hwnd
);
1494 CompositingQuality quality
;
1495 CompositingMode compmode
;
1496 InterpolationMode intmode
;
1500 PixelOffsetMode offsetmode
;
1501 SmoothingMode smoothmode
;
1502 TextRenderingHint texthint
;
1510 ARGB color
= 0x00000000;
1511 HRGN hrgn
= CreateRectRgn(0, 0, 10, 10);
1524 for(i
= 0; i
< 5;i
++){
1525 ptf
[i
].X
= (REAL
)pt
[i
].X
;
1526 ptf
[i
].Y
= (REAL
)pt
[i
].Y
;
1532 rect
[0].Height
= 70;
1536 rect
[1].Height
= 20;
1538 for(i
= 0; i
< 2;i
++){
1539 rectf
[i
].X
= (REAL
)rect
[i
].X
;
1540 rectf
[i
].Y
= (REAL
)rect
[i
].Y
;
1541 rectf
[i
].Height
= (REAL
)rect
[i
].Height
;
1542 rectf
[i
].Width
= (REAL
)rect
[i
].Width
;
1545 status
= GdipCreateMatrix(&m
);
1547 GdipCreateRegion(®ion
);
1548 GdipCreateSolidFill((ARGB
)0xdeadbeef, &brush
);
1549 GdipCreatePath(FillModeAlternate
, &path
);
1550 GdipCreateRegion(&clip
);
1552 status
= GdipCreateFromHDC(hdc
, &graphics
);
1554 ok(graphics
!= NULL
, "Expected graphics to be initialized\n");
1555 status
= GdipCreatePen1((ARGB
)0xffff00ff, 10.0f
, UnitPixel
, &pen
);
1558 /* NULL arguments */
1559 status
= GdipGetDC(NULL
, NULL
);
1560 expect(InvalidParameter
, status
);
1561 status
= GdipGetDC(graphics
, NULL
);
1562 expect(InvalidParameter
, status
);
1563 status
= GdipGetDC(NULL
, &retdc
);
1564 expect(InvalidParameter
, status
);
1566 status
= GdipReleaseDC(NULL
, NULL
);
1567 expect(InvalidParameter
, status
);
1568 status
= GdipReleaseDC(graphics
, NULL
);
1569 expect(InvalidParameter
, status
);
1570 status
= GdipReleaseDC(NULL
, (HDC
)0xdeadbeef);
1571 expect(InvalidParameter
, status
);
1573 /* Release without Get */
1574 status
= GdipReleaseDC(graphics
, hdc
);
1575 expect(InvalidParameter
, status
);
1578 status
= GdipGetDC(graphics
, &retdc
);
1580 ok(retdc
== hdc
, "Invalid HDC returned\n");
1581 /* call it once more */
1582 status
= GdipGetDC(graphics
, &retdc
);
1583 expect(ObjectBusy
, status
);
1585 /* try all Graphics calls here */
1586 status
= GdipDrawArc(graphics
, pen
, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0);
1587 expect(ObjectBusy
, status
);
1588 status
= GdipDrawArcI(graphics
, pen
, 0, 0, 1, 1, 0.0, 0.0);
1589 expect(ObjectBusy
, status
);
1590 status
= GdipDrawBezier(graphics
, pen
, 0.0, 10.0, 20.0, 15.0, 35.0, -10.0, 10.0, 10.0);
1591 expect(ObjectBusy
, status
);
1592 status
= GdipDrawBezierI(graphics
, pen
, 0, 0, 0, 0, 0, 0, 0, 0);
1593 expect(ObjectBusy
, status
);
1594 status
= GdipDrawBeziers(graphics
, pen
, ptf
, 5);
1595 expect(ObjectBusy
, status
);
1596 status
= GdipDrawBeziersI(graphics
, pen
, pt
, 5);
1597 expect(ObjectBusy
, status
);
1598 status
= GdipDrawClosedCurve(graphics
, pen
, ptf
, 5);
1599 expect(ObjectBusy
, status
);
1600 status
= GdipDrawClosedCurveI(graphics
, pen
, pt
, 5);
1601 expect(ObjectBusy
, status
);
1602 status
= GdipDrawClosedCurve2(graphics
, pen
, ptf
, 5, 1.0);
1603 expect(ObjectBusy
, status
);
1604 status
= GdipDrawClosedCurve2I(graphics
, pen
, pt
, 5, 1.0);
1605 expect(ObjectBusy
, status
);
1606 status
= GdipDrawCurve(graphics
, pen
, ptf
, 5);
1607 expect(ObjectBusy
, status
);
1608 status
= GdipDrawCurveI(graphics
, pen
, pt
, 5);
1609 expect(ObjectBusy
, status
);
1610 status
= GdipDrawCurve2(graphics
, pen
, ptf
, 5, 1.0);
1611 expect(ObjectBusy
, status
);
1612 status
= GdipDrawCurve2I(graphics
, pen
, pt
, 5, 1.0);
1613 expect(ObjectBusy
, status
);
1614 status
= GdipDrawEllipse(graphics
, pen
, 0.0, 0.0, 100.0, 50.0);
1615 expect(ObjectBusy
, status
);
1616 status
= GdipDrawEllipseI(graphics
, pen
, 0, 0, 100, 50);
1617 expect(ObjectBusy
, status
);
1618 /* GdipDrawImage/GdipDrawImageI */
1619 /* GdipDrawImagePointsRect/GdipDrawImagePointsRectI */
1620 /* GdipDrawImageRectRect/GdipDrawImageRectRectI */
1621 /* GdipDrawImageRect/GdipDrawImageRectI */
1622 status
= GdipDrawLine(graphics
, pen
, 0.0, 0.0, 100.0, 200.0);
1623 expect(ObjectBusy
, status
);
1624 status
= GdipDrawLineI(graphics
, pen
, 0, 0, 100, 200);
1625 expect(ObjectBusy
, status
);
1626 status
= GdipDrawLines(graphics
, pen
, ptf
, 5);
1627 expect(ObjectBusy
, status
);
1628 status
= GdipDrawLinesI(graphics
, pen
, pt
, 5);
1629 expect(ObjectBusy
, status
);
1630 status
= GdipDrawPath(graphics
, pen
, path
);
1631 expect(ObjectBusy
, status
);
1632 status
= GdipDrawPie(graphics
, pen
, 0.0, 0.0, 100.0, 100.0, 0.0, 90.0);
1633 expect(ObjectBusy
, status
);
1634 status
= GdipDrawPieI(graphics
, pen
, 0, 0, 100, 100, 0.0, 90.0);
1635 expect(ObjectBusy
, status
);
1636 status
= GdipDrawRectangle(graphics
, pen
, 0.0, 0.0, 100.0, 300.0);
1637 expect(ObjectBusy
, status
);
1638 status
= GdipDrawRectangleI(graphics
, pen
, 0, 0, 100, 300);
1639 expect(ObjectBusy
, status
);
1640 status
= GdipDrawRectangles(graphics
, pen
, rectf
, 2);
1641 expect(ObjectBusy
, status
);
1642 status
= GdipDrawRectanglesI(graphics
, pen
, rect
, 2);
1643 expect(ObjectBusy
, status
);
1644 /* GdipDrawString */
1645 status
= GdipFillClosedCurve2(graphics
, (GpBrush
*)brush
, ptf
, 5, 1.0, FillModeAlternate
);
1646 expect(ObjectBusy
, status
);
1647 status
= GdipFillClosedCurve2I(graphics
, (GpBrush
*)brush
, pt
, 5, 1.0, FillModeAlternate
);
1648 expect(ObjectBusy
, status
);
1649 status
= GdipFillClosedCurve(graphics
, (GpBrush
*)brush
, ptf
, 5);
1650 expect(ObjectBusy
, status
);
1651 status
= GdipFillClosedCurveI(graphics
, (GpBrush
*)brush
, pt
, 5);
1652 expect(ObjectBusy
, status
);
1653 status
= GdipFillEllipse(graphics
, (GpBrush
*)brush
, 0.0, 0.0, 100.0, 100.0);
1654 expect(ObjectBusy
, status
);
1655 status
= GdipFillEllipseI(graphics
, (GpBrush
*)brush
, 0, 0, 100, 100);
1656 expect(ObjectBusy
, status
);
1657 status
= GdipFillPath(graphics
, (GpBrush
*)brush
, path
);
1658 expect(ObjectBusy
, status
);
1659 status
= GdipFillPie(graphics
, (GpBrush
*)brush
, 0.0, 0.0, 100.0, 100.0, 0.0, 15.0);
1660 expect(ObjectBusy
, status
);
1661 status
= GdipFillPieI(graphics
, (GpBrush
*)brush
, 0, 0, 100, 100, 0.0, 15.0);
1662 expect(ObjectBusy
, status
);
1663 status
= GdipFillPolygon(graphics
, (GpBrush
*)brush
, ptf
, 5, FillModeAlternate
);
1664 expect(ObjectBusy
, status
);
1665 status
= GdipFillPolygonI(graphics
, (GpBrush
*)brush
, pt
, 5, FillModeAlternate
);
1666 expect(ObjectBusy
, status
);
1667 status
= GdipFillPolygon2(graphics
, (GpBrush
*)brush
, ptf
, 5);
1668 expect(ObjectBusy
, status
);
1669 status
= GdipFillPolygon2I(graphics
, (GpBrush
*)brush
, pt
, 5);
1670 expect(ObjectBusy
, status
);
1671 status
= GdipFillRectangle(graphics
, (GpBrush
*)brush
, 0.0, 0.0, 100.0, 100.0);
1672 expect(ObjectBusy
, status
);
1673 status
= GdipFillRectangleI(graphics
, (GpBrush
*)brush
, 0, 0, 100, 100);
1674 expect(ObjectBusy
, status
);
1675 status
= GdipFillRectangles(graphics
, (GpBrush
*)brush
, rectf
, 2);
1676 expect(ObjectBusy
, status
);
1677 status
= GdipFillRectanglesI(graphics
, (GpBrush
*)brush
, rect
, 2);
1678 expect(ObjectBusy
, status
);
1679 status
= GdipFillRegion(graphics
, (GpBrush
*)brush
, region
);
1680 expect(ObjectBusy
, status
);
1681 status
= GdipFlush(graphics
, FlushIntentionFlush
);
1682 expect(ObjectBusy
, status
);
1683 status
= GdipGetClipBounds(graphics
, rectf
);
1684 expect(ObjectBusy
, status
);
1685 status
= GdipGetClipBoundsI(graphics
, rect
);
1686 expect(ObjectBusy
, status
);
1687 status
= GdipGetCompositingMode(graphics
, &compmode
);
1688 expect(ObjectBusy
, status
);
1689 status
= GdipGetCompositingQuality(graphics
, &quality
);
1690 expect(ObjectBusy
, status
);
1691 status
= GdipGetInterpolationMode(graphics
, &intmode
);
1692 expect(ObjectBusy
, status
);
1693 status
= GdipGetNearestColor(graphics
, &color
);
1694 expect(ObjectBusy
, status
);
1695 status
= GdipGetPageScale(graphics
, &r
);
1696 expect(ObjectBusy
, status
);
1697 status
= GdipGetPageUnit(graphics
, &unit
);
1698 expect(ObjectBusy
, status
);
1699 status
= GdipGetPixelOffsetMode(graphics
, &offsetmode
);
1700 expect(ObjectBusy
, status
);
1701 status
= GdipGetSmoothingMode(graphics
, &smoothmode
);
1702 expect(ObjectBusy
, status
);
1703 status
= GdipGetTextRenderingHint(graphics
, &texthint
);
1704 expect(ObjectBusy
, status
);
1705 status
= GdipGetWorldTransform(graphics
, m
);
1706 expect(ObjectBusy
, status
);
1707 status
= GdipGraphicsClear(graphics
, 0xdeadbeef);
1708 expect(ObjectBusy
, status
);
1709 status
= GdipIsVisiblePoint(graphics
, 0.0, 0.0, &res
);
1710 expect(ObjectBusy
, status
);
1711 status
= GdipIsVisiblePointI(graphics
, 0, 0, &res
);
1712 expect(ObjectBusy
, status
);
1713 /* GdipMeasureCharacterRanges */
1714 /* GdipMeasureString */
1715 status
= GdipResetClip(graphics
);
1716 expect(ObjectBusy
, status
);
1717 status
= GdipResetWorldTransform(graphics
);
1718 expect(ObjectBusy
, status
);
1719 /* GdipRestoreGraphics */
1720 status
= GdipRotateWorldTransform(graphics
, 15.0, MatrixOrderPrepend
);
1721 expect(ObjectBusy
, status
);
1722 /* GdipSaveGraphics */
1723 status
= GdipScaleWorldTransform(graphics
, 1.0, 1.0, MatrixOrderPrepend
);
1724 expect(ObjectBusy
, status
);
1725 status
= GdipSetCompositingMode(graphics
, CompositingModeSourceOver
);
1726 expect(ObjectBusy
, status
);
1727 status
= GdipSetCompositingQuality(graphics
, CompositingQualityDefault
);
1728 expect(ObjectBusy
, status
);
1729 status
= GdipSetInterpolationMode(graphics
, InterpolationModeDefault
);
1730 expect(ObjectBusy
, status
);
1731 status
= GdipSetPageScale(graphics
, 1.0);
1732 expect(ObjectBusy
, status
);
1733 status
= GdipSetPageUnit(graphics
, UnitWorld
);
1734 expect(ObjectBusy
, status
);
1735 status
= GdipSetPixelOffsetMode(graphics
, PixelOffsetModeDefault
);
1736 expect(ObjectBusy
, status
);
1737 status
= GdipSetSmoothingMode(graphics
, SmoothingModeDefault
);
1738 expect(ObjectBusy
, status
);
1739 status
= GdipSetTextRenderingHint(graphics
, TextRenderingHintSystemDefault
);
1740 expect(ObjectBusy
, status
);
1741 status
= GdipSetWorldTransform(graphics
, m
);
1742 expect(ObjectBusy
, status
);
1743 status
= GdipTranslateWorldTransform(graphics
, 0.0, 0.0, MatrixOrderPrepend
);
1744 expect(ObjectBusy
, status
);
1745 status
= GdipSetClipHrgn(graphics
, hrgn
, CombineModeReplace
);
1746 expect(ObjectBusy
, status
);
1747 status
= GdipSetClipPath(graphics
, path
, CombineModeReplace
);
1748 expect(ObjectBusy
, status
);
1749 status
= GdipSetClipRect(graphics
, 0.0, 0.0, 10.0, 10.0, CombineModeReplace
);
1750 expect(ObjectBusy
, status
);
1751 status
= GdipSetClipRectI(graphics
, 0, 0, 10, 10, CombineModeReplace
);
1752 expect(ObjectBusy
, status
);
1753 status
= GdipSetClipRegion(graphics
, clip
, CombineModeReplace
);
1754 expect(ObjectBusy
, status
);
1755 status
= GdipTranslateClip(graphics
, 0.0, 0.0);
1756 expect(ObjectBusy
, status
);
1757 status
= GdipTranslateClipI(graphics
, 0, 0);
1758 expect(ObjectBusy
, status
);
1759 status
= GdipDrawPolygon(graphics
, pen
, ptf
, 5);
1760 expect(ObjectBusy
, status
);
1761 status
= GdipDrawPolygonI(graphics
, pen
, pt
, 5);
1762 expect(ObjectBusy
, status
);
1763 status
= GdipGetDpiX(graphics
, &r
);
1764 expect(ObjectBusy
, status
);
1765 status
= GdipGetDpiY(graphics
, &r
);
1766 expect(ObjectBusy
, status
);
1767 status
= GdipMultiplyWorldTransform(graphics
, m
, MatrixOrderPrepend
);
1768 expect(ObjectBusy
, status
);
1769 status
= GdipGetClip(graphics
, region
);
1770 expect(ObjectBusy
, status
);
1771 status
= GdipTransformPoints(graphics
, CoordinateSpacePage
, CoordinateSpaceWorld
, ptf
, 5);
1772 expect(ObjectBusy
, status
);
1774 /* try to delete before release */
1775 status
= GdipDeleteGraphics(graphics
);
1776 expect(ObjectBusy
, status
);
1778 status
= GdipReleaseDC(graphics
, retdc
);
1782 GdipDeleteGraphics(graphics
);
1784 GdipDeleteRegion(clip
);
1785 GdipDeletePath(path
);
1786 GdipDeleteBrush((GpBrush
*)brush
);
1787 GdipDeleteRegion(region
);
1788 GdipDeleteMatrix(m
);
1791 ReleaseDC(hwnd
, hdc
);
1794 static void test_transformpoints(void)
1797 GpGraphics
*graphics
= NULL
;
1798 HDC hdc
= GetDC( hwnd
);
1802 status
= GdipCreateFromHDC(hdc
, &graphics
);
1805 /* NULL arguments */
1806 status
= GdipTransformPoints(NULL
, CoordinateSpacePage
, CoordinateSpaceWorld
, NULL
, 0);
1807 expect(InvalidParameter
, status
);
1808 status
= GdipTransformPoints(graphics
, CoordinateSpacePage
, CoordinateSpaceWorld
, NULL
, 0);
1809 expect(InvalidParameter
, status
);
1810 status
= GdipTransformPoints(graphics
, CoordinateSpacePage
, CoordinateSpaceWorld
, ptf
, 0);
1811 expect(InvalidParameter
, status
);
1812 status
= GdipTransformPoints(graphics
, CoordinateSpacePage
, CoordinateSpaceWorld
, ptf
, -1);
1813 expect(InvalidParameter
, status
);
1819 status
= GdipTransformPoints(graphics
, CoordinateSpaceDevice
, CoordinateSpaceWorld
, ptf
, 2);
1821 expectf(1.0, ptf
[0].X
);
1822 expectf(0.0, ptf
[0].Y
);
1823 expectf(0.0, ptf
[1].X
);
1824 expectf(1.0, ptf
[1].Y
);
1826 status
= GdipTranslateWorldTransform(graphics
, 5.0, 5.0, MatrixOrderAppend
);
1828 status
= GdipSetPageUnit(graphics
, UnitPixel
);
1830 status
= GdipSetPageScale(graphics
, 3.0);
1837 status
= GdipTransformPoints(graphics
, CoordinateSpaceDevice
, CoordinateSpaceWorld
, ptf
, 2);
1839 expectf(18.0, ptf
[0].X
);
1840 expectf(15.0, ptf
[0].Y
);
1841 expectf(15.0, ptf
[1].X
);
1842 expectf(18.0, ptf
[1].Y
);
1848 status
= GdipTransformPoints(graphics
, CoordinateSpacePage
, CoordinateSpaceWorld
, ptf
, 2);
1850 expectf(6.0, ptf
[0].X
);
1851 expectf(5.0, ptf
[0].Y
);
1852 expectf(5.0, ptf
[1].X
);
1853 expectf(6.0, ptf
[1].Y
);
1859 status
= GdipTransformPoints(graphics
, CoordinateSpaceDevice
, CoordinateSpacePage
, ptf
, 2);
1861 expectf(3.0, ptf
[0].X
);
1862 expectf(0.0, ptf
[0].Y
);
1863 expectf(0.0, ptf
[1].X
);
1864 expectf(3.0, ptf
[1].Y
);
1870 status
= GdipTransformPoints(graphics
, CoordinateSpaceWorld
, CoordinateSpaceDevice
, ptf
, 2);
1872 expectf(1.0, ptf
[0].X
);
1873 expectf(0.0, ptf
[0].Y
);
1874 expectf(0.0, ptf
[1].X
);
1875 expectf(1.0, ptf
[1].Y
);
1881 status
= GdipTransformPoints(graphics
, CoordinateSpaceWorld
, CoordinateSpacePage
, ptf
, 2);
1883 expectf(1.0, ptf
[0].X
);
1884 expectf(0.0, ptf
[0].Y
);
1885 expectf(0.0, ptf
[1].X
);
1886 expectf(1.0, ptf
[1].Y
);
1892 status
= GdipTransformPoints(graphics
, CoordinateSpacePage
, CoordinateSpaceDevice
, ptf
, 2);
1894 expectf(1.0, ptf
[0].X
);
1895 expectf(0.0, ptf
[0].Y
);
1896 expectf(0.0, ptf
[1].X
);
1897 expectf(1.0, ptf
[1].Y
);
1903 status
= GdipTransformPointsI(graphics
, CoordinateSpaceDevice
, CoordinateSpaceWorld
, pt
, 2);
1905 expect(18, pt
[0].X
);
1906 expect(15, pt
[0].Y
);
1907 expect(15, pt
[1].X
);
1908 expect(18, pt
[1].Y
);
1910 GdipDeleteGraphics(graphics
);
1911 ReleaseDC(hwnd
, hdc
);
1914 static void test_get_set_clip(void)
1917 GpGraphics
*graphics
= NULL
;
1918 HDC hdc
= GetDC( hwnd
);
1923 status
= GdipCreateFromHDC(hdc
, &graphics
);
1926 rect
.X
= rect
.Y
= 0.0;
1927 rect
.Height
= rect
.Width
= 100.0;
1929 status
= GdipCreateRegionRect(&rect
, &clip
);
1932 /* NULL arguments */
1933 status
= GdipGetClip(NULL
, NULL
);
1934 expect(InvalidParameter
, status
);
1935 status
= GdipGetClip(graphics
, NULL
);
1936 expect(InvalidParameter
, status
);
1937 status
= GdipGetClip(NULL
, clip
);
1938 expect(InvalidParameter
, status
);
1940 status
= GdipSetClipRegion(NULL
, NULL
, CombineModeReplace
);
1941 expect(InvalidParameter
, status
);
1942 status
= GdipSetClipRegion(graphics
, NULL
, CombineModeReplace
);
1943 expect(InvalidParameter
, status
);
1945 status
= GdipSetClipPath(NULL
, NULL
, CombineModeReplace
);
1946 expect(InvalidParameter
, status
);
1947 status
= GdipSetClipPath(graphics
, NULL
, CombineModeReplace
);
1948 expect(InvalidParameter
, status
);
1951 status
= GdipGetClip(graphics
, clip
);
1953 status
= GdipIsInfiniteRegion(clip
, graphics
, &res
);
1957 /* remains infinite after reset */
1959 status
= GdipResetClip(graphics
);
1961 status
= GdipGetClip(graphics
, clip
);
1963 status
= GdipIsInfiniteRegion(clip
, graphics
, &res
);
1967 /* set to empty and then reset to infinite */
1968 status
= GdipSetEmpty(clip
);
1970 status
= GdipSetClipRegion(graphics
, clip
, CombineModeReplace
);
1973 status
= GdipGetClip(graphics
, clip
);
1976 status
= GdipIsEmptyRegion(clip
, graphics
, &res
);
1979 status
= GdipResetClip(graphics
);
1981 status
= GdipGetClip(graphics
, clip
);
1984 status
= GdipIsInfiniteRegion(clip
, graphics
, &res
);
1988 GdipDeleteRegion(clip
);
1990 GdipDeleteGraphics(graphics
);
1991 ReleaseDC(hwnd
, hdc
);
1994 static void test_isempty(void)
1997 GpGraphics
*graphics
= NULL
;
1998 HDC hdc
= GetDC( hwnd
);
2002 status
= GdipCreateFromHDC(hdc
, &graphics
);
2005 status
= GdipCreateRegion(&clip
);
2009 status
= GdipIsClipEmpty(NULL
, NULL
);
2010 expect(InvalidParameter
, status
);
2011 status
= GdipIsClipEmpty(graphics
, NULL
);
2012 expect(InvalidParameter
, status
);
2013 status
= GdipIsClipEmpty(NULL
, &res
);
2014 expect(InvalidParameter
, status
);
2016 /* default is infinite */
2018 status
= GdipIsClipEmpty(graphics
, &res
);
2022 GdipDeleteRegion(clip
);
2024 GdipDeleteGraphics(graphics
);
2025 ReleaseDC(hwnd
, hdc
);
2028 static void test_clear(void)
2032 status
= GdipGraphicsClear(NULL
, 0xdeadbeef);
2033 expect(InvalidParameter
, status
);
2036 static void test_textcontrast(void)
2039 HDC hdc
= GetDC( hwnd
);
2040 GpGraphics
*graphics
;
2043 status
= GdipGetTextContrast(NULL
, NULL
);
2044 expect(InvalidParameter
, status
);
2046 status
= GdipCreateFromHDC(hdc
, &graphics
);
2049 status
= GdipGetTextContrast(graphics
, NULL
);
2050 expect(InvalidParameter
, status
);
2051 status
= GdipGetTextContrast(graphics
, &contrast
);
2053 expect(4, contrast
);
2055 GdipDeleteGraphics(graphics
);
2056 ReleaseDC(hwnd
, hdc
);
2059 static void test_GdipDrawString(void)
2062 GpGraphics
*graphics
= NULL
;
2065 GpStringFormat
*format
;
2068 HDC hdc
= GetDC( hwnd
);
2069 static const WCHAR string
[] = {'T','e','s','t',0};
2070 static const PointF positions
[4] = {{0,0}, {1,1}, {2,2}, {3,3}};
2073 memset(&logfont
,0,sizeof(logfont
));
2074 strcpy(logfont
.lfFaceName
,"Arial");
2075 logfont
.lfHeight
= 12;
2076 logfont
.lfCharSet
= DEFAULT_CHARSET
;
2078 status
= GdipCreateFromHDC(hdc
, &graphics
);
2081 status
= GdipCreateFontFromLogfontA(hdc
, &logfont
, &fnt
);
2082 if (status
== NotTrueTypeFont
|| status
== FileNotFound
)
2084 skip("Arial not installed.\n");
2089 status
= GdipCreateSolidFill((ARGB
)0xdeadbeef, (GpSolidFill
**)&brush
);
2092 status
= GdipCreateStringFormat(0,0,&format
);
2100 status
= GdipDrawString(graphics
, string
, 4, fnt
, &rect
, format
, brush
);
2103 status
= GdipCreateMatrix(&matrix
);
2106 status
= GdipDrawDriverString(NULL
, string
, 4, fnt
, brush
, positions
, DriverStringOptionsCmapLookup
, matrix
);
2107 expect(InvalidParameter
, status
);
2109 status
= GdipDrawDriverString(graphics
, NULL
, 4, fnt
, brush
, positions
, DriverStringOptionsCmapLookup
, matrix
);
2110 expect(InvalidParameter
, status
);
2112 status
= GdipDrawDriverString(graphics
, string
, 4, NULL
, brush
, positions
, DriverStringOptionsCmapLookup
, matrix
);
2113 expect(InvalidParameter
, status
);
2115 status
= GdipDrawDriverString(graphics
, string
, 4, fnt
, NULL
, positions
, DriverStringOptionsCmapLookup
, matrix
);
2116 expect(InvalidParameter
, status
);
2118 status
= GdipDrawDriverString(graphics
, string
, 4, fnt
, brush
, NULL
, DriverStringOptionsCmapLookup
, matrix
);
2119 expect(InvalidParameter
, status
);
2121 status
= GdipDrawDriverString(graphics
, string
, 4, fnt
, brush
, positions
, DriverStringOptionsCmapLookup
|0x10, matrix
);
2124 status
= GdipDrawDriverString(graphics
, string
, 4, fnt
, brush
, positions
, DriverStringOptionsCmapLookup
, NULL
);
2127 status
= GdipDrawDriverString(graphics
, string
, 4, fnt
, brush
, positions
, DriverStringOptionsCmapLookup
, matrix
);
2130 GdipDeleteMatrix(matrix
);
2131 GdipDeleteGraphics(graphics
);
2132 GdipDeleteBrush(brush
);
2133 GdipDeleteFont(fnt
);
2134 GdipDeleteStringFormat(format
);
2136 ReleaseDC(hwnd
, hdc
);
2139 static void test_GdipGetVisibleClipBounds_screen(void)
2142 GpGraphics
*graphics
= NULL
;
2144 GpRectF rectf
, exp
, clipr
;
2147 ok(hdc
!= NULL
, "Expected HDC to be initialized\n");
2149 status
= GdipCreateFromHDC(hdc
, &graphics
);
2151 ok(graphics
!= NULL
, "Expected graphics to be initialized\n");
2153 /* no clipping rect */
2156 exp
.Width
= GetDeviceCaps(hdc
, HORZRES
);
2157 exp
.Height
= GetDeviceCaps(hdc
, VERTRES
);
2159 status
= GdipGetVisibleClipBounds(graphics
, &rectf
);
2161 ok(rectf
.X
== exp
.X
&&
2163 rectf
.Width
== exp
.Width
&&
2164 rectf
.Height
== exp
.Height
,
2165 "Expected clip bounds (%0.f, %0.f, %0.f, %0.f) to be the size of "
2166 "the screen (%0.f, %0.f, %0.f, %0.f)\n",
2167 rectf
.X
, rectf
.Y
, rectf
.Width
, rectf
.Height
,
2168 exp
.X
, exp
.Y
, exp
.Width
, exp
.Height
);
2170 /* clipping rect entirely within window */
2171 exp
.X
= clipr
.X
= 10;
2172 exp
.Y
= clipr
.Y
= 12;
2173 exp
.Width
= clipr
.Width
= 14;
2174 exp
.Height
= clipr
.Height
= 16;
2176 status
= GdipSetClipRect(graphics
, clipr
.X
, clipr
.Y
, clipr
.Width
, clipr
.Height
, CombineModeReplace
);
2179 status
= GdipGetVisibleClipBounds(graphics
, &rectf
);
2181 ok(rectf
.X
== exp
.X
&&
2183 rectf
.Width
== exp
.Width
&&
2184 rectf
.Height
== exp
.Height
,
2185 "Expected clip bounds (%0.f, %0.f, %0.f, %0.f) to be the size of "
2186 "the clipping rect (%0.f, %0.f, %0.f, %0.f)\n",
2187 rectf
.X
, rectf
.Y
, rectf
.Width
, rectf
.Height
,
2188 exp
.X
, exp
.Y
, exp
.Width
, exp
.Height
);
2190 /* clipping rect partially outside of screen */
2196 status
= GdipSetClipRect(graphics
, clipr
.X
, clipr
.Y
, clipr
.Width
, clipr
.Height
, CombineModeReplace
);
2204 status
= GdipGetVisibleClipBounds(graphics
, &rectf
);
2206 ok(rectf
.X
== exp
.X
&&
2208 rectf
.Width
== exp
.Width
&&
2209 rectf
.Height
== exp
.Height
,
2210 "Expected clip bounds (%0.f, %0.f, %0.f, %0.f) to be the size of "
2211 "the visible clipping rect (%0.f, %0.f, %0.f, %0.f)\n",
2212 rectf
.X
, rectf
.Y
, rectf
.Width
, rectf
.Height
,
2213 exp
.X
, exp
.Y
, exp
.Width
, exp
.Height
);
2215 status
= GdipGetVisibleClipBoundsI(graphics
, &recti
);
2217 ok(recti
.X
== exp
.X
&&
2219 recti
.Width
== exp
.Width
&&
2220 recti
.Height
== exp
.Height
,
2221 "Expected clip bounds (%d, %d, %d, %d) to be the size of "
2222 "the visible clipping rect (%0.f, %0.f, %0.f, %0.f)\n",
2223 recti
.X
, recti
.Y
, recti
.Width
, recti
.Height
,
2224 exp
.X
, exp
.Y
, exp
.Width
, exp
.Height
);
2226 GdipDeleteGraphics(graphics
);
2230 static void test_GdipGetVisibleClipBounds_window(void)
2233 GpGraphics
*graphics
= NULL
;
2234 GpRectF rectf
, window
, exp
, clipr
;
2240 /* get client area size */
2241 ok(GetClientRect(hwnd
, &wnd_rect
), "GetClientRect should have succeeded\n");
2242 window
.X
= wnd_rect
.left
;
2243 window
.Y
= wnd_rect
.top
;
2244 window
.Width
= wnd_rect
.right
- wnd_rect
.left
;
2245 window
.Height
= wnd_rect
.bottom
- wnd_rect
.top
;
2247 hdc
= BeginPaint(hwnd
, &ps
);
2249 status
= GdipCreateFromHDC(hdc
, &graphics
);
2251 ok(graphics
!= NULL
, "Expected graphics to be initialized\n");
2253 status
= GdipGetVisibleClipBounds(graphics
, &rectf
);
2255 ok(rectf
.X
== window
.X
&&
2256 rectf
.Y
== window
.Y
&&
2257 rectf
.Width
== window
.Width
&&
2258 rectf
.Height
== window
.Height
,
2259 "Expected clip bounds (%0.f, %0.f, %0.f, %0.f) to be the size of "
2260 "the window (%0.f, %0.f, %0.f, %0.f)\n",
2261 rectf
.X
, rectf
.Y
, rectf
.Width
, rectf
.Height
,
2262 window
.X
, window
.Y
, window
.Width
, window
.Height
);
2264 /* clipping rect entirely within window */
2265 exp
.X
= clipr
.X
= 20;
2266 exp
.Y
= clipr
.Y
= 8;
2267 exp
.Width
= clipr
.Width
= 30;
2268 exp
.Height
= clipr
.Height
= 20;
2270 status
= GdipSetClipRect(graphics
, clipr
.X
, clipr
.Y
, clipr
.Width
, clipr
.Height
, CombineModeReplace
);
2273 status
= GdipGetVisibleClipBounds(graphics
, &rectf
);
2275 ok(rectf
.X
== exp
.X
&&
2277 rectf
.Width
== exp
.Width
&&
2278 rectf
.Height
== exp
.Height
,
2279 "Expected clip bounds (%0.f, %0.f, %0.f, %0.f) to be the size of "
2280 "the clipping rect (%0.f, %0.f, %0.f, %0.f)\n",
2281 rectf
.X
, rectf
.Y
, rectf
.Width
, rectf
.Height
,
2282 exp
.X
, exp
.Y
, exp
.Width
, exp
.Height
);
2284 /* clipping rect partially outside of window */
2285 clipr
.X
= window
.Width
- 10;
2286 clipr
.Y
= window
.Height
- 15;
2290 status
= GdipSetClipRect(graphics
, clipr
.X
, clipr
.Y
, clipr
.Width
, clipr
.Height
, CombineModeReplace
);
2293 exp
.X
= window
.Width
- 10;
2294 exp
.Y
= window
.Height
- 15;
2298 status
= GdipGetVisibleClipBounds(graphics
, &rectf
);
2300 ok(rectf
.X
== exp
.X
&&
2302 rectf
.Width
== exp
.Width
&&
2303 rectf
.Height
== exp
.Height
,
2304 "Expected clip bounds (%0.f, %0.f, %0.f, %0.f) to be the size of "
2305 "the visible clipping rect (%0.f, %0.f, %0.f, %0.f)\n",
2306 rectf
.X
, rectf
.Y
, rectf
.Width
, rectf
.Height
,
2307 exp
.X
, exp
.Y
, exp
.Width
, exp
.Height
);
2309 status
= GdipGetVisibleClipBoundsI(graphics
, &recti
);
2311 ok(recti
.X
== exp
.X
&&
2313 recti
.Width
== exp
.Width
&&
2314 recti
.Height
== exp
.Height
,
2315 "Expected clip bounds (%d, %d, %d, %d) to be the size of "
2316 "the visible clipping rect (%0.f, %0.f, %0.f, %0.f)\n",
2317 recti
.X
, recti
.Y
, recti
.Width
, recti
.Height
,
2318 exp
.X
, exp
.Y
, exp
.Width
, exp
.Height
);
2320 GdipDeleteGraphics(graphics
);
2321 EndPaint(hwnd
, &ps
);
2324 static void test_GdipGetVisibleClipBounds(void)
2326 GpGraphics
* graphics
= NULL
;
2329 HDC hdc
= GetDC( hwnd
);
2332 status
= GdipCreateFromHDC(hdc
, &graphics
);
2334 ok(graphics
!= NULL
, "Expected graphics to be initialized\n");
2336 /* test null parameters */
2337 status
= GdipGetVisibleClipBounds(graphics
, NULL
);
2338 expect(InvalidParameter
, status
);
2340 status
= GdipGetVisibleClipBounds(NULL
, &rectf
);
2341 expect(InvalidParameter
, status
);
2343 status
= GdipGetVisibleClipBoundsI(graphics
, NULL
);
2344 expect(InvalidParameter
, status
);
2346 status
= GdipGetVisibleClipBoundsI(NULL
, &rect
);
2347 expect(InvalidParameter
, status
);
2349 GdipDeleteGraphics(graphics
);
2350 ReleaseDC(hwnd
, hdc
);
2352 test_GdipGetVisibleClipBounds_screen();
2353 test_GdipGetVisibleClipBounds_window();
2356 static void test_fromMemoryBitmap(void)
2359 GpGraphics
*graphics
= NULL
;
2360 GpBitmap
*bitmap
= NULL
;
2361 BYTE bits
[48] = {0};
2365 status
= GdipCreateBitmapFromScan0(4, 4, 12, PixelFormat24bppRGB
, bits
, &bitmap
);
2368 status
= GdipGetImageGraphicsContext((GpImage
*)bitmap
, &graphics
);
2371 status
= GdipGraphicsClear(graphics
, 0xff686868);
2374 GdipDeleteGraphics(graphics
);
2376 /* drawing writes to the memory provided */
2377 expect(0x68, bits
[10]);
2379 status
= GdipGetImageGraphicsContext((GpImage
*)bitmap
, &graphics
);
2382 status
= GdipGetDC(graphics
, &hdc
);
2384 ok(hdc
!= NULL
, "got NULL hdc\n");
2386 color
= GetPixel(hdc
, 0, 0);
2387 /* The HDC is write-only, and native fills with a solid color to figure out
2388 * which pixels have changed. */
2389 todo_wine
expect(0x0c0b0d, color
);
2391 SetPixel(hdc
, 0, 0, 0x797979);
2392 SetPixel(hdc
, 1, 0, 0x0c0b0d);
2394 status
= GdipReleaseDC(graphics
, hdc
);
2397 GdipDeleteGraphics(graphics
);
2399 expect(0x79, bits
[0]);
2400 todo_wine
expect(0x68, bits
[3]);
2402 GdipDisposeImage((GpImage
*)bitmap
);
2404 /* We get the same kind of write-only HDC for a "normal" bitmap */
2405 status
= GdipCreateBitmapFromScan0(4, 4, 12, PixelFormat24bppRGB
, NULL
, &bitmap
);
2408 status
= GdipGetImageGraphicsContext((GpImage
*)bitmap
, &graphics
);
2411 status
= GdipGetDC(graphics
, &hdc
);
2413 ok(hdc
!= NULL
, "got NULL hdc\n");
2415 color
= GetPixel(hdc
, 0, 0);
2416 todo_wine
expect(0x0c0b0d, color
);
2418 status
= GdipReleaseDC(graphics
, hdc
);
2421 GdipDeleteGraphics(graphics
);
2423 GdipDisposeImage((GpImage
*)bitmap
);
2426 static void test_GdipIsVisiblePoint(void)
2429 GpGraphics
*graphics
= NULL
;
2430 HDC hdc
= GetDC( hwnd
);
2434 ok(hdc
!= NULL
, "Expected HDC to be initialized\n");
2436 status
= GdipCreateFromHDC(hdc
, &graphics
);
2438 ok(graphics
!= NULL
, "Expected graphics to be initialized\n");
2440 /* null parameters */
2441 status
= GdipIsVisiblePoint(NULL
, 0, 0, &val
);
2442 expect(InvalidParameter
, status
);
2444 status
= GdipIsVisiblePoint(graphics
, 0, 0, NULL
);
2445 expect(InvalidParameter
, status
);
2447 status
= GdipIsVisiblePointI(NULL
, 0, 0, &val
);
2448 expect(InvalidParameter
, status
);
2450 status
= GdipIsVisiblePointI(graphics
, 0, 0, NULL
);
2451 expect(InvalidParameter
, status
);
2455 status
= GdipIsVisiblePoint(graphics
, x
, y
, &val
);
2457 ok(val
== TRUE
, "Expected (%.2f, %.2f) to be visible\n", x
, y
);
2461 status
= GdipIsVisiblePoint(graphics
, x
, y
, &val
);
2463 ok(val
== FALSE
, "Expected (%.2f, %.2f) not to be visible\n", x
, y
);
2467 status
= GdipIsVisiblePoint(graphics
, x
, y
, &val
);
2469 ok(val
== FALSE
, "Expected (%.2f, %.2f) not to be visible\n", x
, y
);
2473 status
= GdipIsVisiblePoint(graphics
, x
, y
, &val
);
2475 ok(val
== TRUE
, "Expected (%.2f, %.2f) to be visible\n", x
, y
);
2477 status
= GdipSetClipRect(graphics
, 10, 20, 30, 40, CombineModeReplace
);
2482 status
= GdipIsVisiblePoint(graphics
, x
, y
, &val
);
2484 ok(val
== FALSE
, "After clipping, expected (%.2f, %.2f) not to be visible\n", x
, y
);
2488 status
= GdipIsVisiblePoint(graphics
, x
, y
, &val
);
2490 ok(val
== TRUE
, "After clipping, expected (%.2f, %.2f) to be visible\n", x
, y
);
2492 /* translate into the center of the rect */
2493 GdipTranslateWorldTransform(graphics
, 25, 40, MatrixOrderAppend
);
2497 status
= GdipIsVisiblePoint(graphics
, x
, y
, &val
);
2499 ok(val
== TRUE
, "Expected (%.2f, %.2f) to be visible\n", x
, y
);
2503 status
= GdipIsVisiblePoint(graphics
, x
, y
, &val
);
2505 ok(val
== FALSE
, "Expected (%.2f, %.2f) not to be visible\n", x
, y
);
2507 GdipTranslateWorldTransform(graphics
, -25, -40, MatrixOrderAppend
);
2512 status
= GdipIsVisiblePoint(graphics
, x
, y
, &val
);
2514 ok(val
== FALSE
, "After clipping, expected (%.2f, %.2f) not to be visible\n", x
, y
);
2518 status
= GdipIsVisiblePoint(graphics
, x
, y
, &val
);
2520 ok(val
== FALSE
, "After clipping, expected (%.2f, %.2f) not to be visible\n", x
, y
);
2524 status
= GdipIsVisiblePoint(graphics
, x
, y
, &val
);
2526 ok(val
== TRUE
, "After clipping, expected (%.2f, %.2f) to be visible\n", x
, y
);
2530 status
= GdipIsVisiblePoint(graphics
, x
, y
, &val
);
2532 ok(val
== TRUE
, "After clipping, expected (%.2f, %.2f) to be visible\n", x
, y
);
2536 status
= GdipIsVisiblePoint(graphics
, x
, y
, &val
);
2538 ok(val
== TRUE
, "After clipping, expected (%.2f, %.2f) to be visible\n", x
, y
);
2542 status
= GdipIsVisiblePoint(graphics
, x
, y
, &val
);
2544 ok(val
== FALSE
, "After clipping, expected (%.2f, %.2f) not to be visible\n", x
, y
);
2548 status
= GdipIsVisiblePoint(graphics
, x
, y
, &val
);
2550 ok(val
== TRUE
, "After clipping, expected (%.2f, %.2f) to be visible\n", x
, y
);
2554 status
= GdipIsVisiblePoint(graphics
, x
, y
, &val
);
2556 ok(val
== TRUE
, "After clipping, expected (%.2f, %.2f) to be visible\n", x
, y
);
2560 status
= GdipIsVisiblePoint(graphics
, x
, y
, &val
);
2562 ok(val
== FALSE
, "After clipping, expected (%.2f, %.2f) not to be visible\n", x
, y
);
2566 status
= GdipIsVisiblePoint(graphics
, x
, y
, &val
);
2568 ok(val
== FALSE
, "After clipping, expected (%.2f, %.2f) not to be visible\n", x
, y
);
2572 status
= GdipIsVisiblePoint(graphics
, x
, y
, &val
);
2574 ok(val
== FALSE
, "After clipping, expected (%.2f, %.2f) not to be visible\n", x
, y
);
2578 status
= GdipIsVisiblePoint(graphics
, x
, y
, &val
);
2580 ok(val
== FALSE
, "After clipping, expected (%.2f, %.2f) not to be visible\n", x
, y
);
2584 status
= GdipIsVisiblePoint(graphics
, x
, y
, &val
);
2586 ok(val
== FALSE
, "After clipping, expected (%.2f, %.2f) not to be visible\n", x
, y
);
2588 /* integer version */
2591 status
= GdipIsVisiblePointI(graphics
, (INT
)x
, (INT
)y
, &val
);
2593 ok(val
== TRUE
, "After clipping, expected (%.2f, %.2f) to be visible\n", x
, y
);
2597 status
= GdipIsVisiblePointI(graphics
, (INT
)x
, (INT
)y
, &val
);
2599 ok(val
== FALSE
, "After clipping, expected (%.2f, %.2f) not to be visible\n", x
, y
);
2601 GdipDeleteGraphics(graphics
);
2602 ReleaseDC(hwnd
, hdc
);
2605 static void test_GdipIsVisibleRect(void)
2608 GpGraphics
*graphics
= NULL
;
2609 HDC hdc
= GetDC( hwnd
);
2610 REAL x
, y
, width
, height
;
2613 ok(hdc
!= NULL
, "Expected HDC to be initialized\n");
2615 status
= GdipCreateFromHDC(hdc
, &graphics
);
2617 ok(graphics
!= NULL
, "Expected graphics to be initialized\n");
2619 status
= GdipIsVisibleRect(NULL
, 0, 0, 0, 0, &val
);
2620 expect(InvalidParameter
, status
);
2622 status
= GdipIsVisibleRect(graphics
, 0, 0, 0, 0, NULL
);
2623 expect(InvalidParameter
, status
);
2625 status
= GdipIsVisibleRectI(NULL
, 0, 0, 0, 0, &val
);
2626 expect(InvalidParameter
, status
);
2628 status
= GdipIsVisibleRectI(graphics
, 0, 0, 0, 0, NULL
);
2629 expect(InvalidParameter
, status
);
2631 /* entirely within the visible region */
2634 status
= GdipIsVisibleRect(graphics
, x
, y
, width
, height
, &val
);
2636 ok(val
== TRUE
, "Expected (%.2f, %.2f, %.2f, %.2f) to be visible\n", x
, y
, width
, height
);
2638 /* partially outside */
2639 x
= -10; width
= 20;
2640 y
= -10; height
= 20;
2641 status
= GdipIsVisibleRect(graphics
, x
, y
, width
, height
, &val
);
2643 ok(val
== TRUE
, "Expected (%.2f, %.2f, %.2f, %.2f) to be visible\n", x
, y
, width
, height
);
2645 /* entirely outside */
2647 y
= -10; height
= 5;
2648 status
= GdipIsVisibleRect(graphics
, x
, y
, width
, height
, &val
);
2650 ok(val
== FALSE
, "Expected (%.2f, %.2f, %.2f, %.2f) not to be visible\n", x
, y
, width
, height
);
2652 status
= GdipSetClipRect(graphics
, 10, 20, 30, 40, CombineModeReplace
);
2655 /* entirely within the visible region */
2657 y
= 22; height
= 10;
2658 status
= GdipIsVisibleRect(graphics
, x
, y
, width
, height
, &val
);
2660 ok(val
== TRUE
, "Expected (%.2f, %.2f, %.2f, %.2f) to be visible\n", x
, y
, width
, height
);
2662 /* partially outside */
2664 y
= 55; height
= 10;
2665 status
= GdipIsVisibleRect(graphics
, x
, y
, width
, height
, &val
);
2667 ok(val
== TRUE
, "Expected (%.2f, %.2f, %.2f, %.2f) to be visible\n", x
, y
, width
, height
);
2669 /* entirely outside */
2672 status
= GdipIsVisibleRect(graphics
, x
, y
, width
, height
, &val
);
2674 ok(val
== FALSE
, "Expected (%.2f, %.2f, %.2f, %.2f) not to be visible\n", x
, y
, width
, height
);
2676 /* translate into center of clipping rect */
2677 GdipTranslateWorldTransform(graphics
, 25, 40, MatrixOrderAppend
);
2681 status
= GdipIsVisibleRect(graphics
, x
, y
, width
, height
, &val
);
2683 ok(val
== TRUE
, "Expected (%.2f, %.2f, %.2f, %.2f) to be visible\n", x
, y
, width
, height
);
2687 status
= GdipIsVisibleRect(graphics
, x
, y
, width
, height
, &val
);
2689 ok(val
== FALSE
, "Expected (%.2f, %.2f, %.2f, %.2f) not to be visible\n", x
, y
, width
, height
);
2691 GdipTranslateWorldTransform(graphics
, -25, -40, MatrixOrderAppend
);
2693 /* corners entirely outside, but some intersections */
2696 status
= GdipIsVisibleRect(graphics
, x
, y
, width
, height
, &val
);
2698 ok(val
== TRUE
, "Expected (%.2f, %.2f, %.2f, %.2f) to be visible\n", x
, y
, width
, height
);
2702 status
= GdipIsVisibleRect(graphics
, x
, y
, width
, height
, &val
);
2704 ok(val
== TRUE
, "Expected (%.2f, %.2f, %.2f, %.2f) to be visible\n", x
, y
, width
, height
);
2708 status
= GdipIsVisibleRect(graphics
, x
, y
, width
, height
, &val
);
2710 ok(val
== TRUE
, "Expected (%.2f, %.2f, %.2f, %.2f) to be visible\n", x
, y
, width
, height
);
2714 y
= 20; height
= 40;
2715 status
= GdipIsVisibleRect(graphics
, x
, y
, width
, height
, &val
);
2717 ok(val
== FALSE
, "Expected (%.2f, %.2f, %.2f, %.2f) not to be visible\n", x
, y
, width
, height
);
2721 status
= GdipIsVisibleRect(graphics
, x
, y
, width
, height
, &val
);
2723 ok(val
== FALSE
, "Expected (%.2f, %.2f, %.2f, %.2f) not to be visible\n", x
, y
, width
, height
);
2726 y
= 20; height
= 40;
2727 status
= GdipIsVisibleRect(graphics
, x
, y
, width
, height
, &val
);
2729 ok(val
== FALSE
, "Expected (%.2f, %.2f, %.2f, %.2f) not to be visible\n", x
, y
, width
, height
);
2732 y
= 60; height
= 10;
2733 status
= GdipIsVisibleRect(graphics
, x
, y
, width
, height
, &val
);
2735 ok(val
== FALSE
, "Expected (%.2f, %.2f, %.2f, %.2f) not to be visible\n", x
, y
, width
, height
);
2737 /* rounding tests */
2738 x
= 0.4; width
= 10.4;
2739 y
= 20; height
= 40;
2740 status
= GdipIsVisibleRect(graphics
, x
, y
, width
, height
, &val
);
2742 ok(val
== TRUE
, "Expected (%.2f, %.2f, %.2f, %.2f) to be visible\n", x
, y
, width
, height
);
2745 y
= 0.4; height
= 20.4;
2746 status
= GdipIsVisibleRect(graphics
, x
, y
, width
, height
, &val
);
2748 ok(val
== TRUE
, "Expected (%.2f, %.2f, %.2f, %.2f) to be visible\n", x
, y
, width
, height
);
2750 /* integer version */
2753 status
= GdipIsVisibleRectI(graphics
, (INT
)x
, (INT
)y
, (INT
)width
, (INT
)height
, &val
);
2755 ok(val
== TRUE
, "Expected (%.2f, %.2f, %.2f, %.2f) to be visible\n", x
, y
, width
, height
);
2758 y
= 22; height
= 10;
2759 status
= GdipIsVisibleRectI(graphics
, (INT
)x
, (INT
)y
, (INT
)width
, (INT
)height
, &val
);
2761 ok(val
== TRUE
, "Expected (%.2f, %.2f, %.2f, %.2f) to be visible\n", x
, y
, width
, height
);
2763 GdipDeleteGraphics(graphics
);
2764 ReleaseDC(hwnd
, hdc
);
2767 static void test_GdipGetNearestColor(void)
2770 GpGraphics
*graphics
;
2772 ARGB color
= 0xdeadbeef;
2773 HDC hdc
= GetDC( hwnd
);
2775 /* create a graphics object */
2776 ok(hdc
!= NULL
, "Expected HDC to be initialized\n");
2778 status
= GdipCreateFromHDC(hdc
, &graphics
);
2780 ok(graphics
!= NULL
, "Expected graphics to be initialized\n");
2782 status
= GdipGetNearestColor(graphics
, NULL
);
2783 expect(InvalidParameter
, status
);
2785 status
= GdipGetNearestColor(NULL
, &color
);
2786 expect(InvalidParameter
, status
);
2787 GdipDeleteGraphics(graphics
);
2789 status
= GdipCreateBitmapFromScan0(10, 10, 10, PixelFormat1bppIndexed
, NULL
, &bitmap
);
2791 status
= GdipGetImageGraphicsContext((GpImage
*)bitmap
, &graphics
);
2792 ok(broken(status
== OutOfMemory
) /* winver < Win7 */ || status
== Ok
, "status=%u\n", status
);
2795 status
= GdipGetNearestColor(graphics
, &color
);
2797 expect(0xdeadbeef, color
);
2798 GdipDeleteGraphics(graphics
);
2800 GdipDisposeImage((GpImage
*)bitmap
);
2802 status
= GdipCreateBitmapFromScan0(10, 10, 10, PixelFormat4bppIndexed
, NULL
, &bitmap
);
2804 status
= GdipGetImageGraphicsContext((GpImage
*)bitmap
, &graphics
);
2805 ok(broken(status
== OutOfMemory
) /* winver < Win7 */ || status
== Ok
, "status=%u\n", status
);
2808 status
= GdipGetNearestColor(graphics
, &color
);
2810 expect(0xdeadbeef, color
);
2811 GdipDeleteGraphics(graphics
);
2813 GdipDisposeImage((GpImage
*)bitmap
);
2815 status
= GdipCreateBitmapFromScan0(10, 10, 10, PixelFormat8bppIndexed
, NULL
, &bitmap
);
2817 status
= GdipGetImageGraphicsContext((GpImage
*)bitmap
, &graphics
);
2818 ok(broken(status
== OutOfMemory
) /* winver < Win7 */ || status
== Ok
, "status=%u\n", status
);
2821 status
= GdipGetNearestColor(graphics
, &color
);
2823 expect(0xdeadbeef, color
);
2824 GdipDeleteGraphics(graphics
);
2826 GdipDisposeImage((GpImage
*)bitmap
);
2828 status
= GdipCreateBitmapFromScan0(10, 10, 10, PixelFormat16bppGrayScale
, NULL
, &bitmap
);
2830 status
= GdipGetImageGraphicsContext((GpImage
*)bitmap
, &graphics
);
2831 todo_wine
expect(OutOfMemory
, status
);
2833 GdipDeleteGraphics(graphics
);
2834 GdipDisposeImage((GpImage
*)bitmap
);
2836 status
= GdipCreateBitmapFromScan0(10, 10, 10, PixelFormat24bppRGB
, NULL
, &bitmap
);
2838 status
= GdipGetImageGraphicsContext((GpImage
*)bitmap
, &graphics
);
2840 status
= GdipGetNearestColor(graphics
, &color
);
2842 expect(0xdeadbeef, color
);
2843 GdipDeleteGraphics(graphics
);
2844 GdipDisposeImage((GpImage
*)bitmap
);
2846 status
= GdipCreateBitmapFromScan0(10, 10, 10, PixelFormat32bppRGB
, NULL
, &bitmap
);
2848 status
= GdipGetImageGraphicsContext((GpImage
*)bitmap
, &graphics
);
2850 status
= GdipGetNearestColor(graphics
, &color
);
2852 expect(0xdeadbeef, color
);
2853 GdipDeleteGraphics(graphics
);
2854 GdipDisposeImage((GpImage
*)bitmap
);
2856 status
= GdipCreateBitmapFromScan0(10, 10, 10, PixelFormat32bppARGB
, NULL
, &bitmap
);
2858 status
= GdipGetImageGraphicsContext((GpImage
*)bitmap
, &graphics
);
2860 status
= GdipGetNearestColor(graphics
, &color
);
2862 expect(0xdeadbeef, color
);
2863 GdipDeleteGraphics(graphics
);
2864 GdipDisposeImage((GpImage
*)bitmap
);
2866 status
= GdipCreateBitmapFromScan0(10, 10, 10, PixelFormat48bppRGB
, NULL
, &bitmap
);
2870 status
= GdipGetImageGraphicsContext((GpImage
*)bitmap
, &graphics
);
2872 status
= GdipGetNearestColor(graphics
, &color
);
2874 expect(0xdeadbeef, color
);
2875 GdipDeleteGraphics(graphics
);
2876 GdipDisposeImage((GpImage
*)bitmap
);
2879 status
= GdipCreateBitmapFromScan0(10, 10, 10, PixelFormat64bppARGB
, NULL
, &bitmap
);
2883 status
= GdipGetImageGraphicsContext((GpImage
*)bitmap
, &graphics
);
2885 status
= GdipGetNearestColor(graphics
, &color
);
2887 expect(0xdeadbeef, color
);
2888 GdipDeleteGraphics(graphics
);
2889 GdipDisposeImage((GpImage
*)bitmap
);
2892 status
= GdipCreateBitmapFromScan0(10, 10, 10, PixelFormat64bppPARGB
, NULL
, &bitmap
);
2896 status
= GdipGetImageGraphicsContext((GpImage
*)bitmap
, &graphics
);
2898 status
= GdipGetNearestColor(graphics
, &color
);
2900 expect(0xdeadbeef, color
);
2901 GdipDeleteGraphics(graphics
);
2902 GdipDisposeImage((GpImage
*)bitmap
);
2905 status
= GdipCreateBitmapFromScan0(10, 10, 10, PixelFormat16bppRGB565
, NULL
, &bitmap
);
2907 status
= GdipGetImageGraphicsContext((GpImage
*)bitmap
, &graphics
);
2909 status
= GdipGetNearestColor(graphics
, &color
);
2911 todo_wine
expect(0xffa8bce8, color
);
2912 GdipDeleteGraphics(graphics
);
2913 GdipDisposeImage((GpImage
*)bitmap
);
2915 status
= GdipCreateBitmapFromScan0(10, 10, 10, PixelFormat16bppRGB555
, NULL
, &bitmap
);
2917 status
= GdipGetImageGraphicsContext((GpImage
*)bitmap
, &graphics
);
2919 status
= GdipGetNearestColor(graphics
, &color
);
2922 ok(color
== 0xffa8b8e8 ||
2923 broken(color
== 0xffa0b8e0), /* Win98/WinMe */
2924 "Expected ffa8b8e8, got %.8x\n", color
);
2925 GdipDeleteGraphics(graphics
);
2926 GdipDisposeImage((GpImage
*)bitmap
);
2928 ReleaseDC(hwnd
, hdc
);
2931 static void test_string_functions(void)
2934 GpGraphics
*graphics
;
2935 GpFontFamily
*family
;
2937 RectF rc
, char_bounds
, bounds
;
2939 ARGB color
= 0xff000000;
2940 HDC hdc
= GetDC( hwnd
);
2941 const WCHAR fontname
[] = {'T','a','h','o','m','a',0};
2942 const WCHAR teststring
[] = {'M','M',' ','M','\n','M',0};
2943 const WCHAR teststring2
[] = {'j',0};
2944 REAL char_width
, char_height
;
2945 INT codepointsfitted
, linesfilled
;
2946 GpStringFormat
*format
;
2947 CharacterRange ranges
[3] = {{0, 1}, {1, 3}, {5, 1}};
2948 GpRegion
*regions
[4];
2949 BOOL region_isempty
[4];
2951 PointF positions
[8];
2954 ok(hdc
!= NULL
, "Expected HDC to be initialized\n");
2955 status
= GdipCreateFromHDC(hdc
, &graphics
);
2957 ok(graphics
!= NULL
, "Expected graphics to be initialized\n");
2959 status
= GdipCreateFontFamilyFromName(fontname
, NULL
, &family
);
2962 status
= GdipCreateFont(family
, 10.0, FontStyleRegular
, UnitPixel
, &font
);
2965 status
= GdipCreateSolidFill(color
, (GpSolidFill
**)&brush
);
2968 status
= GdipCreateStringFormat(0, LANG_NEUTRAL
, &format
);
2976 status
= GdipDrawString(NULL
, teststring
, 6, font
, &rc
, NULL
, brush
);
2977 expect(InvalidParameter
, status
);
2979 status
= GdipDrawString(graphics
, NULL
, 6, font
, &rc
, NULL
, brush
);
2980 expect(InvalidParameter
, status
);
2982 status
= GdipDrawString(graphics
, teststring
, 6, NULL
, &rc
, NULL
, brush
);
2983 expect(InvalidParameter
, status
);
2985 status
= GdipDrawString(graphics
, teststring
, 6, font
, NULL
, NULL
, brush
);
2986 expect(InvalidParameter
, status
);
2988 status
= GdipDrawString(graphics
, teststring
, 6, font
, &rc
, NULL
, NULL
);
2989 expect(InvalidParameter
, status
);
2991 status
= GdipDrawString(graphics
, teststring
, 6, font
, &rc
, NULL
, brush
);
2994 status
= GdipMeasureString(NULL
, teststring
, 6, font
, &rc
, NULL
, &bounds
, &codepointsfitted
, &linesfilled
);
2995 expect(InvalidParameter
, status
);
2997 status
= GdipMeasureString(graphics
, NULL
, 6, font
, &rc
, NULL
, &bounds
, &codepointsfitted
, &linesfilled
);
2998 expect(InvalidParameter
, status
);
3000 status
= GdipMeasureString(graphics
, teststring
, 6, NULL
, &rc
, NULL
, &bounds
, &codepointsfitted
, &linesfilled
);
3001 expect(InvalidParameter
, status
);
3003 status
= GdipMeasureString(graphics
, teststring
, 6, font
, NULL
, NULL
, &bounds
, &codepointsfitted
, &linesfilled
);
3004 expect(InvalidParameter
, status
);
3006 status
= GdipMeasureString(graphics
, teststring
, 6, font
, &rc
, NULL
, NULL
, &codepointsfitted
, &linesfilled
);
3007 expect(InvalidParameter
, status
);
3009 status
= GdipMeasureString(graphics
, teststring
, 6, font
, &rc
, NULL
, &bounds
, NULL
, &linesfilled
);
3012 status
= GdipMeasureString(graphics
, teststring
, 6, font
, &rc
, NULL
, &bounds
, &codepointsfitted
, NULL
);
3015 status
= GdipMeasureString(graphics
, teststring
, 1, font
, &rc
, NULL
, &char_bounds
, &codepointsfitted
, &linesfilled
);
3017 expectf(0.0, char_bounds
.X
);
3018 expectf(0.0, char_bounds
.Y
);
3019 ok(char_bounds
.Width
> 0, "got %0.2f\n", bounds
.Width
);
3020 ok(char_bounds
.Height
> 0, "got %0.2f\n", bounds
.Height
);
3021 expect(1, codepointsfitted
);
3022 expect(1, linesfilled
);
3024 status
= GdipMeasureString(graphics
, teststring
, 2, font
, &rc
, NULL
, &bounds
, &codepointsfitted
, &linesfilled
);
3026 expectf(0.0, bounds
.X
);
3027 expectf(0.0, bounds
.Y
);
3028 ok(bounds
.Width
> char_bounds
.Width
, "got %0.2f, expected at least %0.2f\n", bounds
.Width
, char_bounds
.Width
);
3029 expectf(char_bounds
.Height
, bounds
.Height
);
3030 expect(2, codepointsfitted
);
3031 expect(1, linesfilled
);
3032 char_width
= bounds
.Width
- char_bounds
.Width
;
3034 status
= GdipMeasureString(graphics
, teststring
, 6, font
, &rc
, NULL
, &bounds
, &codepointsfitted
, &linesfilled
);
3036 expectf(0.0, bounds
.X
);
3037 expectf(0.0, bounds
.Y
);
3038 ok(bounds
.Width
> char_bounds
.Width
+ char_width
* 2, "got %0.2f, expected at least %0.2f\n",
3039 bounds
.Width
, char_bounds
.Width
+ char_width
* 2);
3040 ok(bounds
.Height
> char_bounds
.Height
, "got %0.2f, expected at least %0.2f\n", bounds
.Height
, char_bounds
.Height
);
3041 expect(6, codepointsfitted
);
3042 expect(2, linesfilled
);
3043 char_height
= bounds
.Height
- char_bounds
.Height
;
3045 /* Measure the first line. */
3046 status
= GdipMeasureString(graphics
, teststring
, 4, font
, &rc
, NULL
, &bounds
, &codepointsfitted
, &linesfilled
);
3048 expectf(0.0, bounds
.X
);
3049 expectf(0.0, bounds
.Y
);
3050 expect(4, codepointsfitted
);
3051 expect(1, linesfilled
);
3053 /* Give just enough space to fit the first line. */
3054 rc
.Width
= bounds
.Width
;
3055 status
= GdipMeasureString(graphics
, teststring
, 5, font
, &rc
, NULL
, &bounds
, &codepointsfitted
, &linesfilled
);
3057 expectf(0.0, bounds
.X
);
3058 expectf(0.0, bounds
.Y
);
3059 todo_wine
expect(5, codepointsfitted
);
3060 todo_wine
expect(1, linesfilled
);
3062 /* Cut off everything after the first space. */
3063 rc
.Width
= char_bounds
.Width
+ char_width
* 2.1;
3065 status
= GdipMeasureString(graphics
, teststring
, 6, font
, &rc
, NULL
, &bounds
, &codepointsfitted
, &linesfilled
);
3067 expectf(0.0, bounds
.X
);
3068 expectf(0.0, bounds
.Y
);
3069 expectf_(char_bounds
.Width
+ char_width
, bounds
.Width
, 0.01);
3070 expectf_(char_bounds
.Height
+ char_height
* 2, bounds
.Height
, 0.01);
3071 expect(6, codepointsfitted
);
3072 expect(3, linesfilled
);
3074 /* Cut off everything including the first space. */
3075 rc
.Width
= char_bounds
.Width
+ char_width
* 1.7;
3077 status
= GdipMeasureString(graphics
, teststring
, 6, font
, &rc
, NULL
, &bounds
, &codepointsfitted
, &linesfilled
);
3079 expectf(0.0, bounds
.X
);
3080 expectf(0.0, bounds
.Y
);
3081 expectf_(char_bounds
.Width
+ char_width
, bounds
.Width
, 0.01);
3082 expectf_(char_bounds
.Height
+ char_height
* 2, bounds
.Height
, 0.01);
3083 expect(6, codepointsfitted
);
3084 expect(3, linesfilled
);
3086 /* Cut off everything after the first character. */
3087 rc
.Width
= char_bounds
.Width
+ char_width
* 0.8;
3089 status
= GdipMeasureString(graphics
, teststring
, 6, font
, &rc
, NULL
, &bounds
, &codepointsfitted
, &linesfilled
);
3091 expectf(0.0, bounds
.X
);
3092 expectf(0.0, bounds
.Y
);
3093 expectf_(char_bounds
.Width
, bounds
.Width
, 0.01);
3094 expectf_(char_bounds
.Height
+ char_height
* 3, bounds
.Height
, 0.05);
3095 expect(6, codepointsfitted
);
3096 todo_wine
expect(4, linesfilled
);
3098 for (i
= 0; i
< 4; i
++)
3099 regions
[i
] = (GpRegion
*)0xdeadbeef;
3101 status
= GdipMeasureCharacterRanges(graphics
, teststring
, 6, font
, &rc
, format
, 0, regions
);
3104 for (i
= 0; i
< 4; i
++)
3105 ok(regions
[i
] == (GpRegion
*)0xdeadbeef, "expected 0xdeadbeef, got %p\n", regions
[i
]);
3107 status
= GdipMeasureCharacterRanges(graphics
, teststring
, 6, font
, &rc
, format
, 3, regions
);
3110 for (i
= 0; i
< 4; i
++)
3111 ok(regions
[i
] == (GpRegion
*)0xdeadbeef, "expected 0xdeadbeef, got %p\n", regions
[i
]);
3113 status
= GdipSetStringFormatMeasurableCharacterRanges(format
, 3, ranges
);
3116 set_rect_empty(&rc
);
3120 status
= GdipCreateRegion(®ions
[i
]);
3122 status
= GdipSetEmpty(regions
[i
]);
3126 status
= GdipMeasureCharacterRanges(NULL
, teststring
, 6, font
, &rc
, format
, 3, regions
);
3127 expect(InvalidParameter
, status
);
3129 status
= GdipMeasureCharacterRanges(graphics
, NULL
, 6, font
, &rc
, format
, 3, regions
);
3130 expect(InvalidParameter
, status
);
3132 status
= GdipMeasureCharacterRanges(graphics
, teststring
, 6, NULL
, &rc
, format
, 3, regions
);
3133 expect(InvalidParameter
, status
);
3135 status
= GdipMeasureCharacterRanges(graphics
, teststring
, 6, font
, NULL
, format
, 3, regions
);
3136 expect(InvalidParameter
, status
);
3140 /* Crashes on Windows XP */
3141 status
= GdipMeasureCharacterRanges(graphics
, teststring
, 6, font
, &rc
, NULL
, 3, regions
);
3142 expect(InvalidParameter
, status
);
3145 status
= GdipMeasureCharacterRanges(graphics
, teststring
, 6, font
, &rc
, format
, 3, NULL
);
3146 expect(InvalidParameter
, status
);
3148 status
= GdipMeasureCharacterRanges(graphics
, teststring
, 6, font
, &rc
, format
, 2, regions
);
3149 expect(InvalidParameter
, status
);
3151 status
= GdipMeasureCharacterRanges(graphics
, teststring
, 6, font
, &rc
, format
, 3, regions
);
3154 for (i
= 0; i
< 4; i
++)
3156 status
= GdipIsEmptyRegion(regions
[i
], graphics
, ®ion_isempty
[i
]);
3160 ok(region_isempty
[0], "region should be empty\n");
3161 ok(region_isempty
[1], "region should be empty\n");
3162 ok(region_isempty
[2], "region should be empty\n");
3163 ok(region_isempty
[3], "region should be empty\n");
3168 status
= GdipMeasureCharacterRanges(graphics
, teststring
, 6, font
, &rc
, format
, 4, regions
);
3173 status
= GdipIsEmptyRegion(regions
[i
], graphics
, ®ion_isempty
[i
]);
3177 ok(!region_isempty
[0], "region shouldn't be empty\n");
3178 ok(!region_isempty
[1], "region shouldn't be empty\n");
3179 ok(!region_isempty
[2], "region shouldn't be empty\n");
3180 ok(region_isempty
[3], "region should be empty\n");
3182 /* Cut off everything after the first space, and the second line. */
3183 rc
.Width
= char_bounds
.Width
+ char_width
* 2.1;
3184 rc
.Height
= char_bounds
.Height
+ char_height
* 0.5;
3186 status
= GdipMeasureCharacterRanges(graphics
, teststring
, 6, font
, &rc
, format
, 3, regions
);
3191 status
= GdipIsEmptyRegion(regions
[i
], graphics
, ®ion_isempty
[i
]);
3195 ok(!region_isempty
[0], "region shouldn't be empty\n");
3196 ok(!region_isempty
[1], "region shouldn't be empty\n");
3197 ok(region_isempty
[2], "region should be empty\n");
3198 ok(region_isempty
[3], "region should be empty\n");
3201 GdipDeleteRegion(regions
[i
]);
3203 status
= GdipCreateMatrix(&identity
);
3210 memset(positions
, 0, sizeof(positions
));
3211 status
= GdipMeasureDriverString(NULL
, teststring
, 6, font
, positions
,
3212 DriverStringOptionsCmapLookup
|DriverStringOptionsRealizedAdvance
,
3214 expect(InvalidParameter
, status
);
3216 status
= GdipMeasureDriverString(graphics
, NULL
, 6, font
, positions
,
3217 DriverStringOptionsCmapLookup
|DriverStringOptionsRealizedAdvance
,
3219 expect(InvalidParameter
, status
);
3221 status
= GdipMeasureDriverString(graphics
, teststring
, 6, NULL
, positions
,
3222 DriverStringOptionsCmapLookup
|DriverStringOptionsRealizedAdvance
,
3224 expect(InvalidParameter
, status
);
3226 status
= GdipMeasureDriverString(graphics
, teststring
, 6, font
, NULL
,
3227 DriverStringOptionsCmapLookup
|DriverStringOptionsRealizedAdvance
,
3229 expect(InvalidParameter
, status
);
3231 status
= GdipMeasureDriverString(graphics
, teststring
, 6, font
, positions
,
3232 0x100, identity
, &rc
);
3235 status
= GdipMeasureDriverString(graphics
, teststring
, 6, font
, positions
,
3236 DriverStringOptionsCmapLookup
|DriverStringOptionsRealizedAdvance
,
3240 status
= GdipMeasureDriverString(graphics
, teststring
, 6, font
, positions
,
3241 DriverStringOptionsCmapLookup
|DriverStringOptionsRealizedAdvance
,
3243 expect(InvalidParameter
, status
);
3249 status
= GdipMeasureDriverString(graphics
, teststring
, 6, font
, positions
,
3250 DriverStringOptionsCmapLookup
|DriverStringOptionsRealizedAdvance
,
3255 ok(rc
.Y
< 0.0, "unexpected Y %0.2f\n", rc
.Y
);
3256 ok(rc
.Width
> 0.0, "unexpected Width %0.2f\n", rc
.Width
);
3257 ok(rc
.Height
> 0.0, "unexpected Y %0.2f\n", rc
.Y
);
3259 char_width
= rc
.Width
;
3260 char_height
= rc
.Height
;
3266 status
= GdipMeasureDriverString(graphics
, teststring
, 4, font
, positions
,
3267 DriverStringOptionsCmapLookup
|DriverStringOptionsRealizedAdvance
,
3272 ok(rc
.Y
< 0.0, "unexpected Y %0.2f\n", rc
.Y
);
3273 ok(rc
.Width
< char_width
, "got Width %0.2f, expecting less than %0.2f\n", rc
.Width
, char_width
);
3274 expectf(char_height
, rc
.Height
);
3280 status
= GdipMeasureDriverString(graphics
, teststring2
, 1, font
, positions
,
3281 DriverStringOptionsCmapLookup
|DriverStringOptionsRealizedAdvance
,
3286 ok(rc
.Y
< 0.0, "unexpected Y %0.2f\n", rc
.Y
);
3287 ok(rc
.Width
> 0, "unexpected Width %0.2f\n", rc
.Width
);
3288 expectf(rc
.Height
, char_height
);
3290 GdipDeleteMatrix(identity
);
3291 GdipDeleteStringFormat(format
);
3292 GdipDeleteBrush(brush
);
3293 GdipDeleteFont(font
);
3294 GdipDeleteFontFamily(family
);
3295 GdipDeleteGraphics(graphics
);
3297 ReleaseDC(hwnd
, hdc
);
3300 static void test_get_set_interpolation(void)
3302 GpGraphics
*graphics
;
3303 HDC hdc
= GetDC( hwnd
);
3305 InterpolationMode mode
;
3307 ok(hdc
!= NULL
, "Expected HDC to be initialized\n");
3308 status
= GdipCreateFromHDC(hdc
, &graphics
);
3310 ok(graphics
!= NULL
, "Expected graphics to be initialized\n");
3312 status
= GdipGetInterpolationMode(NULL
, &mode
);
3313 expect(InvalidParameter
, status
);
3317 /* Crashes on Windows XP */
3318 status
= GdipGetInterpolationMode(graphics
, NULL
);
3319 expect(InvalidParameter
, status
);
3322 status
= GdipSetInterpolationMode(NULL
, InterpolationModeNearestNeighbor
);
3323 expect(InvalidParameter
, status
);
3326 status
= GdipSetInterpolationMode(graphics
, InterpolationModeHighQualityBicubic
+1);
3327 expect(InvalidParameter
, status
);
3329 status
= GdipSetInterpolationMode(graphics
, InterpolationModeInvalid
);
3330 expect(InvalidParameter
, status
);
3332 status
= GdipGetInterpolationMode(graphics
, &mode
);
3334 expect(InterpolationModeBilinear
, mode
);
3336 status
= GdipSetInterpolationMode(graphics
, InterpolationModeNearestNeighbor
);
3339 status
= GdipGetInterpolationMode(graphics
, &mode
);
3341 expect(InterpolationModeNearestNeighbor
, mode
);
3343 status
= GdipSetInterpolationMode(graphics
, InterpolationModeDefault
);
3346 status
= GdipGetInterpolationMode(graphics
, &mode
);
3348 expect(InterpolationModeBilinear
, mode
);
3350 status
= GdipSetInterpolationMode(graphics
, InterpolationModeLowQuality
);
3353 status
= GdipGetInterpolationMode(graphics
, &mode
);
3355 expect(InterpolationModeBilinear
, mode
);
3357 status
= GdipSetInterpolationMode(graphics
, InterpolationModeHighQuality
);
3360 status
= GdipGetInterpolationMode(graphics
, &mode
);
3362 expect(InterpolationModeHighQualityBicubic
, mode
);
3364 GdipDeleteGraphics(graphics
);
3366 ReleaseDC(hwnd
, hdc
);
3369 static void test_get_set_textrenderinghint(void)
3371 GpGraphics
*graphics
;
3372 HDC hdc
= GetDC( hwnd
);
3374 TextRenderingHint hint
;
3376 ok(hdc
!= NULL
, "Expected HDC to be initialized\n");
3377 status
= GdipCreateFromHDC(hdc
, &graphics
);
3379 ok(graphics
!= NULL
, "Expected graphics to be initialized\n");
3381 status
= GdipGetTextRenderingHint(NULL
, &hint
);
3382 expect(InvalidParameter
, status
);
3384 status
= GdipGetTextRenderingHint(graphics
, NULL
);
3385 expect(InvalidParameter
, status
);
3387 status
= GdipSetTextRenderingHint(NULL
, TextRenderingHintAntiAlias
);
3388 expect(InvalidParameter
, status
);
3391 status
= GdipSetTextRenderingHint(graphics
, TextRenderingHintClearTypeGridFit
+1);
3392 expect(InvalidParameter
, status
);
3394 status
= GdipGetTextRenderingHint(graphics
, &hint
);
3396 expect(TextRenderingHintSystemDefault
, hint
);
3398 status
= GdipSetTextRenderingHint(graphics
, TextRenderingHintSystemDefault
);
3401 status
= GdipGetTextRenderingHint(graphics
, &hint
);
3403 expect(TextRenderingHintSystemDefault
, hint
);
3405 status
= GdipSetTextRenderingHint(graphics
, TextRenderingHintAntiAliasGridFit
);
3408 status
= GdipGetTextRenderingHint(graphics
, &hint
);
3410 expect(TextRenderingHintAntiAliasGridFit
, hint
);
3412 GdipDeleteGraphics(graphics
);
3414 ReleaseDC(hwnd
, hdc
);
3417 static void test_getdc_scaled(void)
3420 GpGraphics
*graphics
= NULL
;
3421 GpBitmap
*bitmap
= NULL
;
3423 HBRUSH hbrush
, holdbrush
;
3426 status
= GdipCreateBitmapFromScan0(10, 10, 12, PixelFormat24bppRGB
, NULL
, &bitmap
);
3429 status
= GdipGetImageGraphicsContext((GpImage
*)bitmap
, &graphics
);
3432 status
= GdipScaleWorldTransform(graphics
, 2.0, 2.0, MatrixOrderPrepend
);
3435 status
= GdipGetDC(graphics
, &hdc
);
3437 ok(hdc
!= NULL
, "got NULL hdc\n");
3439 hbrush
= CreateSolidBrush(RGB(255, 0, 0));
3441 holdbrush
= SelectObject(hdc
, hbrush
);
3443 Rectangle(hdc
, 2, 2, 6, 6);
3445 SelectObject(hdc
, holdbrush
);
3447 DeleteObject(hbrush
);
3449 status
= GdipReleaseDC(graphics
, hdc
);
3452 GdipDeleteGraphics(graphics
);
3454 status
= GdipBitmapGetPixel(bitmap
, 3, 3, &color
);
3456 expect(0xffff0000, color
);
3458 status
= GdipBitmapGetPixel(bitmap
, 8, 8, &color
);
3460 expect(0xff000000, color
);
3462 GdipDisposeImage((GpImage
*)bitmap
);
3465 static void test_GdipMeasureString(void)
3467 static const struct test_data
3469 REAL res_x
, res_y
, page_scale
;
3473 { 200.0, 200.0, 1.0, UnitPixel
}, /* base */
3474 { 200.0, 200.0, 2.0, UnitPixel
},
3475 { 200.0, 200.0, 1.0, UnitDisplay
},
3476 { 200.0, 200.0, 2.0, UnitDisplay
},
3477 { 200.0, 200.0, 1.0, UnitInch
},
3478 { 200.0, 200.0, 2.0, UnitInch
},
3479 { 200.0, 600.0, 1.0, UnitPoint
},
3480 { 200.0, 600.0, 2.0, UnitPoint
},
3481 { 200.0, 600.0, 1.0, UnitDocument
},
3482 { 200.0, 600.0, 2.0, UnitDocument
},
3483 { 200.0, 600.0, 1.0, UnitMillimeter
},
3484 { 200.0, 600.0, 2.0, UnitMillimeter
},
3485 { 200.0, 600.0, 1.0, UnitDisplay
},
3486 { 200.0, 600.0, 2.0, UnitDisplay
},
3487 { 200.0, 600.0, 1.0, UnitPixel
},
3488 { 200.0, 600.0, 2.0, UnitPixel
},
3490 static const WCHAR tahomaW
[] = { 'T','a','h','o','m','a',0 };
3491 static const WCHAR string
[] = { '1','2','3','4','5','6','7',0 };
3493 GpGraphics
*graphics
;
3494 GpFontFamily
*family
;
3496 GpStringFormat
*format
;
3498 REAL base_cx
= 0, base_cy
= 0, height
;
3503 GpUnit font_unit
, unit
;
3505 status
= GdipCreateStringFormat(0, LANG_NEUTRAL
, &format
);
3507 status
= GdipCreateFontFamilyFromName(tahomaW
, NULL
, &family
);
3510 /* font size in pixels */
3511 status
= GdipCreateFont(family
, 100.0, FontStyleRegular
, UnitPixel
, &font
);
3513 status
= GdipGetFontSize(font
, &font_size
);
3515 expectf(100.0, font_size
);
3516 status
= GdipGetFontUnit(font
, &font_unit
);
3518 expect(UnitPixel
, font_unit
);
3520 for (i
= 0; i
< sizeof(td
)/sizeof(td
[0]); i
++)
3522 graphics
= create_graphics(td
[i
].res_x
, td
[i
].res_y
, td
[i
].unit
, td
[i
].page_scale
);
3524 lf
.lfHeight
= 0xdeadbeef;
3525 status
= GdipGetLogFontW(font
, graphics
, &lf
);
3527 height
= units_to_pixels(font_size
, td
[i
].unit
, td
[i
].res_y
);
3528 if (td
[i
].unit
!= UnitDisplay
)
3529 height
*= td
[i
].page_scale
;
3530 ok(-lf
.lfHeight
== (LONG
)(height
+ 0.5), "%u: expected %d (%f), got %d\n",
3531 i
, (LONG
)(height
+ 0.5), height
, lf
.lfHeight
);
3533 height
= font_size
+ 2.0 * font_size
/ 6.0;
3535 set_rect_empty(&rc
);
3536 set_rect_empty(&bounds
);
3537 status
= GdipMeasureString(graphics
, string
, -1, font
, &rc
, format
, &bounds
, &chars
, &lines
);
3542 base_cx
= bounds
.Width
;
3543 base_cy
= bounds
.Height
;
3546 expectf(0.0, bounds
.X
);
3547 expectf(0.0, bounds
.Y
);
3549 expectf_(height
, bounds
.Height
, height
/ 100.0);
3550 expectf_(bounds
.Height
/ base_cy
, bounds
.Width
/ base_cx
, 0.1);
3554 /* make sure it really fits */
3555 bounds
.Width
+= 1.0;
3556 bounds
.Height
+= 1.0;
3560 set_rect_empty(&bounds
);
3561 status
= GdipMeasureString(graphics
, string
, -1, font
, &rc
, format
, &bounds
, &chars
, &lines
);
3563 expectf(50.0, bounds
.X
);
3564 expectf(50.0, bounds
.Y
);
3566 expectf_(height
, bounds
.Height
, height
/ 100.0);
3567 expectf_(bounds
.Height
/ base_cy
, bounds
.Width
/ base_cx
, 0.1);
3571 status
= GdipDeleteGraphics(graphics
);
3575 GdipDeleteFont(font
);
3577 /* font size in logical units */
3578 /* UnitPoint = 3, UnitInch = 4, UnitDocument = 5, UnitMillimeter = 6 */
3579 for (unit
= 3; unit
<= 6; unit
++)
3581 /* create a font which final height is 100.0 pixels with 200 dpi device */
3582 /* height + 2 * (height/6) = 100 => height = 100 * 3 / 4 => 75 */
3583 height
= pixels_to_units(75.0, unit
, 200.0);
3584 status
= GdipCreateFont(family
, height
, FontStyleRegular
, unit
, &font
);
3586 status
= GdipGetFontSize(font
, &font_size
);
3588 expectf(height
, font_size
);
3589 status
= GdipGetFontUnit(font
, &font_unit
);
3591 expect(unit
, font_unit
);
3593 for (i
= 0; i
< sizeof(td
)/sizeof(td
[0]); i
++)
3597 graphics
= create_graphics(td
[i
].res_x
, td
[i
].res_y
, td
[i
].unit
, td
[i
].page_scale
);
3599 lf
.lfHeight
= 0xdeadbeef;
3600 status
= GdipGetLogFontW(font
, graphics
, &lf
);
3602 if (td
[i
].unit
== UnitDisplay
|| td
[i
].unit
== UnitPixel
)
3603 height
= units_to_pixels(font_size
, font_unit
, td
[i
].res_x
);
3605 height
= units_to_pixels(font_size
, font_unit
, td
[i
].res_y
);
3606 /*trace("%.1f font units = %f pixels with %.1f dpi, page_scale %.1f\n", font_size, height, td[i].res_y, td[i].page_scale);*/
3607 ok(-lf
.lfHeight
== (LONG
)(height
+ 0.5), "%u: expected %d (%f), got %d\n",
3608 i
, (LONG
)(height
+ 0.5), height
, lf
.lfHeight
);
3610 if (td
[i
].unit
== UnitDisplay
|| td
[i
].unit
== UnitPixel
)
3611 unit_scale
= units_scale(font_unit
, td
[i
].unit
, td
[i
].res_x
);
3613 unit_scale
= units_scale(font_unit
, td
[i
].unit
, td
[i
].res_y
);
3614 /*trace("%u: %d to %d, %.1f dpi => unit_scale %f\n", i, font_unit, td[i].unit, td[i].res_y, unit_scale);*/
3615 height
= (font_size
+ 2.0 * font_size
/ 6.0) * unit_scale
;
3616 if (td
[i
].unit
!= UnitDisplay
)
3617 height
/= td
[i
].page_scale
;
3618 /*trace("%u: %.1f font units = %f units with %.1f dpi, page_scale %.1f\n", i, font_size, height, td[i].res_y, td[i].page_scale);*/
3620 set_rect_empty(&rc
);
3621 set_rect_empty(&bounds
);
3622 status
= GdipMeasureString(graphics
, string
, -1, font
, &rc
, format
, &bounds
, &chars
, &lines
);
3627 base_cx
= bounds
.Width
;
3628 base_cy
= bounds
.Height
;
3631 expectf(0.0, bounds
.X
);
3632 expectf(0.0, bounds
.Y
);
3634 expectf_(height
, bounds
.Height
, height
/ 85.0);
3635 expectf_(bounds
.Height
/ base_cy
, bounds
.Width
/ base_cx
, 0.1);
3639 /* make sure it really fits */
3640 bounds
.Width
+= 1.0;
3641 bounds
.Height
+= 1.0;
3645 set_rect_empty(&bounds
);
3646 status
= GdipMeasureString(graphics
, string
, -1, font
, &rc
, format
, &bounds
, &chars
, &lines
);
3648 expectf(50.0, bounds
.X
);
3649 expectf(50.0, bounds
.Y
);
3651 expectf_(height
, bounds
.Height
, height
/ 85.0);
3652 expectf_(bounds
.Height
/ base_cy
, bounds
.Width
/ base_cx
, 0.1);
3656 /* verify the result */
3657 height
= units_to_pixels(bounds
.Height
, td
[i
].unit
, td
[i
].res_x
);
3658 if (td
[i
].unit
!= UnitDisplay
)
3659 height
*= td
[i
].page_scale
;
3660 /*trace("%u: unit %u, %.1fx%.1f dpi, scale %.1f, height %f, pixels %f\n",
3661 i, td[i].unit, td[i].res_x, td[i].res_y, td[i].page_scale, bounds.Height, height);*/
3663 expectf_(100.0, height
, 1.1);
3665 status
= GdipDeleteGraphics(graphics
);
3669 GdipDeleteFont(font
);
3672 GdipDeleteFontFamily(family
);
3673 GdipDeleteStringFormat(format
);
3676 static void test_transform(void)
3678 static const struct test_data
3680 REAL res_x
, res_y
, scale
;
3682 GpPointF in
[2], out
[2];
3685 { 96.0, 96.0, 1.0, UnitPixel
,
3686 { { 100.0, 0.0 }, { 0.0, 100.0 } }, { { 100.0, 0.0 }, { 0.0, 100.0 } } },
3687 { 96.0, 96.0, 1.0, UnitDisplay
,
3688 { { 100.0, 0.0 }, { 0.0, 100.0 } }, { { 100.0, 0.0 }, { 0.0, 100.0 } } },
3689 { 96.0, 96.0, 1.0, UnitInch
,
3690 { { 100.0, 0.0 }, { 0.0, 100.0 } }, { { 9600.0, 0.0 }, { 0.0, 9600.0 } } },
3691 { 123.0, 456.0, 1.0, UnitPoint
,
3692 { { 100.0, 0.0 }, { 0.0, 100.0 } }, { { 170.833313, 0.0 }, { 0.0, 633.333252 } } },
3693 { 123.0, 456.0, 1.0, UnitDocument
,
3694 { { 100.0, 0.0 }, { 0.0, 100.0 } }, { { 40.999996, 0.0 }, { 0.0, 151.999985 } } },
3695 { 123.0, 456.0, 2.0, UnitMillimeter
,
3696 { { 100.0, 0.0 }, { 0.0, 100.0 } }, { { 968.503845, 0.0 }, { 0.0, 3590.550781 } } },
3697 { 196.0, 296.0, 1.0, UnitDisplay
,
3698 { { 100.0, 0.0 }, { 0.0, 100.0 } }, { { 100.0, 0.0 }, { 0.0, 100.0 } } },
3699 { 196.0, 296.0, 1.0, UnitPixel
,
3700 { { 100.0, 0.0 }, { 0.0, 100.0 } }, { { 100.0, 0.0 }, { 0.0, 100.0 } } },
3703 GpGraphics
*graphics
;
3707 for (i
= 0; i
< sizeof(td
)/sizeof(td
[0]); i
++)
3709 graphics
= create_graphics(td
[i
].res_x
, td
[i
].res_y
, td
[i
].unit
, td
[i
].scale
);
3710 ptf
[0].X
= td
[i
].in
[0].X
;
3711 ptf
[0].Y
= td
[i
].in
[0].Y
;
3712 ptf
[1].X
= td
[i
].in
[1].X
;
3713 ptf
[1].Y
= td
[i
].in
[1].Y
;
3714 status
= GdipTransformPoints(graphics
, CoordinateSpaceDevice
, CoordinateSpaceWorld
, ptf
, 2);
3716 expectf(td
[i
].out
[0].X
, ptf
[0].X
);
3717 expectf(td
[i
].out
[0].Y
, ptf
[0].Y
);
3718 expectf(td
[i
].out
[1].X
, ptf
[1].X
);
3719 expectf(td
[i
].out
[1].Y
, ptf
[1].Y
);
3720 status
= GdipTransformPoints(graphics
, CoordinateSpaceWorld
, CoordinateSpaceDevice
, ptf
, 2);
3722 expectf(td
[i
].in
[0].X
, ptf
[0].X
);
3723 expectf(td
[i
].in
[0].Y
, ptf
[0].Y
);
3724 expectf(td
[i
].in
[1].X
, ptf
[1].X
);
3725 expectf(td
[i
].in
[1].Y
, ptf
[1].Y
);
3726 status
= GdipDeleteGraphics(graphics
);
3731 /* Many people on the net ask why there is so much difference in rendered
3732 * text height between gdiplus and gdi32, this test suggests an answer to
3733 * that question. Important: this test assumes that font dpi == device dpi.
3735 static void test_font_height_scaling(void)
3737 static const WCHAR tahomaW
[] = { 'T','a','h','o','m','a',0 };
3738 static const WCHAR string
[] = { '1','2','3','4','5','6','7',0 };
3740 GpStringFormat
*format
;
3741 CharacterRange range
= { 0, 7 };
3743 GpGraphics
*graphics
;
3744 GpFontFamily
*family
;
3748 REAL height
, dpi
, scale
;
3750 GpUnit gfx_unit
, font_unit
;
3752 status
= GdipCreateStringFormat(StringFormatFlagsNoWrap
, LANG_NEUTRAL
, &format
);
3754 status
= GdipSetStringFormatMeasurableCharacterRanges(format
, 1, &range
);
3756 status
= GdipCreateRegion(®ion
);
3759 status
= GdipCreateFontFamilyFromName(tahomaW
, NULL
, &family
);
3762 hdc
= CreateCompatibleDC(0);
3763 status
= GdipCreateFromHDC(hdc
, &graphics
);
3765 status
= GdipGetDpiY(graphics
, &dpi
);
3768 /* First check if tested functionality works:
3769 * under XP if font and graphics units differ then GdipTransformPoints
3770 * followed by GdipSetPageUnit to change the graphics units breaks region
3771 * scaling in GdipMeasureCharacterRanges called later.
3773 status
= GdipSetPageUnit(graphics
, UnitDocument
);
3778 status
= GdipTransformPoints(graphics
, CoordinateSpaceWorld
, CoordinateSpaceDevice
, &ptf
, 1);
3781 status
= GdipSetPageUnit(graphics
, UnitInch
);
3784 status
= GdipCreateFont(family
, 720.0, FontStyleRegular
, UnitPoint
, &font
);
3787 set_rect_empty(&rect
);
3788 set_rect_empty(&bounds
);
3789 status
= GdipMeasureString(graphics
, string
, -1, font
, &rect
, format
, &bounds
, NULL
, NULL
);
3791 trace("test bounds: %f,%f,%f,%f\n", bounds
.X
, bounds
.Y
, bounds
.Width
, bounds
.Height
);
3793 set_rect_empty(&rect
);
3794 rect
.Width
= 32000.0;
3795 rect
.Height
= 32000.0;
3796 status
= GdipMeasureCharacterRanges(graphics
, string
, -1, font
, &rect
, format
, 1, ®ion
);
3799 set_rect_empty(&rect
);
3800 status
= GdipGetRegionBounds(region
, graphics
, &rect
);
3802 trace("test region: %f,%f,%f,%f\n", rect
.X
, rect
.Y
, rect
.Width
, rect
.Height
);
3804 GdipDeleteFont(font
);
3806 scale
= rect
.Height
/ bounds
.Height
;
3807 if (fabs(scale
- 1.0) > 0.1)
3809 win_skip("GdipGetRegionBounds is broken, scale %f (should be near 1.0)\n", scale
);
3813 status
= GdipScaleWorldTransform(graphics
, 0.01, 0.01, MatrixOrderAppend
);
3816 /* UnitPixel = 2, UnitPoint = 3, UnitInch = 4, UnitDocument = 5, UnitMillimeter = 6 */
3817 /* UnitPixel as a font base unit is not tested because it drastically
3818 differs in behaviour */
3819 for (font_unit
= 3; font_unit
<= 6; font_unit
++)
3821 /* create a font for the final text height of 100 pixels */
3822 /* height + 2 * (height/6) = 100 => height = 100 * 3 / 4 => 75 */
3823 status
= GdipSetPageUnit(graphics
, font_unit
);
3827 status
= GdipTransformPoints(graphics
, CoordinateSpaceWorld
, CoordinateSpaceDevice
, &ptf
, 1);
3830 /*trace("height %f units\n", height);*/
3831 status
= GdipCreateFont(family
, height
, FontStyleRegular
, font_unit
, &font
);
3834 /* UnitPixel = 2, UnitPoint = 3, UnitInch = 4, UnitDocument = 5, UnitMillimeter = 6 */
3835 for (gfx_unit
= 2; gfx_unit
<= 6; gfx_unit
++)
3837 static const WCHAR doubleW
[2] = { 'W','W' };
3838 RectF bounds_1
, bounds_2
;
3839 REAL margin
, margin_y
, font_height
;
3842 status
= GdipSetPageUnit(graphics
, gfx_unit
);
3845 margin_y
= units_to_pixels(height
/ 8.0, font_unit
, dpi
);
3846 margin_y
= pixels_to_units(margin_y
, gfx_unit
, dpi
);
3848 status
= GdipGetFontHeight(font
, graphics
, &font_height
);
3851 set_rect_empty(&rect
);
3852 set_rect_empty(&bounds
);
3853 status
= GdipMeasureString(graphics
, string
, -1, font
, &rect
, format
, &bounds
, NULL
, NULL
);
3855 /*trace("bounds: %f,%f,%f,%f\n", bounds.X, bounds.Y, bounds.Width, bounds.Height);*/
3857 expectf_(font_height
+ margin_y
, bounds
.Height
, 0.005);
3860 ptf
.Y
= bounds
.Height
;
3861 status
= GdipTransformPoints(graphics
, CoordinateSpaceDevice
, CoordinateSpaceWorld
, &ptf
, 1);
3863 match
= fabs(100.0 - ptf
.Y
) <= 1.0;
3865 ok(match
, "Expected 100.0, got %f\n", ptf
.Y
);
3867 /* verify the result */
3868 ptf
.Y
= units_to_pixels(bounds
.Height
, gfx_unit
, dpi
);
3870 match
= fabs(100.0 - ptf
.Y
) <= 1.0;
3872 ok(match
, "Expected 100.0, got %f\n", ptf
.Y
);
3874 /* bounds.width of 1 glyph: [margin]+[width]+[margin] */
3875 set_rect_empty(&rect
);
3876 set_rect_empty(&bounds_1
);
3877 status
= GdipMeasureString(graphics
, doubleW
, 1, font
, &rect
, format
, &bounds_1
, NULL
, NULL
);
3879 /* bounds.width of 2 identical glyphs: [margin]+[width]+[width]+[margin] */
3880 set_rect_empty(&rect
);
3881 set_rect_empty(&bounds_2
);
3882 status
= GdipMeasureString(graphics
, doubleW
, 2, font
, &rect
, format
, &bounds_2
, NULL
, NULL
);
3885 /* margin = [bounds.width of 1] - [bounds.width of 2] / 2*/
3886 margin
= bounds_1
.Width
- bounds_2
.Width
/ 2.0;
3887 /*trace("margin %f\n", margin);*/
3888 ok(margin
> 0.0, "wrong margin %f\n", margin
);
3890 set_rect_empty(&rect
);
3891 rect
.Width
= 320000.0;
3892 rect
.Height
= 320000.0;
3893 status
= GdipMeasureCharacterRanges(graphics
, string
, -1, font
, &rect
, format
, 1, ®ion
);
3895 set_rect_empty(&rect
);
3896 status
= GdipGetRegionBounds(region
, graphics
, &rect
);
3898 /*trace("region: %f,%f,%f,%f\n", rect.X, rect.Y, rect.Width, rect.Height);*/
3899 ok(rect
.X
> 0.0, "wrong rect.X %f\n", rect
.X
);
3900 expectf(0.0, rect
.Y
);
3901 match
= fabs(1.0 - margin
/ rect
.X
) <= 0.05;
3902 ok(match
, "Expected %f, got %f\n", margin
, rect
.X
);
3903 match
= fabs(1.0 - font_height
/ rect
.Height
) <= 0.1;
3904 ok(match
, "Expected %f, got %f\n", font_height
, rect
.Height
);
3905 match
= fabs(1.0 - bounds
.Width
/ (rect
.Width
+ margin
* 2.0)) <= 0.05;
3906 ok(match
, "Expected %f, got %f\n", bounds
.Width
, rect
.Width
+ margin
* 2.0);
3909 GdipDeleteFont(font
);
3913 status
= GdipDeleteGraphics(graphics
);
3917 GdipDeleteFontFamily(family
);
3918 GdipDeleteRegion(region
);
3919 GdipDeleteStringFormat(format
);
3922 static void test_measure_string(void)
3924 static const WCHAR tahomaW
[] = { 'T','a','h','o','m','a',0 };
3925 static const WCHAR string
[] = { 'A','0','1',0 };
3927 GpStringFormat
*format
;
3928 CharacterRange range
;
3930 GpGraphics
*graphics
;
3931 GpFontFamily
*family
;
3935 REAL width
, height
, width_1
, width_2
;
3936 REAL margin_x
, margin_y
, width_rgn
, height_rgn
;
3939 status
= GdipCreateStringFormat(StringFormatFlagsNoWrap
, LANG_NEUTRAL
, &format
);
3943 status
= GdipCreateRegion(®ion
);
3946 status
= GdipCreateFontFamilyFromName(tahomaW
, NULL
, &family
);
3949 hdc
= CreateCompatibleDC(0);
3950 status
= GdipCreateFromHDC(hdc
, &graphics
);
3952 status
= GdipCreateFont(family
, 20, FontStyleRegular
, UnitPixel
, &font
);
3955 margin_x
= 20.0 / 6.0;
3956 margin_y
= 20.0 / 8.0;
3958 set_rect_empty(&rect
);
3959 set_rect_empty(&bounds
);
3960 status
= GdipMeasureString(graphics
, string
, -1, font
, &rect
, format
, &bounds
, &glyphs
, &lines
);
3964 expectf(0.0, bounds
.X
);
3965 expectf(0.0, bounds
.Y
);
3966 width
= bounds
.Width
;
3967 height
= bounds
.Height
;
3969 set_rect_empty(&rect
);
3970 rect
.Height
= height
/ 2.0;
3971 set_rect_empty(&bounds
);
3972 status
= GdipMeasureString(graphics
, string
, -1, font
, &rect
, format
, &bounds
, &glyphs
, &lines
);
3976 expectf(0.0, bounds
.X
);
3977 expectf(0.0, bounds
.Y
);
3978 expectf(width
, bounds
.Width
);
3980 expectf(height
/ 2.0, bounds
.Height
);
3983 range
.Length
= lstrlenW(string
);
3984 status
= GdipSetStringFormatMeasurableCharacterRanges(format
, 1, &range
);
3989 rect
.Width
= 32000.0;
3990 rect
.Height
= 32000.0;
3991 status
= GdipMeasureCharacterRanges(graphics
, string
, -1, font
, &rect
, format
, 1, ®ion
);
3993 set_rect_empty(&bounds
);
3994 status
= GdipGetRegionBounds(region
, graphics
, &bounds
);
3996 expectf_(5.0 + margin_x
, bounds
.X
, 1.0);
3997 expectf(5.0, bounds
.Y
);
3998 expectf_(width
- margin_x
*2.0, bounds
.Width
, 1.0);
4000 expectf_(height
- margin_y
, bounds
.Height
, 1.0);
4002 width_rgn
= bounds
.Width
;
4003 height_rgn
= bounds
.Height
;
4007 status
= GdipSetStringFormatMeasurableCharacterRanges(format
, 1, &range
);
4010 set_rect_empty(&rect
);
4011 rect
.Width
= 32000.0;
4012 rect
.Height
= 32000.0;
4013 status
= GdipMeasureCharacterRanges(graphics
, string
, 1, font
, &rect
, format
, 1, ®ion
);
4015 set_rect_empty(&bounds
);
4016 status
= GdipGetRegionBounds(region
, graphics
, &bounds
);
4018 expectf_(margin_x
, bounds
.X
, 1.0);
4019 expectf(0.0, bounds
.Y
);
4020 ok(bounds
.Width
< width_rgn
/ 2.0, "width of 1 glyph is wrong\n");
4021 expectf(height_rgn
, bounds
.Height
);
4022 width_1
= bounds
.Width
;
4025 range
.Length
= lstrlenW(string
);
4026 status
= GdipSetStringFormatMeasurableCharacterRanges(format
, 1, &range
);
4033 status
= GdipMeasureCharacterRanges(graphics
, string
, -1, font
, &rect
, format
, 1, ®ion
);
4035 set_rect_empty(&bounds
);
4036 status
= GdipGetRegionBounds(region
, graphics
, &bounds
);
4038 expectf(0.0, bounds
.X
);
4039 expectf(0.0, bounds
.Y
);
4040 expectf(0.0, bounds
.Width
);
4041 expectf(0.0, bounds
.Height
);
4045 rect
.Width
= width_rgn
/ 2.0;
4046 rect
.Height
= 32000.0;
4047 status
= GdipMeasureCharacterRanges(graphics
, string
, -1, font
, &rect
, format
, 1, ®ion
);
4049 set_rect_empty(&bounds
);
4050 status
= GdipGetRegionBounds(region
, graphics
, &bounds
);
4052 expectf_(5.0 + margin_x
, bounds
.X
, 1.0);
4053 expectf(5.0, bounds
.Y
);
4054 expectf_(width_1
, bounds
.Width
, 1.0);
4056 expectf_(height
- margin_y
, bounds
.Height
, 1.0);
4058 status
= GdipSetStringFormatFlags(format
, StringFormatFlagsNoWrap
| StringFormatFlagsNoClip
);
4064 status
= GdipMeasureCharacterRanges(graphics
, string
, -1, font
, &rect
, format
, 1, ®ion
);
4066 set_rect_empty(&bounds
);
4067 status
= GdipGetRegionBounds(region
, graphics
, &bounds
);
4069 expectf_(5.0 + margin_x
, bounds
.X
, 1.0);
4070 expectf(5.0, bounds
.Y
);
4071 expectf(width_rgn
, bounds
.Width
);
4072 expectf(height_rgn
, bounds
.Height
);
4076 rect
.Width
= width_rgn
/ 2.0;
4077 rect
.Height
= 32000.0;
4078 status
= GdipMeasureCharacterRanges(graphics
, string
, -1, font
, &rect
, format
, 1, ®ion
);
4080 set_rect_empty(&bounds
);
4081 status
= GdipGetRegionBounds(region
, graphics
, &bounds
);
4083 expectf_(5.0 + margin_x
, bounds
.X
, 1.0);
4084 expectf(5.0, bounds
.Y
);
4085 expectf_(width_1
, bounds
.Width
, 1.0);
4086 expectf(height_rgn
, bounds
.Height
);
4088 set_rect_empty(&rect
);
4089 rect
.Height
= height
/ 2.0;
4090 set_rect_empty(&bounds
);
4091 status
= GdipMeasureString(graphics
, string
, -1, font
, &rect
, format
, &bounds
, &glyphs
, &lines
);
4095 expectf(0.0, bounds
.X
);
4096 expectf(0.0, bounds
.Y
);
4097 expectf_(width
, bounds
.Width
, 0.01);
4099 expectf(height
, bounds
.Height
);
4101 set_rect_empty(&rect
);
4102 set_rect_empty(&bounds
);
4103 status
= GdipMeasureString(graphics
, string
, 1, font
, &rect
, format
, &bounds
, &glyphs
, &lines
);
4107 expectf(0.0, bounds
.X
);
4108 expectf(0.0, bounds
.Y
);
4109 ok(bounds
.Width
< width
/ 2.0, "width of 1 glyph is wrong\n");
4110 expectf(height
, bounds
.Height
);
4111 width_1
= bounds
.Width
;
4113 set_rect_empty(&rect
);
4114 set_rect_empty(&bounds
);
4115 status
= GdipMeasureString(graphics
, string
, 2, font
, &rect
, format
, &bounds
, &glyphs
, &lines
);
4119 expectf(0.0, bounds
.X
);
4120 expectf(0.0, bounds
.Y
);
4121 ok(bounds
.Width
< width
, "width of 2 glyphs is wrong\n");
4122 ok(bounds
.Width
> width_1
, "width of 2 glyphs is wrong\n");
4123 expectf(height
, bounds
.Height
);
4124 width_2
= bounds
.Width
;
4126 set_rect_empty(&rect
);
4127 rect
.Width
= width
/ 2.0;
4128 set_rect_empty(&bounds
);
4129 status
= GdipMeasureString(graphics
, string
, -1, font
, &rect
, format
, &bounds
, &glyphs
, &lines
);
4133 expectf(0.0, bounds
.X
);
4134 expectf(0.0, bounds
.Y
);
4135 expectf_(width_1
, bounds
.Width
, 0.01);
4136 expectf(height
, bounds
.Height
);
4138 set_rect_empty(&rect
);
4139 rect
.Height
= height
;
4140 rect
.Width
= width
- 0.05;
4141 set_rect_empty(&bounds
);
4142 status
= GdipMeasureString(graphics
, string
, -1, font
, &rect
, format
, &bounds
, &glyphs
, &lines
);
4146 expectf(0.0, bounds
.X
);
4147 expectf(0.0, bounds
.Y
);
4148 expectf_(width_2
, bounds
.Width
, 0.01);
4149 expectf(height
, bounds
.Height
);
4151 set_rect_empty(&rect
);
4152 rect
.Height
= height
;
4153 rect
.Width
= width_2
- 0.05;
4154 set_rect_empty(&bounds
);
4155 status
= GdipMeasureString(graphics
, string
, -1, font
, &rect
, format
, &bounds
, &glyphs
, &lines
);
4159 expectf(0.0, bounds
.X
);
4160 expectf(0.0, bounds
.Y
);
4161 expectf_(width_1
, bounds
.Width
, 0.01);
4162 expectf(height
, bounds
.Height
);
4164 /* Default (Near) alignment */
4167 rect
.Width
= width
* 2.0;
4168 rect
.Height
= height
* 2.0;
4169 set_rect_empty(&bounds
);
4170 status
= GdipMeasureString(graphics
, string
, -1, font
, &rect
, format
, &bounds
, &glyphs
, &lines
);
4174 expectf(5.0, bounds
.X
);
4175 expectf(5.0, bounds
.Y
);
4176 expectf_(width
, bounds
.Width
, 0.01);
4177 expectf(height
, bounds
.Height
);
4181 rect
.Width
= 32000.0;
4182 rect
.Height
= 32000.0;
4183 status
= GdipMeasureCharacterRanges(graphics
, string
, -1, font
, &rect
, format
, 1, ®ion
);
4185 set_rect_empty(&bounds
);
4186 status
= GdipGetRegionBounds(region
, graphics
, &bounds
);
4188 expectf_(5.0 + margin_x
, bounds
.X
, 1.0);
4189 expectf(5.0, bounds
.Y
);
4190 expectf_(width
- margin_x
*2.0, bounds
.Width
, 1.0);
4192 expectf_(height
- margin_y
, bounds
.Height
, 1.0);
4194 width_rgn
= bounds
.Width
;
4195 height_rgn
= bounds
.Height
;
4197 /* Center alignment */
4198 GdipSetStringFormatAlign(format
, StringAlignmentCenter
);
4199 GdipSetStringFormatLineAlign(format
, StringAlignmentCenter
);
4203 rect
.Width
= width
* 2.0;
4204 rect
.Height
= height
* 2.0;
4205 set_rect_empty(&bounds
);
4206 status
= GdipMeasureString(graphics
, string
, -1, font
, &rect
, format
, &bounds
, &glyphs
, &lines
);
4211 expectf_(5.0 + width
/2.0, bounds
.X
, 0.01);
4213 expectf(5.0 + height
/2.0, bounds
.Y
);
4214 expectf_(width
, bounds
.Width
, 0.01);
4215 expectf(height
, bounds
.Height
);
4221 set_rect_empty(&bounds
);
4222 status
= GdipMeasureString(graphics
, string
, -1, font
, &rect
, format
, &bounds
, &glyphs
, &lines
);
4227 expectf_(5.0 - width
/2.0, bounds
.X
, 0.01);
4229 expectf(5.0 - height
/2.0, bounds
.Y
);
4230 expectf_(width
, bounds
.Width
, 0.01);
4231 expectf(height
, bounds
.Height
);
4235 rect
.Width
= width_rgn
* 2.0;
4236 rect
.Height
= height_rgn
* 2.0;
4237 status
= GdipMeasureCharacterRanges(graphics
, string
, -1, font
, &rect
, format
, 1, ®ion
);
4239 set_rect_empty(&bounds
);
4240 status
= GdipGetRegionBounds(region
, graphics
, &bounds
);
4243 expectf_(5.0 + width_rgn
/2.0, bounds
.X
, 1.0);
4245 expectf_(5.0 + height_rgn
/2.0, bounds
.Y
, 1.0);
4246 expectf_(width_rgn
, bounds
.Width
, 1.0);
4247 expectf_(height_rgn
, bounds
.Height
, 1.0);
4253 status
= GdipMeasureCharacterRanges(graphics
, string
, -1, font
, &rect
, format
, 1, ®ion
);
4255 set_rect_empty(&bounds
);
4256 status
= GdipGetRegionBounds(region
, graphics
, &bounds
);
4259 expectf_(5.0 - width_rgn
/2.0, bounds
.X
, 1.0);
4261 expectf_(5.0 - height_rgn
/2.0, bounds
.Y
, 1.0);
4262 expectf_(width_rgn
, bounds
.Width
, 1.0);
4263 expectf_(height_rgn
, bounds
.Height
, 1.0);
4266 GdipSetStringFormatAlign(format
, StringAlignmentFar
);
4267 GdipSetStringFormatLineAlign(format
, StringAlignmentFar
);
4271 rect
.Width
= width
* 2.0;
4272 rect
.Height
= height
* 2.0;
4273 set_rect_empty(&bounds
);
4274 status
= GdipMeasureString(graphics
, string
, -1, font
, &rect
, format
, &bounds
, &glyphs
, &lines
);
4279 expectf_(5.0 + width
, bounds
.X
, 0.01);
4281 expectf(5.0 + height
, bounds
.Y
);
4282 expectf_(width
, bounds
.Width
, 0.01);
4283 expectf(height
, bounds
.Height
);
4289 set_rect_empty(&bounds
);
4290 status
= GdipMeasureString(graphics
, string
, -1, font
, &rect
, format
, &bounds
, &glyphs
, &lines
);
4295 expectf_(5.0 - width
, bounds
.X
, 0.01);
4297 expectf(5.0 - height
, bounds
.Y
);
4298 expectf_(width
, bounds
.Width
, 0.01);
4299 expectf(height
, bounds
.Height
);
4303 rect
.Width
= width_rgn
* 2.0;
4304 rect
.Height
= height_rgn
* 2.0;
4305 status
= GdipMeasureCharacterRanges(graphics
, string
, -1, font
, &rect
, format
, 1, ®ion
);
4307 set_rect_empty(&bounds
);
4308 status
= GdipGetRegionBounds(region
, graphics
, &bounds
);
4311 expectf_(5.0 + width_rgn
, bounds
.X
, 2.0);
4313 expectf_(5.0 + height_rgn
, bounds
.Y
, 1.0);
4314 expectf_(width_rgn
, bounds
.Width
, 1.0);
4315 expectf_(height_rgn
, bounds
.Height
, 1.0);
4321 status
= GdipMeasureCharacterRanges(graphics
, string
, -1, font
, &rect
, format
, 1, ®ion
);
4323 set_rect_empty(&bounds
);
4324 status
= GdipGetRegionBounds(region
, graphics
, &bounds
);
4327 expectf_(5.0 - width_rgn
, bounds
.X
, 2.0);
4329 expectf_(5.0 - height_rgn
, bounds
.Y
, 1.0);
4330 expectf_(width_rgn
, bounds
.Width
, 1.0);
4331 expectf_(height_rgn
, bounds
.Height
, 1.0);
4333 status
= GdipDeleteFont(font
);
4336 status
= GdipDeleteGraphics(graphics
);
4340 GdipDeleteFontFamily(family
);
4341 GdipDeleteRegion(region
);
4342 GdipDeleteStringFormat(format
);
4345 static void test_measured_extra_space(void)
4347 static const WCHAR tahomaW
[] = { 'T','a','h','o','m','a',0 };
4348 static const WCHAR string
[2] = { 'W','W' };
4349 GpStringFormat
*format
;
4351 GpGraphics
*graphics
;
4352 GpFontFamily
*family
;
4355 GpUnit gfx_unit
, font_unit
;
4356 RectF bounds_1
, bounds_2
, rect
;
4357 REAL margin
, font_size
, dpi
;
4359 status
= GdipCreateStringFormat(0, LANG_NEUTRAL
, &format
);
4362 status
= GdipCreateFontFamilyFromName(tahomaW
, NULL
, &family
);
4364 hdc
= CreateCompatibleDC(0);
4365 status
= GdipCreateFromHDC(hdc
, &graphics
);
4368 status
= GdipGetDpiX(graphics
, &dpi
);
4371 /* UnitPixel = 2, UnitPoint = 3, UnitInch = 4, UnitDocument = 5, UnitMillimeter = 6 */
4372 /* UnitPixel as a font base unit is not tested because it differs in behaviour */
4373 for (font_unit
= 3; font_unit
<= 6; font_unit
++)
4375 status
= GdipCreateFont(family
, 1234.0, FontStyleRegular
, font_unit
, &font
);
4378 status
= GdipGetFontSize(font
, &font_size
);
4380 font_size
= units_to_pixels(font_size
, font_unit
, dpi
);
4381 /*trace("font size/6 = %f pixels\n", font_size / 6.0);*/
4383 /* UnitPixel = 2, UnitPoint = 3, UnitInch = 4, UnitDocument = 5, UnitMillimeter = 6 */
4384 for (gfx_unit
= 2; gfx_unit
<= 6; gfx_unit
++)
4386 status
= GdipSetPageUnit(graphics
, gfx_unit
);
4389 /* bounds.width of 1 glyph: [margin]+[width]+[margin] */
4390 set_rect_empty(&rect
);
4391 set_rect_empty(&bounds_1
);
4392 status
= GdipMeasureString(graphics
, string
, 1, font
, &rect
, format
, &bounds_1
, NULL
, NULL
);
4394 /* bounds.width of 2 identical glyphs: [margin]+[width]+[width]+[margin] */
4395 set_rect_empty(&rect
);
4396 set_rect_empty(&bounds_2
);
4397 status
= GdipMeasureString(graphics
, string
, 2, font
, &rect
, format
, &bounds_2
, NULL
, NULL
);
4400 /* margin = [bounds.width of 1] - [bounds.width of 2] / 2*/
4401 margin
= units_to_pixels(bounds_1
.Width
- bounds_2
.Width
/ 2.0, gfx_unit
, dpi
);
4402 /*trace("margin %f pixels\n", margin);*/
4403 expectf_(font_size
/ 6.0, margin
, font_size
/ 100.0);
4406 GdipDeleteFont(font
);
4409 GdipDeleteGraphics(graphics
);
4411 GdipDeleteFontFamily(family
);
4412 GdipDeleteStringFormat(format
);
4415 static void test_alpha_hdc(void)
4419 HBITMAP hbm
, old_hbm
;
4420 GpGraphics
*graphics
;
4425 hdc
= CreateCompatibleDC(0);
4426 ok(hdc
!= NULL
, "CreateCompatibleDC failed\n");
4427 bmi
.bmiHeader
.biSize
= sizeof(bmi
.bmiHeader
);
4428 bmi
.bmiHeader
.biHeight
= 5;
4429 bmi
.bmiHeader
.biWidth
= 5;
4430 bmi
.bmiHeader
.biBitCount
= 32;
4431 bmi
.bmiHeader
.biPlanes
= 1;
4432 bmi
.bmiHeader
.biCompression
= BI_RGB
;
4433 bmi
.bmiHeader
.biClrUsed
= 0;
4435 hbm
= CreateDIBSection(hdc
, &bmi
, DIB_RGB_COLORS
, (void**)&bits
, NULL
, 0);
4436 ok(hbm
!= NULL
, "CreateDIBSection failed\n");
4438 old_hbm
= SelectObject(hdc
, hbm
);
4440 status
= GdipCreateFromHDC(hdc
, &graphics
);
4443 status
= GdipGetVisibleClipBounds(graphics
, &bounds
);
4445 expectf(0.0, bounds
.X
);
4446 expectf(0.0, bounds
.Y
);
4447 expectf(5.0, bounds
.Width
);
4448 expectf(5.0, bounds
.Height
);
4450 bits
[0] = 0xdeadbeef;
4452 status
= GdipGraphicsClear(graphics
, 0xffaaaaaa);
4455 expect(0xffaaaaaa, bits
[0]);
4457 SelectObject(hdc
, old_hbm
);
4459 bits
[0] = 0xdeadbeef;
4461 status
= GdipGraphicsClear(graphics
, 0xffbbbbbb);
4464 todo_wine
expect(0xffbbbbbb, bits
[0]);
4466 GdipDeleteGraphics(graphics
);
4472 static void test_bitmapfromgraphics(void)
4475 GpGraphics
*graphics
= NULL
;
4476 HDC hdc
= GetDC( hwnd
);
4477 GpBitmap
*bitmap
= NULL
;
4479 REAL imageres
, graphicsres
;
4482 stat
= GdipCreateFromHDC(hdc
, &graphics
);
4485 stat
= GdipCreateBitmapFromGraphics(12, 13, NULL
, &bitmap
);
4486 expect(InvalidParameter
, stat
);
4488 stat
= GdipCreateBitmapFromGraphics(12, 13, graphics
, NULL
);
4489 expect(InvalidParameter
, stat
);
4491 stat
= GdipCreateBitmapFromGraphics(12, 13, graphics
, &bitmap
);
4494 stat
= GdipGetImagePixelFormat((GpImage
*)bitmap
, &format
);
4496 expect(PixelFormat32bppPARGB
, format
);
4498 stat
= GdipGetDpiX(graphics
, &graphicsres
);
4501 stat
= GdipGetImageHorizontalResolution((GpImage
*)bitmap
, &imageres
);
4503 expectf(graphicsres
, imageres
);
4505 stat
= GdipGetDpiY(graphics
, &graphicsres
);
4508 stat
= GdipGetImageVerticalResolution((GpImage
*)bitmap
, &imageres
);
4510 expectf(graphicsres
, imageres
);
4512 stat
= GdipGetImageWidth((GpImage
*)bitmap
, &width
);
4516 stat
= GdipGetImageHeight((GpImage
*)bitmap
, &height
);
4520 GdipDeleteGraphics(graphics
);
4521 GdipDisposeImage((GpImage
*)bitmap
);
4524 static void test_clipping(void)
4528 GpGraphics
*graphics
;
4529 GpRegion
*region
, *region100x100
;
4538 hdc
= CreateCompatibleDC(0);
4539 status
= GdipCreateFromHDC(hdc
, &graphics
);
4542 status
= GdipGetPageUnit(graphics
, &unit
);
4544 expect(UnitDisplay
, unit
);
4546 status
= GdipCreateRegion(®ion
);
4548 status
= GdipSetEmpty(region
);
4551 status
= GdipCreateRegion(®ion100x100
);
4553 status
= GdipSetEmpty(region100x100
);
4556 rect
.X
= rect
.Y
= 100.0;
4557 rect
.Width
= rect
.Height
= 100.0;
4558 status
= GdipCombineRegionRect(region100x100
, &rect
, CombineModeUnion
);
4560 status
= GdipSetClipRegion(graphics
, region100x100
, CombineModeReplace
);
4563 status
= GdipGetClipBounds(graphics
, &rect
);
4565 ok(rect
.X
== 100.0 && rect
.Y
== 100.0 && rect
.Width
== 100.0 && rect
.Height
== 100.0,
4566 "expected 100.0,100.0-100.0,100.0, got %.2f,%.2f-%.2f,%.2f\n", rect
.X
, rect
.Y
, rect
.Width
, rect
.Height
);
4568 status
= GdipSetEmpty(region
);
4570 status
= GdipGetClip(graphics
, region
);
4572 status
= GdipGetRegionBounds(region
, graphics
, &rect
);
4574 ok(rect
.X
== 100.0 && rect
.Y
== 100.0 && rect
.Width
== 100.0 && rect
.Height
== 100.0,
4575 "expected 100.0,100.0-100.0,100.0, got %.2f,%.2f-%.2f,%.2f\n", rect
.X
, rect
.Y
, rect
.Width
, rect
.Height
);
4581 status
= GdipTransformPoints(graphics
, CoordinateSpaceWorld
, CoordinateSpaceDevice
, ptf
, 2);
4583 ok(ptf
[0].X
== 100.0 && ptf
[0].Y
== 100.0 && ptf
[1].X
== 200.0 && ptf
[1].Y
== 200.0,
4584 "expected 100.0,100.0-200.0,200.0, got %f,%f-%f,%f\n", ptf
[0].X
, ptf
[0].Y
, ptf
[1].X
, ptf
[1].Y
);
4586 status
= GdipCreateMatrix(&matrix
);
4588 status
= GdipScaleMatrix(matrix
, 2.0, 4.0, MatrixOrderAppend
);
4590 status
= GdipTranslateMatrix(matrix
, 10.0, 20.0, MatrixOrderAppend
);
4592 status
= GdipSetWorldTransform(graphics
, matrix
);
4595 status
= GdipGetClipBounds(graphics
, &rect
);
4597 ok(rect
.X
== 45.0 && rect
.Y
== 20.0 && rect
.Width
== 50.0 && rect
.Height
== 25.0,
4598 "expected 45.0,20.0-50.0,25.0, got %.2f,%.2f-%.2f,%.2f\n", rect
.X
, rect
.Y
, rect
.Width
, rect
.Height
);
4600 status
= GdipSetEmpty(region
);
4602 status
= GdipGetClip(graphics
, region
);
4604 status
= GdipGetRegionBounds(region
, graphics
, &rect
);
4606 ok(rect
.X
== 45.0 && rect
.Y
== 20.0 && rect
.Width
== 50.0 && rect
.Height
== 25.0,
4607 "expected 45.0,20.0-50.0,25.0, got %.2f,%.2f-%.2f,%.2f\n", rect
.X
, rect
.Y
, rect
.Width
, rect
.Height
);
4609 status
= GdipGetRegionBounds(region100x100
, graphics
, &rect
);
4611 ok(rect
.X
== 100.0 && rect
.Y
== 100.0 && rect
.Width
== 100.0 && rect
.Height
== 100.0,
4612 "expected 100.0,100.0-100.0,100.0, got %.2f,%.2f-%.2f,%.2f\n", rect
.X
, rect
.Y
, rect
.Width
, rect
.Height
);
4614 status
= GdipGetRegionHRgn(region
, NULL
, &hrgn
);
4616 ret
= GetRgnBox(hrgn
, &rc
);
4617 ok(ret
== SIMPLEREGION
, "expected SIMPLEREGION, got %d\n", ret
);
4618 ok(rc
.left
== 45 && rc
.top
== 20 && rc
.right
== 95 && rc
.bottom
== 45,
4619 "expected 45,20-95,45, got %d,%d-%d,%d\n", rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
4622 status
= GdipGetRegionHRgn(region
, graphics
, &hrgn
);
4624 ret
= GetRgnBox(hrgn
, &rc
);
4625 ok(ret
== SIMPLEREGION
, "expected SIMPLEREGION, got %d\n", ret
);
4626 ok(rc
.left
== 100 && rc
.top
== 100 && rc
.right
== 200 && rc
.bottom
== 200,
4627 "expected 100,100-200,200, got %d,%d-%d,%d\n", rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
4634 status
= GdipTransformPoints(graphics
, CoordinateSpaceWorld
, CoordinateSpaceDevice
, ptf
, 2);
4636 ok(ptf
[0].X
== 45.0 && ptf
[0].Y
== 20.0 && ptf
[1].X
== 95.0 && ptf
[1].Y
== 45.0,
4637 "expected 45.0,20.0-95.0,45.0, got %f,%f-%f,%f\n", ptf
[0].X
, ptf
[0].Y
, ptf
[1].X
, ptf
[1].Y
);
4639 status
= GdipGetRegionHRgn(region100x100
, NULL
, &hrgn
);
4641 ret
= GetRgnBox(hrgn
, &rc
);
4642 ok(ret
== SIMPLEREGION
, "expected SIMPLEREGION, got %d\n", ret
);
4643 ok(rc
.left
== 100 && rc
.top
== 100 && rc
.right
== 200 && rc
.bottom
== 200,
4644 "expected 100,100-200,200, got %d,%d-%d,%d\n", rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
4647 status
= GdipGetRegionHRgn(region100x100
, graphics
, &hrgn
);
4649 ret
= GetRgnBox(hrgn
, &rc
);
4650 ok(ret
== SIMPLEREGION
, "expected SIMPLEREGION, got %d\n", ret
);
4651 ok(rc
.left
== 210 && rc
.top
== 420 && rc
.right
== 410 && rc
.bottom
== 820,
4652 "expected 210,420-410,820, got %d,%d-%d,%d\n", rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
4659 status
= GdipTransformPoints(graphics
, CoordinateSpaceWorld
, CoordinateSpaceDevice
, ptf
, 2);
4661 ok(ptf
[0].X
== 100.0 && ptf
[0].Y
== 100.0 && ptf
[1].X
== 200.0 && ptf
[1].Y
== 200.0,
4662 "expected 100.0,100.0-200.0,200.0, got %f,%f-%f,%f\n", ptf
[0].X
, ptf
[0].Y
, ptf
[1].X
, ptf
[1].Y
);
4664 status
= GdipSetPageScale(graphics
, 2.0);
4667 status
= GdipGetClipBounds(graphics
, &rect
);
4669 ok(rect
.X
== 45.0 && rect
.Y
== 20.0 && rect
.Width
== 50.0 && rect
.Height
== 25.0,
4670 "expected 45.0,20.0-50.0,25.0, got %.2f,%.2f-%.2f,%.2f\n", rect
.X
, rect
.Y
, rect
.Width
, rect
.Height
);
4672 status
= GdipSetEmpty(region
);
4674 status
= GdipGetClip(graphics
, region
);
4676 status
= GdipGetRegionBounds(region
, graphics
, &rect
);
4678 ok(rect
.X
== 45.0 && rect
.Y
== 20.0 && rect
.Width
== 50.0 && rect
.Height
== 25.0,
4679 "expected 45.0,20.0-50.0,25.0, got %.2f,%.2f-%.2f,%.2f\n", rect
.X
, rect
.Y
, rect
.Width
, rect
.Height
);
4681 status
= GdipGetRegionBounds(region100x100
, graphics
, &rect
);
4683 ok(rect
.X
== 100.0 && rect
.Y
== 100.0 && rect
.Width
== 100.0 && rect
.Height
== 100.0,
4684 "expected 100.0,100.0-100.0,100.0, got %.2f,%.2f-%.2f,%.2f\n", rect
.X
, rect
.Y
, rect
.Width
, rect
.Height
);
4686 status
= GdipGetRegionHRgn(region
, NULL
, &hrgn
);
4688 ret
= GetRgnBox(hrgn
, &rc
);
4689 ok(ret
== SIMPLEREGION
, "expected SIMPLEREGION, got %d\n", ret
);
4690 ok(rc
.left
== 45 && rc
.top
== 20 && rc
.right
== 95 && rc
.bottom
== 45,
4691 "expected 45,20-95,45, got %d,%d-%d,%d\n", rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
4694 status
= GdipGetRegionHRgn(region
, graphics
, &hrgn
);
4696 ret
= GetRgnBox(hrgn
, &rc
);
4697 ok(ret
== SIMPLEREGION
, "expected SIMPLEREGION, got %d\n", ret
);
4698 ok(rc
.left
== 100 && rc
.top
== 100 && rc
.right
== 200 && rc
.bottom
== 200,
4699 "expected 100,100-200,200, got %d,%d-%d,%d\n", rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
4706 status
= GdipTransformPoints(graphics
, CoordinateSpaceWorld
, CoordinateSpaceDevice
, ptf
, 2);
4708 ok(ptf
[0].X
== 45.0 && ptf
[0].Y
== 20.0 && ptf
[1].X
== 95.0 && ptf
[1].Y
== 45.0,
4709 "expected 45.0,20.0-95.0,45.0, got %f,%f-%f,%f\n", ptf
[0].X
, ptf
[0].Y
, ptf
[1].X
, ptf
[1].Y
);
4711 status
= GdipGetRegionHRgn(region100x100
, NULL
, &hrgn
);
4713 ret
= GetRgnBox(hrgn
, &rc
);
4714 ok(ret
== SIMPLEREGION
, "expected SIMPLEREGION, got %d\n", ret
);
4715 ok(rc
.left
== 100 && rc
.top
== 100 && rc
.right
== 200 && rc
.bottom
== 200,
4716 "expected 100,100-200,200, got %d,%d-%d,%d\n", rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
4719 status
= GdipGetRegionHRgn(region100x100
, graphics
, &hrgn
);
4721 ret
= GetRgnBox(hrgn
, &rc
);
4722 ok(ret
== SIMPLEREGION
, "expected SIMPLEREGION, got %d\n", ret
);
4723 ok(rc
.left
== 210 && rc
.top
== 420 && rc
.right
== 410 && rc
.bottom
== 820,
4724 "expected 210,420-410,820, got %d,%d-%d,%d\n", rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
4731 status
= GdipTransformPoints(graphics
, CoordinateSpaceWorld
, CoordinateSpaceDevice
, ptf
, 2);
4733 ok(ptf
[0].X
== 100.0 && ptf
[0].Y
== 100.0 && ptf
[1].X
== 200.0 && ptf
[1].Y
== 200.0,
4734 "expected 100.0,100.0-200.0,200.0, got %f,%f-%f,%f\n", ptf
[0].X
, ptf
[0].Y
, ptf
[1].X
, ptf
[1].Y
);
4736 GdipSetPageUnit(graphics
, UnitPoint
);
4739 status
= GdipGetClipBounds(graphics
, &rect
);
4741 ok((rect
.X
== 13.75 && rect
.Y
== 4.375 && rect
.Width
== 18.75 && rect
.Height
== 9.375) ||
4742 /* rounding under Wine is slightly different */
4743 (rect
.X
== 14.0 && rect
.Y
== 4.0 && rect
.Width
== 19.0 && rect
.Height
== 10.0) /* Wine */ ||
4744 broken(rect
.X
== 45.0 && rect
.Y
== 20.0 && rect
.Width
== 50.0 && rect
.Height
== 25.0) /* before Win7 */,
4745 "expected 13.75,4.375-18.75,9.375, got %.2f,%.2f-%.2f,%.2f\n", rect
.X
, rect
.Y
, rect
.Width
, rect
.Height
);
4747 status
= GdipSetEmpty(region
);
4749 status
= GdipGetClip(graphics
, region
);
4751 status
= GdipGetRegionBounds(region
, graphics
, &rect
);
4753 ok((rect
.X
== 13.75 && rect
.Y
== 4.375 && rect
.Width
== 18.75 && rect
.Height
== 9.375) ||
4754 /* rounding under Wine is slightly different */
4755 (rect
.X
== 14.0 && rect
.Y
== 4.0 && rect
.Width
== 19.0 && rect
.Height
== 10.0) /* Wine */ ||
4756 broken(rect
.X
== 45.0 && rect
.Y
== 20.0 && rect
.Width
== 50.0 && rect
.Height
== 25.0) /* before Win7 */,
4757 "expected 13.75,4.375-18.75,9.375, got %.2f,%.2f-%.2f,%.2f\n", rect
.X
, rect
.Y
, rect
.Width
, rect
.Height
);
4759 status
= GdipGetRegionBounds(region100x100
, graphics
, &rect
);
4761 ok(rect
.X
== 100.0 && rect
.Y
== 100.0 && rect
.Width
== 100.0 && rect
.Height
== 100.0,
4762 "expected 100.0,100.0-100.0,100.0, got %.2f,%.2f-%.2f,%.2f\n", rect
.X
, rect
.Y
, rect
.Width
, rect
.Height
);
4764 status
= GdipGetRegionHRgn(region
, NULL
, &hrgn
);
4766 ret
= GetRgnBox(hrgn
, &rc
);
4767 ok(ret
== SIMPLEREGION
, "expected SIMPLEREGION, got %d\n", ret
);
4768 ok((rc
.left
== 14 && rc
.top
== 5 && rc
.right
== 33 && rc
.bottom
== 14) ||
4769 /* rounding under Wine is slightly different */
4770 (rc
.left
== 14 && rc
.top
== 4 && rc
.right
== 33 && rc
.bottom
== 14) /* Wine */ ||
4771 broken(rc
.left
== 45 && rc
.top
== 20 && rc
.right
== 95 && rc
.bottom
== 45) /* before Win7 */,
4772 "expected 14,5-33,14, got %d,%d-%d,%d\n", rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
4775 status
= GdipGetRegionHRgn(region
, graphics
, &hrgn
);
4777 ret
= GetRgnBox(hrgn
, &rc
);
4778 ok(ret
== SIMPLEREGION
, "expected SIMPLEREGION, got %d\n", ret
);
4779 ok((rc
.left
== 100 && rc
.top
== 100 && rc
.right
== 200 && rc
.bottom
== 200) ||
4780 broken(rc
.left
== 267 && rc
.top
== 267 && rc
.right
== 534 && rc
.bottom
== 534) /* before Win7 */,
4781 "expected 100,100-200,200, got %d,%d-%d,%d\n", rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
4788 status
= GdipTransformPoints(graphics
, CoordinateSpaceWorld
, CoordinateSpaceDevice
, ptf
, 2);
4790 ok((ptf
[0].X
== 13.75 && ptf
[0].Y
== 4.375 && ptf
[1].X
== 32.5 && ptf
[1].Y
== 13.75) ||
4791 broken(ptf
[0].X
== 45.0 && ptf
[0].Y
== 20.0 && ptf
[1].X
== 95.0 && ptf
[1].Y
== 45.0) /* before Win7 */,
4792 "expected 13.75,4.375-32.5,13.75, got %f,%f-%f,%f\n", ptf
[0].X
, ptf
[0].Y
, ptf
[1].X
, ptf
[1].Y
);
4794 status
= GdipGetRegionHRgn(region100x100
, NULL
, &hrgn
);
4796 ret
= GetRgnBox(hrgn
, &rc
);
4797 ok(ret
== SIMPLEREGION
, "expected SIMPLEREGION, got %d\n", ret
);
4798 ok(rc
.left
== 100 && rc
.top
== 100 && rc
.right
== 200 && rc
.bottom
== 200,
4799 "expected 100,100-200,200, got %d,%d-%d,%d\n", rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
4802 status
= GdipGetRegionHRgn(region100x100
, graphics
, &hrgn
);
4804 ret
= GetRgnBox(hrgn
, &rc
);
4805 ok(ret
== SIMPLEREGION
, "expected SIMPLEREGION, got %d\n", ret
);
4806 ok((rc
.left
== 560 && rc
.top
== 1120 && rc
.right
== 1094 && rc
.bottom
== 2187) ||
4807 /* rounding under Wine is slightly different */
4808 (rc
.left
== 560 && rc
.top
== 1120 && rc
.right
== 1093 && rc
.bottom
== 2187) /* Wine */,
4809 "expected 560,1120-1094,2187, got %d,%d-%d,%d\n", rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
4816 status
= GdipTransformPoints(graphics
, CoordinateSpaceWorld
, CoordinateSpaceDevice
, ptf
, 2);
4818 if (fabs(ptf
[0].X
- 100.0) < 0.001)
4820 expectf(100.0, ptf
[0].X
);
4821 expectf(100.0, ptf
[0].Y
);
4822 expectf(200.125, ptf
[1].X
);
4823 expectf(200.03125, ptf
[1].Y
);
4825 else /* before Win7 */
4827 ok(broken(fabs(ptf
[0].X
- 275.0) < 0.001), "expected 275.0, got %f\n", ptf
[0].X
);
4828 ok(broken(fabs(ptf
[0].Y
- 275.0) < 0.001), "expected 275.0, got %f\n", ptf
[0].Y
);
4829 ok(broken(fabs(ptf
[1].X
- 542.0) < 0.001), "expected 542.0, got %f\n", ptf
[1].X
);
4830 ok(broken(fabs(ptf
[1].Y
- 541.75) < 0.001), "expected 541.75, got %f\n", ptf
[1].Y
);
4833 status
= GdipTransformRegion(region100x100
, matrix
);
4836 status
= GdipGetRegionBounds(region100x100
, graphics
, &rect
);
4838 ok(rect
.X
== 210.0 && rect
.Y
== 420.0 && rect
.Width
== 200.0 && rect
.Height
== 400.0,
4839 "expected 210.0,420.0-200.0,400.0, got %.2f,%.2f-%.2f,%.2f\n", rect
.X
, rect
.Y
, rect
.Width
, rect
.Height
);
4841 status
= GdipGetRegionHRgn(region100x100
, NULL
, &hrgn
);
4843 ret
= GetRgnBox(hrgn
, &rc
);
4844 ok(ret
== SIMPLEREGION
, "expected SIMPLEREGION, got %d\n", ret
);
4845 ok(rc
.left
== 210 && rc
.top
== 420 && rc
.right
== 410 && rc
.bottom
== 820,
4846 "expected 210,420-410,820, got %d,%d-%d,%d\n", rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
4849 status
= GdipGetRegionHRgn(region100x100
, graphics
, &hrgn
);
4851 ret
= GetRgnBox(hrgn
, &rc
);
4852 ok(ret
== SIMPLEREGION
, "expected SIMPLEREGION, got %d\n", ret
);
4853 ok((rc
.left
== 1147 && rc
.top
== 4534 && rc
.right
== 2214 && rc
.bottom
== 8800) ||
4854 /* rounding under Wine is slightly different */
4855 (rc
.left
== 1147 && rc
.top
== 4533 && rc
.right
== 2213 && rc
.bottom
== 8800) /* Wine */,
4856 "expected 1147,4534-2214,8800, got %d,%d-%d,%d\n", rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
4863 status
= GdipTransformPoints(graphics
, CoordinateSpaceWorld
, CoordinateSpaceDevice
, ptf
, 2);
4865 if (fabs(ptf
[0].X
- 210.0625) < 0.001)
4867 expectf(210.0625, ptf
[0].X
);
4868 expectf(420.0625, ptf
[0].Y
);
4869 expectf(410.125, ptf
[1].X
);
4870 expectf(820.0, ptf
[1].Y
);
4872 else /* before Win7 */
4874 ok(broken(fabs(ptf
[0].X
- 568.5) < 0.001), "expected 568.5, got %f\n", ptf
[0].X
);
4875 ok(broken(fabs(ptf
[0].Y
- 1128.5) < 0.001), "expected 1128.5, got %f\n", ptf
[0].Y
);
4876 ok(broken(fabs(ptf
[1].X
- 1102.0) < 0.001), "expected 1102.0, got %f\n", ptf
[1].X
);
4877 ok(broken(fabs(ptf
[1].Y
- 2195.0) < 0.001), "expected 2195.0, got %f\n", ptf
[1].Y
);
4880 status
= GdipRotateMatrix(matrix
, 30.0, MatrixOrderAppend
);
4882 status
= GdipSetWorldTransform(graphics
, matrix
);
4885 status
= GdipGetClipBounds(graphics
, &rect
);
4887 expectf_(20.612978, rect
.X
, 1.0);
4888 expectf_(-6.256012, rect
.Y
, 1.5);
4889 expectf_(25.612978, rect
.Width
, 1.0);
4890 expectf_(12.806489, rect
.Height
, 1.0);
4892 status
= GdipSetEmpty(region
);
4894 status
= GdipGetClip(graphics
, region
);
4896 status
= GdipGetRegionBounds(region
, graphics
, &rect
);
4898 /* rounding under Wine is slightly different */
4899 expectf_(20.612978, rect
.X
, 1.0);
4900 expectf_(-6.256012, rect
.Y
, 1.5);
4901 expectf_(25.612978, rect
.Width
, 1.0);
4902 expectf_(12.806489, rect
.Height
, 1.0);
4904 status
= GdipGetRegionBounds(region100x100
, graphics
, &rect
);
4906 ok(rect
.X
== 210.0 && rect
.Y
== 420.0 && rect
.Width
== 200.0 && rect
.Height
== 400.0,
4907 "expected 210.0,420.0-200.0,400.0, got %f,%f-%f,%f\n", rect
.X
, rect
.Y
, rect
.Width
, rect
.Height
);
4909 status
= GdipGetRegionHRgn(region
, NULL
, &hrgn
);
4911 ret
= GetRgnBox(hrgn
, &rc
);
4912 ok(ret
== COMPLEXREGION
, "expected COMPLEXREGION, got %d\n", ret
);
4913 ok((rc
.left
== 22 && rc
.top
== -6 && rc
.right
== 46 && rc
.bottom
== 7) ||
4914 /* rounding under Wine is slightly different */
4915 (rc
.left
== 21 && rc
.top
== -5 && rc
.right
== 46 && rc
.bottom
== 7) /* Wine */,
4916 "expected (22,-6)-(46,7), got (%d,%d)-(%d,%d)\n", rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
4919 status
= GdipGetRegionHRgn(region
, graphics
, &hrgn
);
4921 ret
= GetRgnBox(hrgn
, &rc
);
4922 ok(ret
== SIMPLEREGION
, "expected SIMPLEREGION, got %d\n", ret
);
4923 ok(rc
.left
== 100 && rc
.top
== 100 && rc
.right
== 200 && rc
.bottom
== 200,
4924 "expected 100,100-200,200, got %d,%d-%d,%d\n", rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
4935 status
= GdipTransformPoints(graphics
, CoordinateSpaceWorld
, CoordinateSpaceDevice
, ptf
, 4);
4937 expectf(20.612978, ptf
[0].X
);
4938 expectf(-1.568512, ptf
[0].Y
);
4939 expectf(46.225956, ptf
[1].X
);
4940 expectf(1.862977, ptf
[1].Y
);
4941 expectf(36.850956, ptf
[2].X
);
4942 expectf(-6.256012, ptf
[2].Y
);
4943 expectf(29.987980, ptf
[3].X
);
4944 expectf(6.550478, ptf
[3].Y
);
4946 status
= GdipGetRegionHRgn(region100x100
, NULL
, &hrgn
);
4948 ret
= GetRgnBox(hrgn
, &rc
);
4949 ok(ret
== SIMPLEREGION
, "expected SIMPLEREGION, got %d\n", ret
);
4950 ok(rc
.left
== 210 && rc
.top
== 420 && rc
.right
== 410 && rc
.bottom
== 820,
4951 "expected 210,420-410,820, got %d,%d-%d,%d\n", rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
4954 status
= GdipGetRegionHRgn(region100x100
, graphics
, &hrgn
);
4956 ret
= GetRgnBox(hrgn
, &rc
);
4957 ok(ret
== COMPLEXREGION
, "expected COMPLEXREGION, got %d\n", ret
);
4958 ok((rc
.left
== -3406 && rc
.top
== 4500 && rc
.right
== -350 && rc
.bottom
== 8728) ||
4959 /* rounding under Wine is slightly different */
4960 (rc
.left
== -3407 && rc
.top
== 4500 && rc
.right
== -350 && rc
.bottom
== 8728) /* Wine */,
4961 "expected (-3406,4500)-(-350,8728), got (%d,%d)-(%d,%d)\n", rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
4972 status
= GdipTransformPoints(graphics
, CoordinateSpaceWorld
, CoordinateSpaceDevice
, ptf
, 4);
4974 expectf(-136.190491, ptf
[0].X
);
4975 expectf(520.010742, ptf
[0].Y
);
4976 expectf(756.417175, ptf
[1].X
);
4977 expectf(720.031616, ptf
[1].Y
);
4978 expectf(360.042114, ptf
[2].X
);
4979 expectf(376.760742, ptf
[2].Y
);
4980 expectf(260.184570, ptf
[3].X
);
4981 expectf(863.281616, ptf
[3].Y
);
4983 status
= GdipRotateMatrix(matrix
, -90.0, MatrixOrderAppend
);
4985 status
= GdipSetWorldTransform(graphics
, matrix
);
4988 status
= GdipGetClipBounds(graphics
, &rect
);
4990 expectf_(-28.100956, rect
.X
, 1.0);
4991 expectf_(7.806488, rect
.Y
, 1.5);
4992 expectf_(25.612978, rect
.Width
, 1.0);
4993 expectf_(12.806489, rect
.Height
, 1.0);
4995 status
= GdipSetEmpty(region
);
4997 status
= GdipGetClip(graphics
, region
);
4999 status
= GdipGetRegionBounds(region
, graphics
, &rect
);
5001 /* rounding under Wine is slightly different */
5002 expectf_(-28.100956, rect
.X
, 1.0);
5003 expectf_(7.806488, rect
.Y
, 1.5);
5004 expectf_(25.612978, rect
.Width
, 1.0);
5005 expectf_(12.806489, rect
.Height
, 1.0);
5007 status
= GdipGetRegionBounds(region100x100
, graphics
, &rect
);
5009 ok(rect
.X
== 210.0 && rect
.Y
== 420.0 && rect
.Width
== 200.0 && rect
.Height
== 400.0,
5010 "expected 210.0,420.0-200.0,400.0, got %f,%f-%f,%f\n", rect
.X
, rect
.Y
, rect
.Width
, rect
.Height
);
5012 status
= GdipGetRegionHRgn(region
, NULL
, &hrgn
);
5014 ret
= GetRgnBox(hrgn
, &rc
);
5015 ok(ret
== COMPLEXREGION
, "expected COMPLEXREGION, got %d\n", ret
);
5016 ok((rc
.left
== -27 && rc
.top
== 8 && rc
.right
== -2 && rc
.bottom
== 21) ||
5017 /* rounding under Wine is slightly different */
5018 (rc
.left
== -28 && rc
.top
== 9 && rc
.right
== -2 && rc
.bottom
== 21) /* Wine */,
5019 "expected (-27,8)-(-2,21), got (%d,%d)-(%d,%d)\n", rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
5022 status
= GdipGetRegionHRgn(region
, graphics
, &hrgn
);
5024 ret
= GetRgnBox(hrgn
, &rc
);
5025 ok(ret
== SIMPLEREGION
, "expected SIMPLEREGION, got %d\n", ret
);
5026 ok(rc
.left
== 100 && rc
.top
== 100 && rc
.right
== 200 && rc
.bottom
== 200,
5027 "expected 100,100-200,200, got %d,%d-%d,%d\n", rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
5038 status
= GdipTransformPoints(graphics
, CoordinateSpaceWorld
, CoordinateSpaceDevice
, ptf
, 4);
5040 expectf(-11.862979, ptf
[0].X
);
5041 expectf(7.806488, ptf
[0].Y
);
5042 expectf(-18.725958, ptf
[1].X
);
5043 expectf(20.612976, ptf
[1].Y
);
5044 expectf(-2.487981, ptf
[2].X
);
5045 expectf(15.925477, ptf
[2].Y
);
5046 expectf(-28.100956, ptf
[3].X
);
5047 expectf(12.493987, ptf
[3].Y
);
5049 status
= GdipGetRegionHRgn(region100x100
, NULL
, &hrgn
);
5051 ret
= GetRgnBox(hrgn
, &rc
);
5052 ok(ret
== SIMPLEREGION
, "expected SIMPLEREGION, got %d\n", ret
);
5053 ok(rc
.left
== 210 && rc
.top
== 420 && rc
.right
== 410 && rc
.bottom
== 820,
5054 "expected 210,420-410,820, got %d,%d-%d,%d\n", rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
5057 status
= GdipGetRegionHRgn(region100x100
, graphics
, &hrgn
);
5059 ret
= GetRgnBox(hrgn
, &rc
);
5060 ok(ret
== COMPLEXREGION
, "expected COMPLEXREGION, got %d\n", ret
);
5061 ok((rc
.left
== 4500 && rc
.top
== 351 && rc
.right
== 8728 && rc
.bottom
== 3407) ||
5062 /* rounding under Wine is slightly different */
5063 (rc
.left
== 4499 && rc
.top
== 351 && rc
.right
== 8728 && rc
.bottom
== 3407) /* Wine */,
5064 "expected (4500,351)-(8728,3407), got (%d,%d)-(%d,%d)\n", rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
5075 status
= GdipTransformPoints(graphics
, CoordinateSpaceWorld
, CoordinateSpaceDevice
, ptf
, 4);
5077 expectf(-1055.021484, ptf
[0].X
);
5078 expectf(-70.595329, ptf
[0].Y
);
5079 expectf(-1455.063232, ptf
[1].X
);
5080 expectf(375.708435, ptf
[1].Y
);
5081 expectf(-768.521484, ptf
[2].X
);
5082 expectf(177.520981, ptf
[2].Y
);
5083 expectf(-1741.563110, ptf
[3].X
);
5084 expectf(127.592125, ptf
[3].Y
);
5086 GdipDeleteMatrix(matrix
);
5087 GdipDeleteRegion(region
);
5088 GdipDeleteRegion(region100x100
);
5089 GdipDeleteGraphics(graphics
);
5093 static void test_clipping_2(void)
5098 GpGraphics
*graphics
;
5108 hdc
= CreateCompatibleDC(0);
5109 status
= GdipCreateFromHDC(hdc
, &graphics
);
5112 status
= GdipGetPageUnit(graphics
, &unit
);
5114 expect(UnitDisplay
, unit
);
5116 GdipSetPageUnit(graphics
, UnitInch
);
5118 status
= GdipCreateRegion(®ion
);
5120 status
= GdipSetEmpty(region
);
5122 rect
.X
= rect
.Y
= 100.0;
5123 rect
.Width
= rect
.Height
= 100.0;
5124 status
= GdipCombineRegionRect(region
, &rect
, CombineModeUnion
);
5126 status
= GdipSetClipRegion(graphics
, region
, CombineModeReplace
);
5129 status
= GdipGetClip(graphics
, region
);
5131 status
= GdipGetRegionHRgn(region
, NULL
, &hrgn
);
5133 ret
= GetRgnBox(hrgn
, &rc
);
5134 ok(ret
== SIMPLEREGION
, "expected SIMPLEREGION, got %d\n", ret
);
5135 ok(rc
.left
== 100 && rc
.top
== 100 && rc
.right
== 200 && rc
.bottom
== 200,
5136 "expected 100,100-200,200, got %d,%d-%d,%d\n", rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
5138 status
= GdipGetRegionHRgn(region
, graphics
, &hrgn
);
5140 ret
= GetRgnBox(hrgn
, &rc
);
5141 ok(ret
== SIMPLEREGION
, "expected SIMPLEREGION, got %d\n", ret
);
5142 ok(rc
.left
== 9600 && rc
.top
== 9600 && rc
.right
== 19200 && rc
.bottom
== 19200,
5143 "expected 9600,9600-19200,19200, got %d,%d-%d,%d\n", rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
5150 status
= GdipTransformPoints(graphics
, CoordinateSpaceWorld
, CoordinateSpaceDevice
, ptf
, 2);
5152 expectf(100.0, ptf
[0].X
);
5153 expectf(100.0, ptf
[0].Y
);
5154 expectf(200.0, ptf
[1].X
);
5155 expectf(200.0, ptf
[1].X
);
5157 GdipSetPageUnit(graphics
, UnitPoint
);
5159 status
= GdipGetClip(graphics
, region
);
5161 status
= GdipGetRegionHRgn(region
, NULL
, &hrgn
);
5163 ret
= GetRgnBox(hrgn
, &rc
);
5164 ok(ret
== SIMPLEREGION
, "expected SIMPLEREGION, got %d\n", ret
);
5165 ok((rc
.left
== 7200 && rc
.top
== 7200 && rc
.right
== 14400 && rc
.bottom
== 14400) ||
5166 broken(rc
.left
== 100 && rc
.top
== 100 && rc
.right
== 200 && rc
.bottom
== 200) /* before Win7 */,
5167 "expected 7200,7200-14400,14400, got %d,%d-%d,%d\n", rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
5169 status
= GdipGetRegionHRgn(region
, graphics
, &hrgn
);
5171 ret
= GetRgnBox(hrgn
, &rc
);
5172 ok(ret
== SIMPLEREGION
, "expected SIMPLEREGION, got %d\n", ret
);
5173 ok((rc
.left
== 9600 && rc
.top
== 9600 && rc
.right
== 19200 && rc
.bottom
== 19200) ||
5174 broken(rc
.left
== 134 && rc
.top
== 134 && rc
.right
== 267 && rc
.bottom
== 267) /* before Win7 */,
5175 "expected 9600,9600-19200,19200, got %d,%d-%d,%d\n", rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
5182 status
= GdipTransformPoints(graphics
, CoordinateSpaceWorld
, CoordinateSpaceDevice
, ptf
, 2);
5184 if (fabs(ptf
[0].X
- 7200.0) < 0.001)
5185 ok(ptf
[0].X
== 7200.0 && ptf
[0].Y
== 7200.0 && ptf
[1].X
== 14400.0 && ptf
[1].Y
== 14400.0,
5186 "expected 7200.0,7200.0-14400.0,14400.0, got %f,%f-%f,%f\n", ptf
[0].X
, ptf
[0].Y
, ptf
[1].X
, ptf
[1].Y
);
5187 else /* before Win7 */
5189 ok(broken(fabs(ptf
[0].X
- 100.0) < 0.001), "expected 100.0, got %f\n", ptf
[0].X
);
5190 ok(broken(fabs(ptf
[0].Y
- 100.0) < 0.001), "expected 100.0, got %f\n", ptf
[0].Y
);
5191 ok(broken(fabs(ptf
[1].X
- 200.0) < 0.001), "expected 200.0, got %f\n", ptf
[1].X
);
5192 ok(broken(fabs(ptf
[1].Y
- 200.0) < 0.001), "expected 200.0, got %f\n", ptf
[1].Y
);
5195 GdipDeleteRegion(region
);
5197 GdipSetPageUnit(graphics
, UnitPixel
);
5199 status
= GdipCreateRegion(®ion
);
5201 status
= GdipSetEmpty(region
);
5203 rect
.X
= rect
.Y
= 100.0;
5204 rect
.Width
= rect
.Height
= 100.0;
5205 status
= GdipCombineRegionRect(region
, &rect
, CombineModeUnion
);
5207 status
= GdipSetClipRegion(graphics
, region
, CombineModeReplace
);
5210 status
= GdipGetClip(graphics
, region
);
5212 status
= GdipGetRegionHRgn(region
, NULL
, &hrgn
);
5214 ret
= GetRgnBox(hrgn
, &rc
);
5215 ok(ret
== SIMPLEREGION
, "expected SIMPLEREGION, got %d\n", ret
);
5216 ok((rc
.left
== 100 && rc
.top
== 100 && rc
.right
== 200 && rc
.bottom
== 200) ||
5217 broken(rc
.left
== 2 && rc
.top
== 2 && rc
.right
== 3 && rc
.bottom
== 3) /* before Win7 */,
5218 "expected 100,100-200,200, got %d,%d-%d,%d\n", rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
5220 status
= GdipGetRegionHRgn(region
, graphics
, &hrgn
);
5222 ret
= GetRgnBox(hrgn
, &rc
);
5223 ok(ret
== SIMPLEREGION
, "expected SIMPLEREGION, got %d\n", ret
);
5224 ok((rc
.left
== 100 && rc
.top
== 100 && rc
.right
== 200 && rc
.bottom
== 200) ||
5225 broken(rc
.left
== 2 && rc
.top
== 2 && rc
.right
== 3 && rc
.bottom
== 3) /* before Win7 */,
5226 "expected 100,100-200,200, got %d,%d-%d,%d\n", rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
5233 status
= GdipTransformPoints(graphics
, CoordinateSpaceWorld
, CoordinateSpaceDevice
, ptf
, 2);
5235 if (fabs(ptf
[0].X
- 100.0) < 0.001)
5236 ok(ptf
[0].X
== 100.0 && ptf
[0].Y
== 100.0 && ptf
[1].X
== 200.0 && ptf
[1].Y
== 200.0,
5237 "expected 100.0,100.0-200.0,200.0, got %f,%f-%f,%f\n", ptf
[0].X
, ptf
[0].Y
, ptf
[1].X
, ptf
[1].Y
);
5238 else /* before Win7 */
5240 ok(broken(fabs(ptf
[0].X
- 1.041667) < 0.001), "expected 1.041667, got %f\n", ptf
[0].X
);
5241 ok(broken(fabs(ptf
[0].Y
- 1.041667) < 0.001), "expected 1.041667, got %f\n", ptf
[0].Y
);
5242 ok(broken(fabs(ptf
[1].X
- 2.083333) < 0.001), "expected 2.083333, got %f\n", ptf
[1].X
);
5243 ok(broken(fabs(ptf
[1].Y
- 2.083333) < 0.001), "expected 2.083333, got %f\n", ptf
[1].Y
);
5246 GdipSetPageUnit(graphics
, UnitPoint
);
5248 status
= GdipGetClip(graphics
, region
);
5250 status
= GdipGetRegionHRgn(region
, NULL
, &hrgn
);
5252 ret
= GetRgnBox(hrgn
, &rc
);
5253 ok(ret
== SIMPLEREGION
, "expected SIMPLEREGION, got %d\n", ret
);
5254 ok((rc
.left
== 75 && rc
.top
== 75 && rc
.right
== 150 && rc
.bottom
== 150) ||
5255 broken(rc
.left
== 2 && rc
.top
== 2 && rc
.right
== 3 && rc
.bottom
== 3) /* before Win7 */,
5256 "expected 75,75-150,150, got %d,%d-%d,%d\n", rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
5258 status
= GdipGetRegionHRgn(region
, graphics
, &hrgn
);
5260 ret
= GetRgnBox(hrgn
, &rc
);
5261 ok(ret
== SIMPLEREGION
, "expected SIMPLEREGION, got %d\n", ret
);
5262 ok((rc
.left
== 100 && rc
.top
== 100 && rc
.right
== 200 && rc
.bottom
== 200) ||
5263 broken(rc
.left
== 2 && rc
.top
== 2 && rc
.right
== 3 && rc
.bottom
== 3) /* before Win7 */,
5264 "expected 100,100-200,200, got %d,%d-%d,%d\n", rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
5271 status
= GdipTransformPoints(graphics
, CoordinateSpaceWorld
, CoordinateSpaceDevice
, ptf
, 2);
5273 if (fabs(ptf
[0].X
- 75.0) < 0.001)
5274 ok(ptf
[0].X
== 75.0 && ptf
[0].Y
== 75.0 && ptf
[1].X
== 150.0 && ptf
[1].Y
== 150.0,
5275 "expected 75.0,75.0-150.0,150.0, got %f,%f-%f,%f\n", ptf
[0].X
, ptf
[0].Y
, ptf
[1].X
, ptf
[1].Y
);
5276 else /* before Win7 */
5278 ok(broken(fabs(ptf
[0].X
- 1.041667) < 0.001), "expected 1.041667, got %f\n", ptf
[0].X
);
5279 ok(broken(fabs(ptf
[0].Y
- 1.041667) < 0.001), "expected 1.041667, got %f\n", ptf
[0].Y
);
5280 ok(broken(fabs(ptf
[1].X
- 2.083333) < 0.001), "expected 2.083333, got %f\n", ptf
[1].X
);
5281 ok(broken(fabs(ptf
[1].Y
- 2.083333) < 0.001), "expected 2.083333, got %f\n", ptf
[1].Y
);
5284 status
= GdipCreateMatrix(&matrix
);
5286 status
= GdipTranslateMatrix(matrix
, 10.0, 10.0, MatrixOrderAppend
);
5288 status
= GdipSetWorldTransform(graphics
, matrix
);
5290 GdipDeleteMatrix(matrix
);
5292 status
= GdipGetClip(graphics
, region
);
5294 status
= GdipGetRegionHRgn(region
, NULL
, &hrgn
);
5296 ret
= GetRgnBox(hrgn
, &rc
);
5297 ok(ret
== SIMPLEREGION
, "expected SIMPLEREGION, got %d\n", ret
);
5298 ok(rc
.left
== 65 && rc
.top
== 65 && rc
.right
== 140 && rc
.bottom
== 140,
5299 "expected 65,65-140,140, got %d,%d-%d,%d\n", rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
5301 status
= GdipGetRegionHRgn(region
, graphics
, &hrgn
);
5303 ret
= GetRgnBox(hrgn
, &rc
);
5304 ok(ret
== SIMPLEREGION
, "expected SIMPLEREGION, got %d\n", ret
);
5305 ok(rc
.left
== 100 && rc
.top
== 100 && rc
.right
== 200 && rc
.bottom
== 200,
5306 "expected 100,100-200,200, got %d,%d-%d,%d\n", rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
5313 status
= GdipTransformPoints(graphics
, CoordinateSpaceWorld
, CoordinateSpaceDevice
, ptf
, 2);
5315 expectf(65.0, ptf
[0].X
);
5316 expectf(65.0, ptf
[0].Y
);
5317 expectf(140.0, ptf
[1].X
);
5318 expectf(140.0, ptf
[1].X
);
5320 status
= GdipCreateMatrix(&matrix
);
5322 status
= GdipScaleMatrix(matrix
, 0.25, 0.5, MatrixOrderAppend
);
5324 status
= GdipSetWorldTransform(graphics
, matrix
);
5326 GdipDeleteMatrix(matrix
);
5328 status
= GdipGetClip(graphics
, region
);
5330 status
= GdipGetRegionHRgn(region
, NULL
, &hrgn
);
5332 ret
= GetRgnBox(hrgn
, &rc
);
5333 ok(ret
== SIMPLEREGION
, "expected SIMPLEREGION, got %d\n", ret
);
5334 ok(rc
.left
== 300 && rc
.top
== 150 && rc
.right
== 600 && rc
.bottom
== 300,
5335 "expected 300,150-600,300, got %d,%d-%d,%d\n", rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
5337 status
= GdipGetRegionHRgn(region
, graphics
, &hrgn
);
5339 ret
= GetRgnBox(hrgn
, &rc
);
5340 ok(ret
== SIMPLEREGION
, "expected SIMPLEREGION, got %d\n", ret
);
5341 ok(rc
.left
== 100 && rc
.top
== 100 && rc
.right
== 200 && rc
.bottom
== 200,
5342 "expected 100,100-200,200, got %d,%d-%d,%d\n", rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
5349 status
= GdipTransformPoints(graphics
, CoordinateSpaceWorld
, CoordinateSpaceDevice
, ptf
, 2);
5351 expectf(300.0, ptf
[0].X
);
5352 expectf(150.0, ptf
[0].Y
);
5353 expectf(600.0, ptf
[1].X
);
5354 expectf(300.0, ptf
[1].Y
);
5356 status
= GdipSetPageScale(graphics
, 2.0);
5359 status
= GdipGetClip(graphics
, region
);
5361 status
= GdipGetRegionHRgn(region
, NULL
, &hrgn
);
5363 ret
= GetRgnBox(hrgn
, &rc
);
5364 ok(ret
== SIMPLEREGION
, "expected SIMPLEREGION, got %d\n", ret
);
5365 ok((rc
.left
== 150 && rc
.top
== 75 && rc
.right
== 300 && rc
.bottom
== 150) ||
5366 broken(rc
.left
== 300 && rc
.top
== 150 && rc
.right
== 600 && rc
.bottom
== 300) /* before Win7 */,
5367 "expected 150,75-300,150, got %d,%d-%d,%d\n", rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
5369 status
= GdipGetRegionHRgn(region
, graphics
, &hrgn
);
5371 ret
= GetRgnBox(hrgn
, &rc
);
5372 ok(ret
== SIMPLEREGION
, "expected SIMPLEREGION, got %d\n", ret
);
5373 ok((rc
.left
== 100 && rc
.top
== 100 && rc
.right
== 200 && rc
.bottom
== 200) ||
5374 broken(rc
.left
== 200 && rc
.top
== 200 && rc
.right
== 400 && rc
.bottom
== 400) /* before Win7 */,
5375 "expected 100,100-200,200, got %d,%d-%d,%d\n", rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
5382 status
= GdipTransformPoints(graphics
, CoordinateSpaceWorld
, CoordinateSpaceDevice
, ptf
, 2);
5384 if (fabs(ptf
[0].X
- 150.0) < 0.001)
5386 expectf(150.0, ptf
[0].X
);
5387 expectf(75.0, ptf
[0].Y
);
5388 expectf(300.0, ptf
[1].X
);
5389 expectf(150.0, ptf
[1].Y
);
5391 else /* before Win7 */
5393 ok(broken(fabs(ptf
[0].X
- 300.0) < 0.001), "expected 300.0, got %f\n", ptf
[0].X
);
5394 ok(broken(fabs(ptf
[0].Y
- 150.0) < 0.001), "expected 150.0, got %f\n", ptf
[0].Y
);
5395 ok(broken(fabs(ptf
[1].X
- 600.0) < 0.001), "expected 600.0, got %f\n", ptf
[1].X
);
5396 ok(broken(fabs(ptf
[1].Y
- 300.0) < 0.001), "expected 300.0, got %f\n", ptf
[1].Y
);
5399 status
= GdipCreateMatrix(&matrix
);
5401 status
= GdipRotateMatrix(matrix
, 45.0, MatrixOrderAppend
);
5403 status
= GdipSetWorldTransform(graphics
, matrix
);
5405 GdipDeleteMatrix(matrix
);
5407 status
= GdipGetClip(graphics
, region
);
5409 status
= GdipGetRegionHRgn(region
, NULL
, &hrgn
);
5411 ret
= GetRgnBox(hrgn
, &rc
);
5412 ok(ret
== COMPLEXREGION
, "expected COMPLEXREGION, got %d\n", ret
);
5413 ok((rc
.left
== 54 && rc
.top
== -26 && rc
.right
== 107 && rc
.bottom
== 27) ||
5414 /* rounding under Wine is slightly different */
5415 (rc
.left
== 53 && rc
.top
== -26 && rc
.right
== 106 && rc
.bottom
== 27) /* Wine */,
5416 "expected 54,-26-107,27, got %d,%d-%d,%d\n", rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
5418 status
= GdipGetRegionHRgn(region
, graphics
, &hrgn
);
5420 ret
= GetRgnBox(hrgn
, &rc
);
5421 ok(ret
== SIMPLEREGION
, "expected SIMPLEREGION, got %d\n", ret
);
5422 ok(rc
.left
== 100 && rc
.top
== 100 && rc
.right
== 200 && rc
.bottom
== 200,
5423 "expected 100,100-200,200, got %d,%d-%d,%d\n", rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
5434 status
= GdipTransformPoints(graphics
, CoordinateSpaceWorld
, CoordinateSpaceDevice
, ptf
, 4);
5436 expectf(53.033016, ptf
[0].X
);
5437 expectf(0.0, ptf
[0].Y
);
5438 expectf(106.066032, ptf
[1].X
);
5439 expectf(0.0, ptf
[1].Y
);
5440 expectf(79.549522, ptf
[2].X
);
5441 expectf(-26.516510, ptf
[2].Y
);
5442 expectf(79.549522, ptf
[3].X
);
5443 expectf(26.516508, ptf
[3].Y
);
5445 status
= GdipCreateMatrix(&matrix
);
5447 status
= GdipRotateMatrix(matrix
, -45.0, MatrixOrderAppend
);
5449 status
= GdipSetWorldTransform(graphics
, matrix
);
5451 GdipDeleteMatrix(matrix
);
5453 status
= GdipGetClip(graphics
, region
);
5455 status
= GdipGetRegionHRgn(region
, NULL
, &hrgn
);
5457 ret
= GetRgnBox(hrgn
, &rc
);
5458 ok(ret
== COMPLEXREGION
, "expected COMPLEXREGION, got %d\n", ret
);
5459 ok((rc
.left
== -26 && rc
.top
== 54 && rc
.right
== 27 && rc
.bottom
== 107) ||
5460 /* rounding under Wine is slightly different */
5461 (rc
.left
== -27 && rc
.top
== 54 && rc
.right
== 27 && rc
.bottom
== 106) /* Wine */,
5462 "expected -26,54-27,107, got %d,%d-%d,%d\n", rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
5464 status
= GdipGetRegionHRgn(region
, graphics
, &hrgn
);
5466 ret
= GetRgnBox(hrgn
, &rc
);
5467 ok(ret
== SIMPLEREGION
, "expected SIMPLEREGION, got %d\n", ret
);
5468 ok(rc
.left
== 100 && rc
.top
== 100 && rc
.right
== 200 && rc
.bottom
== 200,
5469 "expected 100,100-200,200, got %d,%d-%d,%d\n", rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
5480 status
= GdipTransformPoints(graphics
, CoordinateSpaceWorld
, CoordinateSpaceDevice
, ptf
, 4);
5482 expectf(0.0, ptf
[0].X
);
5483 expectf(53.033005, ptf
[0].Y
);
5484 expectf(0.0, ptf
[1].X
);
5485 expectf(106.066010, ptf
[1].Y
);
5486 expectf(26.516491, ptf
[2].X
);
5487 expectf(79.549507, ptf
[2].Y
);
5488 expectf(-26.516520, ptf
[3].X
);
5489 expectf(79.549500, ptf
[3].Y
);
5491 GdipDeleteRegion(region
);
5492 GdipDeleteGraphics(graphics
);
5497 static void test_GdipFillRectangles(void)
5500 GpGraphics
*graphics
= NULL
;
5501 GpBrush
*brush
= NULL
;
5502 HDC hdc
= GetDC( hwnd
);
5503 GpRectF rects
[2] = {{0,0,10,10}, {10,10,10,10}};
5505 ok(hdc
!= NULL
, "Expected HDC to be initialized\n");
5507 status
= GdipCreateFromHDC(hdc
, &graphics
);
5509 ok(graphics
!= NULL
, "Expected graphics to be initialized\n");
5511 status
= GdipCreateSolidFill((ARGB
)0xffff00ff, (GpSolidFill
**)&brush
);
5513 ok(brush
!= NULL
, "Expected brush to be initialized\n");
5515 status
= GdipFillRectangles(NULL
, brush
, rects
, 2);
5516 expect(InvalidParameter
, status
);
5518 status
= GdipFillRectangles(graphics
, NULL
, rects
, 2);
5519 expect(InvalidParameter
, status
);
5521 status
= GdipFillRectangles(graphics
, brush
, NULL
, 2);
5522 expect(InvalidParameter
, status
);
5524 status
= GdipFillRectangles(graphics
, brush
, rects
, 0);
5525 expect(InvalidParameter
, status
);
5527 status
= GdipFillRectangles(graphics
, brush
, rects
, -1);
5528 expect(InvalidParameter
, status
);
5530 status
= GdipFillRectangles(graphics
, brush
, rects
, 1);
5533 status
= GdipFillRectangles(graphics
, brush
, rects
, 2);
5536 GdipDeleteBrush(brush
);
5537 GdipDeleteGraphics(graphics
);
5539 ReleaseDC(hwnd
, hdc
);
5542 START_TEST(graphics
)
5544 struct GdiplusStartupInput gdiplusStartupInput
;
5545 ULONG_PTR gdiplusToken
;
5548 memset( &class, 0, sizeof(class) );
5549 class.lpszClassName
= "gdiplus_test";
5550 class.style
= CS_HREDRAW
| CS_VREDRAW
;
5551 class.lpfnWndProc
= DefWindowProcA
;
5552 class.hInstance
= GetModuleHandleA(0);
5553 class.hIcon
= LoadIconA(0, (LPCSTR
)IDI_APPLICATION
);
5554 class.hCursor
= LoadCursorA(0, (LPCSTR
)IDC_ARROW
);
5555 class.hbrBackground
= (HBRUSH
)(COLOR_WINDOW
+ 1);
5556 RegisterClassA( &class );
5557 hwnd
= CreateWindowA( "gdiplus_test", "graphics test", WS_OVERLAPPEDWINDOW
| WS_VISIBLE
,
5558 CW_USEDEFAULT
, CW_USEDEFAULT
, 200, 200, 0, 0, GetModuleHandleA(0), 0 );
5559 ok(hwnd
!= NULL
, "Expected window to be created\n");
5561 gdiplusStartupInput
.GdiplusVersion
= 1;
5562 gdiplusStartupInput
.DebugEventCallback
= NULL
;
5563 gdiplusStartupInput
.SuppressBackgroundThread
= 0;
5564 gdiplusStartupInput
.SuppressExternalCodecs
= 0;
5566 GdiplusStartup(&gdiplusToken
, &gdiplusStartupInput
, NULL
);
5570 test_measured_extra_space();
5571 test_measure_string();
5572 test_font_height_scaling();
5574 test_GdipMeasureString();
5575 test_constructor_destructor();
5576 test_save_restore();
5577 test_GdipFillClosedCurve2();
5578 test_GdipFillClosedCurve2I();
5579 test_GdipDrawBezierI();
5581 test_GdipDrawArcI();
5582 test_GdipDrawCurve();
5583 test_GdipDrawCurveI();
5584 test_GdipDrawCurve2();
5585 test_GdipDrawCurve2I();
5586 test_GdipDrawCurve3();
5587 test_GdipDrawCurve3I();
5588 test_GdipDrawLineI();
5589 test_GdipDrawLinesI();
5590 test_GdipDrawImagePointsRect();
5591 test_GdipFillClosedCurve();
5592 test_GdipFillClosedCurveI();
5593 test_GdipDrawString();
5594 test_GdipGetNearestColor();
5595 test_GdipGetVisibleClipBounds();
5596 test_GdipIsVisiblePoint();
5597 test_GdipIsVisibleRect();
5598 test_Get_Release_DC();
5599 test_BeginContainer2();
5600 test_transformpoints();
5601 test_get_set_clip();
5604 test_textcontrast();
5605 test_fromMemoryBitmap();
5606 test_string_functions();
5607 test_get_set_interpolation();
5608 test_get_set_textrenderinghint();
5609 test_getdc_scaled();
5611 test_bitmapfromgraphics();
5612 test_GdipFillRectangles();
5614 GdiplusShutdown(gdiplusToken
);
5615 DestroyWindow( hwnd
);