gdiplus: Add utility function get_visible_clip_region.
diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c
index 7b9dbd6..297393a 100644
--- a/dlls/gdiplus/graphics.c
+++ b/dlls/gdiplus/graphics.c
@@ -1062,6 +1062,33 @@
return Ok;
}
+/* on success, rgn will contain the region of the graphics object which
+ * is visible after clipping has been applied */
+static GpStatus get_visible_clip_region(GpGraphics *graphics, GpRegion *rgn)
+{
+ GpStatus stat;
+ GpRectF rectf;
+ GpRegion* tmp;
+
+ if((stat = get_graphics_bounds(graphics, &rectf)) != Ok)
+ return stat;
+
+ if((stat = GdipCreateRegion(&tmp)) != Ok)
+ return stat;
+
+ if((stat = GdipCombineRegionRect(tmp, &rectf, CombineModeReplace)) != Ok)
+ goto end;
+
+ if((stat = GdipCombineRegionRegion(tmp, graphics->clip, CombineModeIntersect)) != Ok)
+ goto end;
+
+ stat = GdipCombineRegionRegion(rgn, tmp, CombineModeReplace);
+
+end:
+ GdipDeleteRegion(tmp);
+ return stat;
+}
+
GpStatus WINGDIPAPI GdipCreateFromHDC(HDC hdc, GpGraphics **graphics)
{
TRACE("(%p, %p)\n", hdc, graphics);
@@ -3123,7 +3150,6 @@
{
GpRegion *clip_rgn;
GpStatus stat;
- GpRectF wnd_rect;
TRACE("(%p, %p)\n", graphics, rect);
@@ -3133,18 +3159,11 @@
if(graphics->busy)
return ObjectBusy;
- /* get window bounds */
- if((stat = get_graphics_bounds(graphics, &wnd_rect)) != Ok)
- return stat;
-
/* intersect window and graphics clipping regions */
if((stat = GdipCreateRegion(&clip_rgn)) != Ok)
return stat;
- if((stat = GdipCombineRegionRect(clip_rgn, &wnd_rect, CombineModeIntersect)) != Ok)
- goto cleanup;
-
- if((stat = GdipCombineRegionRegion(clip_rgn, graphics->clip, CombineModeIntersect)) != Ok)
+ if((stat = get_visible_clip_region(graphics, clip_rgn)) != Ok)
goto cleanup;
/* get bounds of the region */