Alexandre Julliard : gdi32: Don' t bother computing interior regions when the brush is null.
Alexandre Julliard
julliard at winehq.org
Fri Dec 30 10:26:54 CST 2011
Module: wine
Branch: master
Commit: 2c9c9f78fb02abb1dd28ddf7a0d100d4a34e00e7
URL: http://source.winehq.org/git/wine.git/?a=commit;h=2c9c9f78fb02abb1dd28ddf7a0d100d4a34e00e7
Author: Alexandre Julliard <julliard at winehq.org>
Date: Fri Dec 30 12:53:19 2011 +0100
gdi32: Don't bother computing interior regions when the brush is null.
---
dlls/gdi32/dibdrv/graphics.c | 38 ++++++++++++++++++++++++++------------
1 files changed, 26 insertions(+), 12 deletions(-)
diff --git a/dlls/gdi32/dibdrv/graphics.c b/dlls/gdi32/dibdrv/graphics.c
index 26d3d58..d14148e 100644
--- a/dlls/gdi32/dibdrv/graphics.c
+++ b/dlls/gdi32/dibdrv/graphics.c
@@ -527,9 +527,9 @@ BOOL dibdrv_PolyPolygon( PHYSDEV dev, const POINT *pt, const INT *counts, DWORD
dibdrv_physdev *pdev = get_dibdrv_pdev(dev);
PHYSDEV next = GET_NEXT_PHYSDEV( dev, pPolyPolygon );
DWORD total, i, pos;
- BOOL ret = FALSE;
+ BOOL ret = TRUE;
POINT *points;
- HRGN outline = 0, interior;
+ HRGN outline = 0, interior = 0;
if (defer_pen( pdev )) return next->funcs->pPolyPolygon( next, pt, counts, polygons );
@@ -544,15 +544,22 @@ BOOL dibdrv_PolyPolygon( PHYSDEV dev, const POINT *pt, const INT *counts, DWORD
memcpy( points, pt, total * sizeof(*pt) );
LPtoDP( dev->hdc, points, total );
- if (!(interior = CreatePolyPolygonRgn( points, counts, polygons, GetPolyFillMode( dev->hdc ))))
+ if (pdev->brush.style != BS_NULL &&
+ !(interior = CreatePolyPolygonRgn( points, counts, polygons, GetPolyFillMode( dev->hdc ))))
{
HeapFree( GetProcessHeap(), 0, points );
return FALSE;
}
+ if (pdev->pen_uses_region) outline = CreateRectRgn( 0, 0, 0, 0 );
+
/* if not using a region, paint the interior first so the outline can overlap it */
- if (!pdev->pen_uses_region || !(outline = CreateRectRgn( 0, 0, 0, 0 )))
+ if (interior && !outline)
+ {
ret = brush_region( pdev, interior );
+ DeleteObject( interior );
+ interior = 0;
+ }
for (i = pos = 0; i < polygons; i++)
{
@@ -561,14 +568,17 @@ BOOL dibdrv_PolyPolygon( PHYSDEV dev, const POINT *pt, const INT *counts, DWORD
pos += counts[i];
}
- if (outline)
+ if (interior)
{
CombineRgn( interior, interior, outline, RGN_DIFF );
- ret = pen_region( pdev, outline ) && brush_region( pdev, interior );
+ ret = brush_region( pdev, interior );
+ DeleteObject( interior );
+ }
+ if (outline)
+ {
+ if (ret) ret = pen_region( pdev, outline );
DeleteObject( outline );
}
-
- DeleteObject( interior );
HeapFree( GetProcessHeap(), 0, points );
return ret;
}
@@ -687,12 +697,16 @@ BOOL dibdrv_Rectangle( PHYSDEV dev, INT left, INT top, INT right, INT bottom )
if (outline)
{
- HRGN interior = CreateRectRgnIndirect( &rect );
+ if (pdev->brush.style != BS_NULL)
+ {
+ HRGN interior = CreateRectRgnIndirect( &rect );
- CombineRgn( interior, interior, outline, RGN_DIFF );
- ret = pen_region( pdev, outline ) && brush_region( pdev, interior );
+ CombineRgn( interior, interior, outline, RGN_DIFF );
+ brush_region( pdev, interior );
+ DeleteObject( interior );
+ }
+ ret = pen_region( pdev, outline );
DeleteObject( outline );
- DeleteObject( interior );
}
else
{
More information about the wine-cvs
mailing list