Module: wine Branch: master Commit: 8a9438d560c1a1cc4d0f001ed1bafb1d1b45b17d URL: http://source.winehq.org/git/wine.git/?a=commit;h=8a9438d560c1a1cc4d0f001ed1...
Author: Adam Petaccia adam@tpetaccia.com Date: Thu Jul 24 19:01:32 2008 -0400
gdiplus: Implement GdipDeleteRegion.
---
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);