gdi32: Try to compact the region.
Signed-off-by: Huw Davies <huw@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
27375d8476
commit
6526ac1999
|
@ -1598,6 +1598,28 @@ static INT REGION_Coalesce (
|
||||||
return (curStart);
|
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
|
* REGION_RegionOp
|
||||||
*
|
*
|
||||||
|
@ -1839,23 +1861,7 @@ static BOOL REGION_RegionOp(
|
||||||
REGION_Coalesce (&newReg, prevBand, curBand);
|
REGION_Coalesce (&newReg, prevBand, curBand);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
REGION_compact( &newReg );
|
||||||
* 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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
HeapFree( GetProcessHeap(), 0, destReg->rects );
|
HeapFree( GetProcessHeap(), 0, destReg->rects );
|
||||||
destReg->rects = newReg.rects;
|
destReg->rects = newReg.rects;
|
||||||
destReg->size = newReg.size;
|
destReg->size = newReg.size;
|
||||||
|
@ -2633,8 +2639,9 @@ static BOOL REGION_PtsToRegion( struct point_block *FirstPtBlock, WINEREGION *re
|
||||||
extents->right = 0;
|
extents->right = 0;
|
||||||
extents->bottom = 0;
|
extents->bottom = 0;
|
||||||
}
|
}
|
||||||
|
REGION_compact( reg );
|
||||||
|
|
||||||
return(TRUE);
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
|
Loading…
Reference in New Issue