Module: wine Branch: master Commit: 2c9c9f78fb02abb1dd28ddf7a0d100d4a34e00e7 URL: http://source.winehq.org/git/wine.git/?a=commit;h=2c9c9f78fb02abb1dd28ddf7a0...
Author: Alexandre Julliard julliard@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 {