Commit 39f6f491 authored by Andrew Eikum's avatar Andrew Eikum Committed by Alexandre Julliard

gdiplus: Add utility function get_visible_clip_region.

parent 650a0f3f
...@@ -1062,6 +1062,33 @@ static GpStatus get_graphics_bounds(GpGraphics* graphics, GpRectF* rect) ...@@ -1062,6 +1062,33 @@ static GpStatus get_graphics_bounds(GpGraphics* graphics, GpRectF* rect)
return Ok; 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) GpStatus WINGDIPAPI GdipCreateFromHDC(HDC hdc, GpGraphics **graphics)
{ {
TRACE("(%p, %p)\n", hdc, graphics); TRACE("(%p, %p)\n", hdc, graphics);
...@@ -3123,7 +3150,6 @@ GpStatus WINGDIPAPI GdipGetVisibleClipBounds(GpGraphics *graphics, GpRectF *rect ...@@ -3123,7 +3150,6 @@ GpStatus WINGDIPAPI GdipGetVisibleClipBounds(GpGraphics *graphics, GpRectF *rect
{ {
GpRegion *clip_rgn; GpRegion *clip_rgn;
GpStatus stat; GpStatus stat;
GpRectF wnd_rect;
TRACE("(%p, %p)\n", graphics, rect); TRACE("(%p, %p)\n", graphics, rect);
...@@ -3133,18 +3159,11 @@ GpStatus WINGDIPAPI GdipGetVisibleClipBounds(GpGraphics *graphics, GpRectF *rect ...@@ -3133,18 +3159,11 @@ GpStatus WINGDIPAPI GdipGetVisibleClipBounds(GpGraphics *graphics, GpRectF *rect
if(graphics->busy) if(graphics->busy)
return ObjectBusy; return ObjectBusy;
/* get window bounds */
if((stat = get_graphics_bounds(graphics, &wnd_rect)) != Ok)
return stat;
/* intersect window and graphics clipping regions */ /* intersect window and graphics clipping regions */
if((stat = GdipCreateRegion(&clip_rgn)) != Ok) if((stat = GdipCreateRegion(&clip_rgn)) != Ok)
return stat; return stat;
if((stat = GdipCombineRegionRect(clip_rgn, &wnd_rect, CombineModeIntersect)) != Ok) if((stat = get_visible_clip_region(graphics, clip_rgn)) != Ok)
goto cleanup;
if((stat = GdipCombineRegionRegion(clip_rgn, graphics->clip, CombineModeIntersect)) != Ok)
goto cleanup; goto cleanup;
/* get bounds of the region */ /* get bounds of the region */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment