Vincent Povirk : gdiplus: Allow excluding from infinite regions.
Alexandre Julliard
julliard at winehq.org
Mon Nov 18 14:51:39 CST 2013
Module: wine
Branch: master
Commit: 1202e9af56521f7362e8e1183923ad8ec851949e
URL: http://source.winehq.org/git/wine.git/?a=commit;h=1202e9af56521f7362e8e1183923ad8ec851949e
Author: Vincent Povirk <vincent at codeweavers.com>
Date: Wed Oct 30 11:46:30 2013 -0500
gdiplus: Allow excluding from infinite regions.
---
dlls/gdiplus/region.c | 8 +++---
dlls/gdiplus/tests/region.c | 51 +++++++++++++++++++++++++++++++++++++++++++
2 files changed, 55 insertions(+), 4 deletions(-)
diff --git a/dlls/gdiplus/region.c b/dlls/gdiplus/region.c
index 832ce69..4ba86eb 100644
--- a/dlls/gdiplus/region.c
+++ b/dlls/gdiplus/region.c
@@ -988,8 +988,8 @@ static GpStatus get_region_hrgn(struct region_element *element, GpGraphics *grap
case CombineModeIntersect:
return get_region_hrgn(element->elementdata.combine.right, graphics, hrgn);
case CombineModeXor: case CombineModeExclude:
- FIXME("cannot exclude from an infinite region\n");
- /* fall-through */
+ left = CreateRectRgn(-4194304, -4194304, 4194304, 4194304);
+ break;
case CombineModeUnion: case CombineModeComplement:
*hrgn = NULL;
return Ok;
@@ -1013,8 +1013,8 @@ static GpStatus get_region_hrgn(struct region_element *element, GpGraphics *grap
*hrgn = left;
return Ok;
case CombineModeXor: case CombineModeComplement:
- FIXME("cannot exclude from an infinite region\n");
- /* fall-through */
+ right = CreateRectRgn(-4194304, -4194304, 4194304, 4194304);
+ break;
case CombineModeUnion: case CombineModeExclude:
DeleteObject(left);
*hrgn = NULL;
diff --git a/dlls/gdiplus/tests/region.c b/dlls/gdiplus/tests/region.c
index 66d950a..5632e4d 100644
--- a/dlls/gdiplus/tests/region.c
+++ b/dlls/gdiplus/tests/region.c
@@ -2082,6 +2082,56 @@ static void test_isvisiblerect(void)
ReleaseDC(0, hdc);
}
+static void test_excludeinfinite(void)
+{
+ GpStatus status;
+ GpRegion *region;
+ UINT count=0xdeadbeef;
+ GpRectF scans[4];
+ GpMatrix *identity;
+ static const RectF rect_exclude = {0.0, 0.0, 1.0, 1.0};
+
+ status = GdipCreateMatrix(&identity);
+ expect(Ok, status);
+
+ status = GdipCreateRegion(®ion);
+ expect(Ok, status);
+
+ status = GdipCombineRegionRect(region, &rect_exclude, CombineModeExclude);
+ expect(Ok, status);
+
+ status = GdipGetRegionScansCount(region, &count, identity);
+ expect(Ok, status);
+ expect(4, count);
+
+ count = 4;
+ status = GdipGetRegionScans(region, scans, (INT*)&count, identity);
+ expect(Ok, status);
+
+ expectf(-4194304.0, scans[0].X);
+ expectf(-4194304.0, scans[0].Y);
+ expectf(8388608.0, scans[0].Width);
+ expectf(4194304.0, scans[0].Height);
+
+ expectf(-4194304.0, scans[1].X);
+ expectf(0.0, scans[1].Y);
+ expectf(4194304.0, scans[1].Width);
+ expectf(1.0, scans[1].Height);
+
+ expectf(1.0, scans[2].X);
+ expectf(0.0, scans[2].Y);
+ expectf(4194303.0, scans[2].Width);
+ expectf(1.0, scans[2].Height);
+
+ expectf(-4194304.0, scans[3].X);
+ expectf(1.0, scans[3].Y);
+ expectf(8388608.0, scans[3].Width);
+ expectf(4194303.0, scans[3].Height);
+
+ GdipDeleteRegion(region);
+ GdipDeleteMatrix(identity);
+}
+
START_TEST(region)
{
struct GdiplusStartupInput gdiplusStartupInput;
@@ -2107,6 +2157,7 @@ START_TEST(region)
test_getbounds();
test_isvisiblepoint();
test_isvisiblerect();
+ test_excludeinfinite();
GdiplusShutdown(gdiplusToken);
}
More information about the wine-cvs
mailing list