Dmitry Timoshkov : gdiplus: Fix clipping region bounds calculation with rotating transform.
Alexandre Julliard
julliard at winehq.org
Tue Jul 30 14:14:23 CDT 2013
Module: wine
Branch: master
Commit: cdc3e820cd109ee086f0d1b7bab7a1fb21ee5fd3
URL: http://source.winehq.org/git/wine.git/?a=commit;h=cdc3e820cd109ee086f0d1b7bab7a1fb21ee5fd3
Author: Dmitry Timoshkov <dmitry at baikal.ru>
Date: Mon Jul 22 17:49:19 2013 +0900
gdiplus: Fix clipping region bounds calculation with rotating transform.
---
dlls/gdiplus/graphics.c | 9 +++++++--
dlls/gdiplus/tests/graphics.c | 20 +++++++++-----------
2 files changed, 16 insertions(+), 13 deletions(-)
diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c
index 43464c9..d79239e 100644
--- a/dlls/gdiplus/graphics.c
+++ b/dlls/gdiplus/graphics.c
@@ -4068,6 +4068,7 @@ GpStatus WINGDIPAPI GdipFlush(GpGraphics *graphics, GpFlushIntention intention)
GpStatus WINGDIPAPI GdipGetClipBounds(GpGraphics *graphics, GpRectF *rect)
{
GpStatus status;
+ GpRegion *clip;
TRACE("(%p, %p)\n", graphics, rect);
@@ -4077,10 +4078,14 @@ GpStatus WINGDIPAPI GdipGetClipBounds(GpGraphics *graphics, GpRectF *rect)
if(graphics->busy)
return ObjectBusy;
- status = GdipGetRegionBounds(graphics->clip, graphics, rect);
+ status = GdipCreateRegion(&clip);
+ if (status != Ok) return status;
+
+ status = GdipGetClip(graphics, clip);
if (status == Ok)
- transform_rectf(graphics, CoordinateSpaceWorld, CoordinateSpaceDevice, rect);
+ status = GdipGetRegionBounds(clip, graphics, rect);
+ GdipDeleteRegion(clip);
return status;
}
diff --git a/dlls/gdiplus/tests/graphics.c b/dlls/gdiplus/tests/graphics.c
index db7a409..b773d63 100644
--- a/dlls/gdiplus/tests/graphics.c
+++ b/dlls/gdiplus/tests/graphics.c
@@ -4741,6 +4741,8 @@ static void test_clipping(void)
status = GdipGetClipBounds(graphics, &rect);
expect(Ok, status);
ok((rect.X == 13.75 && rect.Y == 4.375 && rect.Width == 18.75 && rect.Height == 9.375) ||
+ /* rounding under Wine is slightly different */
+ (rect.X == 14.0 && rect.Y == 4.0 && rect.Width == 19.0 && rect.Height == 10.0) /* Wine */ ||
broken(rect.X == 45.0 && rect.Y == 20.0 && rect.Width == 50.0 && rect.Height == 25.0) /* before Win7 */,
"expected 13.75,4.375-18.75,9.375, got %.2f,%.2f-%.2f,%.2f\n", rect.X, rect.Y, rect.Width, rect.Height);
@@ -4885,9 +4887,7 @@ static void test_clipping(void)
status = GdipGetClipBounds(graphics, &rect);
expect(Ok, status);
expectf_(20.612978, rect.X, 1.0);
-todo_wine
expectf_(-6.256012, rect.Y, 1.5);
-todo_wine
expectf_(25.612978, rect.Width, 1.0);
expectf_(12.806489, rect.Height, 1.0);
@@ -4989,13 +4989,10 @@ todo_wine
status = GdipGetClipBounds(graphics, &rect);
expect(Ok, status);
-todo_wine
- expectf(-28.100956, rect.X);
- expectf(7.806488, rect.Y);
-todo_wine
- expectf(25.612978, rect.Width);
-todo_wine
- expectf(12.806489, rect.Height);
+ expectf_(-28.100956, rect.X, 1.0);
+ expectf_(7.806488, rect.Y, 1.5);
+ expectf_(25.612978, rect.Width, 1.0);
+ expectf_(12.806489, rect.Height, 1.0);
status = GdipSetEmpty(region);
expect(Ok, status);
@@ -5063,8 +5060,9 @@ todo_wine
expect(Ok, status);
ret = GetRgnBox(hrgn, &rc);
ok(ret == COMPLEXREGION, "expected COMPLEXREGION, got %d\n", ret);
-todo_wine
- ok(rc.left == 4500 && rc.top == 351 && rc.right == 8728 && rc.bottom == 3407,
+ ok((rc.left == 4500 && rc.top == 351 && rc.right == 8728 && rc.bottom == 3407) ||
+ /* rounding under Wine is slightly different */
+ (rc.left == 4499 && rc.top == 351 && rc.right == 8728 && rc.bottom == 3407) /* Wine */,
"expected (4500,351)-(8728,3407), got (%d,%d)-(%d,%d)\n", rc.left, rc.top, rc.right, rc.bottom);
DeleteObject(hrgn);
More information about the wine-cvs
mailing list