* the y-x-banding that's so nice to have...
*/
-/* $Id: region.c,v 1.57 2004/05/18 22:32:48 weiden Exp $ */
+/* $Id: region.c,v 1.58 2004/06/28 21:03:08 navaraf Exp $ */
#include <w32k.h>
#include <win32k/float.h>
return 0;
RtlCopyMemory( temp, *firstrect, reg->rdh.nRgnSize );
reg->rdh.nRgnSize *= 2;
- if (*firstrect != ®->BuiltInRect)
+ if (*firstrect != ®->rdh.rcBound)
ExFreePool( *firstrect );
*firstrect = temp;
*rect = (*firstrect)+reg->rdh.nCount;
if( !temp )
return FALSE;
- if( dst->Buffer && dst->Buffer != &dst->BuiltInRect )
+ if( dst->Buffer && dst->Buffer != &dst->rdh.rcBound )
ExFreePool( dst->Buffer ); //free the old buffer
dst->Buffer = temp;
dst->rdh.nRgnSize = src->rdh.nCount * sizeof(RECT); //size of region buffer
}
else{
xrect = ExAllocatePoolWithTag(PagedPool, rgnSrc->rdh.nCount * sizeof(RECT), TAG_REGION);
- if( rgnDst->Buffer && rgnDst->Buffer != &rgnDst->BuiltInRect )
+ if( rgnDst->Buffer && rgnDst->Buffer != &rgnDst->rdh.rcBound )
ExFreePool( rgnDst->Buffer ); //free the old buffer. will be assigned to xrect below.
}
if(!temp)
return FALSE;
- if( rgnDst->Buffer && rgnDst->Buffer != &rgnDst->BuiltInRect )
+ if( rgnDst->Buffer && rgnDst->Buffer != &rgnDst->rdh.rcBound )
ExFreePool( rgnDst->Buffer ); //free the old buffer
rgnDst->Buffer = temp;
rgnDst->rdh.nCount = i;
else{
newReg->rdh.nRgnSize = newReg->rdh.nCount*sizeof(RECT);
RtlCopyMemory( newReg->Buffer, prev_rects, newReg->rdh.nRgnSize );
- if (prev_rects != &newReg->BuiltInRect)
+ if (prev_rects != &newReg->rdh.rcBound)
ExFreePool( prev_rects );
}
}
* the region is empty
*/
newReg->rdh.nRgnSize = sizeof(RECT);
- if (newReg->Buffer != &newReg->BuiltInRect)
+ if (newReg->Buffer != &newReg->rdh.rcBound)
ExFreePool( newReg->Buffer );
newReg->Buffer = ExAllocatePoolWithTag( PagedPool, sizeof(RECT), TAG_REGION );
ASSERT( newReg->Buffer );
else
newReg->rdh.iType = (newReg->rdh.nCount > 1)? COMPLEXREGION : SIMPLEREGION;
- if (oldRects != &newReg->BuiltInRect)
+ if (oldRects != &newReg->rdh.rcBound)
ExFreePool( oldRects );
return;
}
{
if (1 == n)
{
- pReg->Buffer = &pReg->BuiltInRect;
+ /* Testing shows that > 95% of all regions have only 1 rect.
+ Including that here saves us from having to do another
+ allocation */
+ pReg->Buffer = &pReg->rdh.rcBound;
}
else
{
BOOL FASTCALL RGNDATA_InternalDelete( PROSRGNDATA pRgn )
{
ASSERT(pRgn);
- if(pRgn->Buffer && pRgn->Buffer != &pRgn->BuiltInRect)
+ if(pRgn->Buffer && pRgn->Buffer != &pRgn->rdh.rcBound)
ExFreePool(pRgn->Buffer);
return TRUE;
}
pbox->bottom += YOffset;
pbox++;
}
- rgn->rdh.rcBound.left += XOffset;
- rgn->rdh.rcBound.right += XOffset;
- rgn->rdh.rcBound.top += YOffset;
- rgn->rdh.rcBound.bottom += YOffset;
+ if (rgn->Buffer != &rgn->rdh.rcBound)
+ {
+ rgn->rdh.rcBound.left += XOffset;
+ rgn->rdh.rcBound.right += XOffset;
+ rgn->rdh.rcBound.top += YOffset;
+ rgn->rdh.rcBound.bottom += YOffset;
+ }
}
}
ret = rgn->rdh.iType;
if(reg->Buffer != NULL)
{
RtlCopyMemory(temp, reg->Buffer, reg->rdh.nCount * sizeof(RECT));
- if(reg->Buffer != ®->BuiltInRect)
+ if(reg->Buffer != ®->rdh.rcBound)
ExFreePool(reg->Buffer);
}
reg->Buffer = temp;