[1/5] gdiplus: Implemented GdipIsEqualRegion

Nikolay Sivov bunglehead at gmail.com
Fri Jan 30 15:15:03 CST 2009


Changelog:
    - Implemented GdipIsEqualRegion

>From a865e4ce95e30ceee3e2feccce92f331d0ee6cb8 Mon Sep 17 00:00:00 2001
From: Nikolay Sivov <bunglehead at gmail.com>
Date: Fri, 30 Jan 2009 22:19:22 +0300
Subject: Implemented GdipIsEqualRegion

---
 dlls/gdiplus/region.c       |   31 +++++++++++++-
 dlls/gdiplus/tests/region.c |   93 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 122 insertions(+), 2 deletions(-)

diff --git a/dlls/gdiplus/region.c b/dlls/gdiplus/region.c
index e4cc7d8..6b510b6 100644
--- a/dlls/gdiplus/region.c
+++ b/dlls/gdiplus/region.c
@@ -1006,12 +1006,39 @@ GpStatus WINGDIPAPI GdipIsEmptyRegion(GpRegion *region, GpGraphics *graphics, BO
     return Ok;
 }
 
+/*****************************************************************************
+ * GdipIsEqualRegion [GDIPLUS.@]
+ */
 GpStatus WINGDIPAPI GdipIsEqualRegion(GpRegion *region, GpRegion *region2, GpGraphics *graphics,
                                       BOOL *res)
 {
-    FIXME("(%p, %p, %p, %p): stub\n", region, region2, graphics, res);
+    HRGN hrgn1, hrgn2;
+    GpStatus stat;
 
-    return NotImplemented;
+    TRACE("(%p, %p, %p, %p)\n", region, region2, graphics, res);
+
+    if(!region || !region2 || !graphics || !res)
+        return InvalidParameter;
+
+    stat = GdipGetRegionHRgn(region, graphics, &hrgn1);
+    if(stat != Ok)
+        return stat;
+    stat = GdipGetRegionHRgn(region2, graphics, &hrgn2);
+    if(stat != Ok){
+        DeleteObject(hrgn1);
+        return stat;
+    }
+
+    *res = EqualRgn(hrgn1, hrgn2);
+
+    /* one of GpRegions is infinite */
+    if(*res == ERROR)
+        *res = (!hrgn1 && !hrgn2);
+
+    DeleteObject(hrgn1);
+    DeleteObject(hrgn2);
+
+    return Ok;
 }
 
 /*****************************************************************************
diff --git a/dlls/gdiplus/tests/region.c b/dlls/gdiplus/tests/region.c
index 784b1b9..b6b03c5 100644
--- a/dlls/gdiplus/tests/region.c
+++ b/dlls/gdiplus/tests/region.c
@@ -951,6 +951,98 @@ static void test_gethrgn(void)
     ReleaseDC(0, hdc);
 }
 
+static void test_isequal(void)
+{
+    GpRegion *region1, *region2;
+    GpGraphics *graphics;
+    GpRectF rectf;
+    GpStatus status;
+    HDC hdc = GetDC(0);
+    BOOL res;
+
+    status = GdipCreateFromHDC(hdc, &graphics);
+    ok(status == Ok, "status %08x\n", status);
+
+    status = GdipCreateRegion(&region1);
+    ok(status == Ok, "status %08x\n", status);
+    status = GdipCreateRegion(&region2);
+    ok(status == Ok, "status %08x\n", status);
+
+    /* NULL */
+    status = GdipIsEqualRegion(NULL, NULL, NULL, NULL);
+    ok(status == InvalidParameter, "status %08x\n", status);
+    status = GdipIsEqualRegion(region1, region2, NULL, NULL);
+    ok(status == InvalidParameter, "status %08x\n", status);
+    status = GdipIsEqualRegion(region1, region2, graphics, NULL);
+    ok(status == InvalidParameter, "status %08x\n", status);
+    status = GdipIsEqualRegion(region1, region2, NULL, &res);
+    ok(status == InvalidParameter, "status %08x\n", status);
+
+    /* infinite regions */
+    res = FALSE;
+    status = GdipIsEqualRegion(region1, region2, graphics, &res);
+    ok(status == Ok, "status %08x\n", status);
+    ok(res, "Expected to be equal.\n");
+    /* empty regions */
+    status = GdipSetEmpty(region1);
+    ok(status == Ok, "status %08x\n", status);
+    status = GdipSetEmpty(region2);
+    ok(status == Ok, "status %08x\n", status);
+    res = FALSE;
+    status = GdipIsEqualRegion(region1, region2, graphics, &res);
+    ok(status == Ok, "status %08x\n", status);
+    ok(res, "Expected to be equal.\n");
+    /* empty & infinite */
+    status = GdipSetInfinite(region1);
+    ok(status == Ok, "status %08x\n", status);
+    res = TRUE;
+    status = GdipIsEqualRegion(region1, region2, graphics, &res);
+    ok(status == Ok, "status %08x\n", status);
+    ok(!res, "Expected to be unequal.\n");
+    /* rect & (inf/empty) */
+    rectf.X = rectf.Y = 0.0;
+    rectf.Width = rectf.Height = 100.0;
+    status = GdipCombineRegionRect(region1, &rectf, CombineModeReplace);
+    ok(status == Ok, "status %08x\n", status);
+    res = TRUE;
+    status = GdipIsEqualRegion(region1, region2, graphics, &res);
+    ok(status == Ok, "status %08x\n", status);
+    ok(!res, "Expected to be unequal.\n");
+    status = GdipSetInfinite(region2);
+    ok(status == Ok, "status %08x\n", status);
+    res = TRUE;
+    status = GdipIsEqualRegion(region1, region2, graphics, &res);
+    ok(status == Ok, "status %08x\n", status);
+    ok(!res, "Expected to be unequal.\n");
+    /* roughly equal rectangles */
+    rectf.X = rectf.Y = 0.0;
+    rectf.Width = rectf.Height = 100.001;
+    status = GdipCombineRegionRect(region2, &rectf, CombineModeReplace);
+    ok(status == Ok, "status %08x\n", status);
+    res = FALSE;
+    status = GdipIsEqualRegion(region1, region2, graphics, &res);
+    ok(status == Ok, "status %08x\n", status);
+    ok(res, "Expected to be equal.\n");
+    /* equal rectangles */
+    rectf.X = rectf.Y = 0.0;
+    rectf.Width = rectf.Height = 100.0;
+    status = GdipCombineRegionRect(region2, &rectf, CombineModeReplace);
+    ok(status == Ok, "status %08x\n", status);
+    res = FALSE;
+    status = GdipIsEqualRegion(region1, region2, graphics, &res);
+    ok(status == Ok, "status %08x\n", status);
+    ok(res, "Expected to be equal.\n");
+
+    /* cleanup */
+    status = GdipDeleteRegion(region1);
+    ok(status == Ok, "status %08x\n", status);
+    status = GdipDeleteRegion(region2);
+    ok(status == Ok, "status %08x\n", status);
+    status = GdipDeleteGraphics(graphics);
+    ok(status == Ok, "status %08x\n", status);
+    ReleaseDC(0, hdc);
+}
+
 START_TEST(region)
 {
     struct GdiplusStartupInput gdiplusStartupInput;
@@ -969,6 +1061,7 @@ START_TEST(region)
     test_combinereplace();
     test_fromhrgn();
     test_gethrgn();
+    test_isequal();
 
     GdiplusShutdown(gdiplusToken);
 }
-- 
1.5.6.5







More information about the wine-patches mailing list