[PATCH 3/3] gdi32: Try to compact the region.
Huw Davies
huw at codeweavers.com
Mon Jul 4 03:05:45 CDT 2016
Signed-off-by: Huw Davies <huw at codeweavers.com>
---
dlls/gdi32/region.c | 43 +++++++++++++++++++++++++------------------
1 file changed, 25 insertions(+), 18 deletions(-)
diff --git a/dlls/gdi32/region.c b/dlls/gdi32/region.c
index 834e6be..646512f 100644
--- a/dlls/gdi32/region.c
+++ b/dlls/gdi32/region.c
@@ -1598,6 +1598,28 @@ static INT REGION_Coalesce (
return (curStart);
}
+/**********************************************************************
+ * REGION_compact
+ *
+ * To keep regions from growing without bound, shrink the array of rectangles
+ * to match the new number of rectangles in the region.
+ *
+ * Only do this if the number of rectangles allocated is more than
+ * twice the number of rectangles in the region.
+ */
+static void REGION_compact( WINEREGION *reg )
+{
+ if ((reg->numRects < reg->size / 2) && (reg->numRects > 2))
+ {
+ RECT *new_rects = HeapReAlloc( GetProcessHeap(), 0, reg->rects, reg->numRects * sizeof(RECT) );
+ if (new_rects)
+ {
+ reg->rects = new_rects;
+ reg->size = reg->numRects;
+ }
+ }
+}
+
/***********************************************************************
* REGION_RegionOp
*
@@ -1839,23 +1861,7 @@ static BOOL REGION_RegionOp(
REGION_Coalesce (&newReg, prevBand, curBand);
}
- /*
- * A bit of cleanup. To keep regions from growing without bound,
- * we shrink the array of rectangles to match the new number of
- * rectangles in the region. This never goes to 0, however...
- *
- * Only do this stuff if the number of rectangles allocated is more than
- * twice the number of rectangles in the region (a simple optimization...).
- */
- if ((newReg.numRects < (newReg.size >> 1)) && (newReg.numRects > 2))
- {
- RECT *new_rects = HeapReAlloc( GetProcessHeap(), 0, newReg.rects, newReg.numRects * sizeof(RECT) );
- if (new_rects)
- {
- newReg.rects = new_rects;
- newReg.size = newReg.numRects;
- }
- }
+ REGION_compact( &newReg );
HeapFree( GetProcessHeap(), 0, destReg->rects );
destReg->rects = newReg.rects;
destReg->size = newReg.size;
@@ -2633,8 +2639,9 @@ static BOOL REGION_PtsToRegion( struct point_block *FirstPtBlock, WINEREGION *re
extents->right = 0;
extents->bottom = 0;
}
+ REGION_compact( reg );
- return(TRUE);
+ return TRUE;
}
/***********************************************************************
--
2.7.4
More information about the wine-patches
mailing list