[try 5][Gdiplus 2/6] Implement GdipDeleteRegion
Adam Petaccia
adam at tpetaccia.com
Thu Jul 24 18:01:32 CDT 2008
Changelog:
(try4):
region->node is no longer a pointer
(try2):
move static function to the top.
---
dlls/gdiplus/region.c | 32 ++++++++++++++++++++++++++++++--
dlls/gdiplus/tests/region.c | 4 +++-
2 files changed, 33 insertions(+), 3 deletions(-)
diff --git a/dlls/gdiplus/region.c b/dlls/gdiplus/region.c
index d2997f4..0e96550 100644
--- a/dlls/gdiplus/region.c
+++ b/dlls/gdiplus/region.c
@@ -121,6 +121,27 @@ static inline GpStatus init_region(GpRegion* region, const RegionType type)
return Ok;
}
+static inline void delete_element(region_element* element)
+{
+ switch(element->type)
+ {
+ case RegionDataRect:
+ break;
+ case RegionDataPath:
+ GdipDeletePath(element->elementdata.pathdata.path);
+ break;
+ case RegionDataEmptyRect:
+ case RegionDataInfiniteRect:
+ break;
+ default:
+ delete_element(element->elementdata.combine.left);
+ delete_element(element->elementdata.combine.right);
+ GdipFree(element->elementdata.combine.left);
+ GdipFree(element->elementdata.combine.right);
+ break;
+ }
+}
+
GpStatus WINGDIPAPI GdipCloneRegion(GpRegion *region, GpRegion **clone)
{
FIXME("(%p %p): stub\n", region, clone);
@@ -212,8 +233,15 @@ GpStatus WINGDIPAPI GdipCreateRegionHrgn(HRGN hrgn, GpRegion **region)
GpStatus WINGDIPAPI GdipDeleteRegion(GpRegion *region)
{
- FIXME("(%p): stub\n", region);
- return NotImplemented;
+ TRACE("%p\n", region);
+
+ if (!region)
+ return InvalidParameter;
+
+ delete_element(®ion->node);
+ GdipFree(region);
+
+ return Ok;
}
GpStatus WINGDIPAPI GdipGetRegionBounds(GpRegion *region, GpGraphics *graphics, GpRectF *rect)
diff --git a/dlls/gdiplus/tests/region.c b/dlls/gdiplus/tests/region.c
index e3ed8ec..a5064d1 100644
--- a/dlls/gdiplus/tests/region.c
+++ b/dlls/gdiplus/tests/region.c
@@ -108,6 +108,7 @@ todo_wine
expect_magic((DWORD*)(buf + 2));
expect_dword(buf + 3, 0);
expect_dword(buf + 4, RGNDATA_INFINITE_RECT);
+}
status = GdipDeleteRegion(region);
ok(status == Ok, "status %08x\n", status);
@@ -116,6 +117,8 @@ todo_wine
rect.Y = 20;
rect.Width = 100;
rect.Height = 200;
+todo_wine
+{
status = GdipCreateRegionRectI(&rect, ®ion);
ok(status == Ok, "status %08x\n", status);
status = GdipGetRegionDataSize(region, &needed);
@@ -216,7 +219,6 @@ todo_wine
expect_float(buf + 37, 22.0);
expect_float(buf + 38, 55.0);
-
status = GdipDeleteRegion(region2);
ok(status == Ok, "status %08x\n", status);
status = GdipDeleteRegion(region);
--
1.5.4.3
More information about the wine-patches
mailing list