Vincent Povirk : gdiplus: Implement GdipGetRegionHRgn for empty regions.

Alexandre Julliard julliard at winehq.org
Tue Nov 25 07:21:48 CST 2008


Module: wine
Branch: master
Commit: 4f8751a5db271afac251e85787e9d557fa0a3997
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=4f8751a5db271afac251e85787e9d557fa0a3997

Author: Vincent Povirk <vincent at codeweavers.com>
Date:   Mon Nov 24 14:30:08 2008 -0600

gdiplus: Implement GdipGetRegionHRgn for empty regions.

---

 dlls/gdiplus/region.c       |    3 ++
 dlls/gdiplus/tests/region.c |   59 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 62 insertions(+), 0 deletions(-)

diff --git a/dlls/gdiplus/region.c b/dlls/gdiplus/region.c
index ac7a20b..8cae004 100644
--- a/dlls/gdiplus/region.c
+++ b/dlls/gdiplus/region.c
@@ -775,6 +775,9 @@ static GpStatus get_region_hrgn(struct region_element *element, GpGraphics *grap
         case RegionDataInfiniteRect:
             *hrgn = NULL;
             return Ok;
+        case RegionDataEmptyRect:
+            *hrgn = CreateRectRgn(0, 0, 0, 0);
+            return *hrgn ? Ok : OutOfMemory;
         default:
             FIXME("GdipGetRegionHRgn unimplemented for region type=%x\n", element->type);
             *hrgn = NULL;
diff --git a/dlls/gdiplus/tests/region.c b/dlls/gdiplus/tests/region.c
index 90dfc24..9cdd929 100644
--- a/dlls/gdiplus/tests/region.c
+++ b/dlls/gdiplus/tests/region.c
@@ -49,6 +49,57 @@ typedef struct RegionDataPoint
     short X, Y;
 } RegionDataPoint;
 
+static void verify_region(HRGN hrgn, const RECT *rc)
+{
+    union
+    {
+        RGNDATA data;
+        char buf[sizeof(RGNDATAHEADER) + sizeof(RECT)];
+    } rgn;
+    const RECT *rect;
+    DWORD ret;
+
+    ret = GetRegionData(hrgn, 0, NULL);
+    if (IsRectEmpty(rc))
+        ok(ret == sizeof(rgn.data.rdh), "expected sizeof(rdh), got %u\n", ret);
+    else
+        ok(ret == sizeof(rgn.data.rdh) + sizeof(RECT), "expected sizeof(rgn), got %u\n", ret);
+
+    if (!ret) return;
+
+    ret = GetRegionData(hrgn, sizeof(rgn), &rgn.data);
+    if (IsRectEmpty(rc))
+        ok(ret == sizeof(rgn.data.rdh), "expected sizeof(rdh), got %u\n", ret);
+    else
+        ok(ret == sizeof(rgn.data.rdh) + sizeof(RECT), "expected sizeof(rgn), got %u\n", ret);
+
+    trace("size %u, type %u, count %u, rgn size %u, bound (%d,%d-%d,%d)\n",
+          rgn.data.rdh.dwSize, rgn.data.rdh.iType,
+          rgn.data.rdh.nCount, rgn.data.rdh.nRgnSize,
+          rgn.data.rdh.rcBound.left, rgn.data.rdh.rcBound.top,
+          rgn.data.rdh.rcBound.right, rgn.data.rdh.rcBound.bottom);
+    if (rgn.data.rdh.nCount != 0)
+    {
+        rect = (const RECT *)rgn.data.Buffer;
+        trace("rect (%d,%d-%d,%d)\n", rect->left, rect->top, rect->right, rect->bottom);
+        ok(EqualRect(rect, rc), "rects don't match\n");
+    }
+
+    ok(rgn.data.rdh.dwSize == sizeof(rgn.data.rdh), "expected sizeof(rdh), got %u\n", rgn.data.rdh.dwSize);
+    ok(rgn.data.rdh.iType == RDH_RECTANGLES, "expected RDH_RECTANGLES, got %u\n", rgn.data.rdh.iType);
+    if (IsRectEmpty(rc))
+    {
+        ok(rgn.data.rdh.nCount == 0, "expected 0, got %u\n", rgn.data.rdh.nCount);
+        ok(rgn.data.rdh.nRgnSize == 0,  "expected 0, got %u\n", rgn.data.rdh.nRgnSize);
+    }
+    else
+    {
+        ok(rgn.data.rdh.nCount == 1, "expected 1, got %u\n", rgn.data.rdh.nCount);
+        ok(rgn.data.rdh.nRgnSize == sizeof(RECT),  "expected sizeof(RECT), got %u\n", rgn.data.rdh.nRgnSize);
+    }
+    ok(EqualRect(&rgn.data.rdh.rcBound, rc), "rects don't match\n");
+}
+
 static void test_getregiondata(void)
 {
     GpStatus status;
@@ -750,6 +801,7 @@ static void test_gethrgn(void)
     GpGraphics *graphics;
     HRGN hrgn;
     HDC hdc=GetDC(0);
+    static const RECT empty_rect = {0,0,0,0};
 
     status = GdipCreateFromHDC(hdc, &graphics);
     ok(status == Ok, "status %08x\n", status);
@@ -772,6 +824,13 @@ static void test_gethrgn(void)
     ok(hrgn == NULL, "hrgn=%p\n", hrgn);
     DeleteObject(hrgn);
 
+    status = GdipSetEmpty(region);
+    ok(status == Ok, "status %08x\n", status);
+    status = GdipGetRegionHRgn(region, NULL, &hrgn);
+    ok(status == Ok, "status %08x\n", status);
+    verify_region(hrgn, &empty_rect);
+    DeleteObject(hrgn);
+
     status = GdipDeleteRegion(region);
     ok(status == Ok, "status %08x\n", status);
     status = GdipDeleteGraphics(graphics);




More information about the wine-cvs mailing list