diff --git a/dlls/gdiplus/region.c b/dlls/gdiplus/region.c index b66cbb42084..11b5aa66bb7 100644 --- a/dlls/gdiplus/region.c +++ b/dlls/gdiplus/region.c @@ -252,8 +252,38 @@ GpStatus WINGDIPAPI GdipCloneRegion(GpRegion *region, GpRegion **clone) GpStatus WINGDIPAPI GdipCombineRegionPath(GpRegion *region, GpPath *path, CombineMode mode) { - FIXME("(%p %p %d): stub\n", region, path, mode); - return NotImplemented; + GpRegion *path_region; + region_element *left, *right = NULL; + GpStatus stat; + + TRACE("%p %p %d\n", region, path, mode); + + if (!(region && path)) + return InvalidParameter; + + stat = GdipCreateRegionPath(path, &path_region); + if (stat != Ok) + return stat; + + left = GdipAlloc(sizeof(region_element)); + if (!left) + goto out; + *left = region->node; + + stat = clone_element(&path_region->node, &right); + if (stat != Ok) + goto out; + + fuse_region(region, left, right, mode); + + GdipDeleteRegion(path_region); + return Ok; + +out: + GdipFree(left); + delete_element(right); + GdipDeleteRegion(path_region); + return stat; } GpStatus WINGDIPAPI GdipCombineRegionRect(GpRegion *region, diff --git a/dlls/gdiplus/tests/region.c b/dlls/gdiplus/tests/region.c index 77b1e3bfd99..df9e74410ab 100644 --- a/dlls/gdiplus/tests/region.c +++ b/dlls/gdiplus/tests/region.c @@ -70,7 +70,6 @@ static void test_getregiondata(void) status = GdipGetRegionDataSize(region, &needed); ok(status == Ok, "status %08x\n", status); expect(20, needed); -todo_wine status = GdipGetRegionData(region, (BYTE*)buf, sizeof(buf), &needed); ok(status == Ok, "status %08x\n", status); expect(20, needed);