Add RegionInitBoxes(), and fix some buggy callers of RegionInit().

The interface to RegionInit():

    RegionInit (RegionPtr pReg, BoxPtr rect, int size);

is very confusing because it doesn't take a list of boxes, it takes
*one* box, but if that box is NULL, it initializes an empty region
with 'size' rectangles preallocated.

Most callers of this function were correctly passing either NULL or
just one box, but there were three confused cases, where the code
seems to expect a region to be created from a list of boxes.

This patch adds a new function RegionInitBoxes() and fixes those
instances to call that instead.

And yes, the pixman function to initialize a region from a list of
boxes is called init_rects() because pixman is also awesome.

V2: Make RegionInitBoxes() return a Bool indicating whether the call
    succeeded, and fix the callers to check this return value.

Reviewed-by: Keith Packard <keithp@keithp.com>
Signed-off-by: Søren Sandmann <ssp@redhat.com>
This commit is contained in:
Søren Sandmann Pedersen 2011-03-29 13:06:36 -04:00
parent c7bce22b58
commit 61a92a78cd
3 changed files with 21 additions and 8 deletions

View File

@ -127,11 +127,10 @@ ExaCheckCopyNtoN (DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
EXA_FALLBACK(("from %p to %p (%c,%c)\n", pSrc, pDst,
exaDrawableLocation(pSrc), exaDrawableLocation(pDst)));
if (pExaScr->prepare_access_reg) {
if (pExaScr->prepare_access_reg && RegionInitBoxes(&reg, pbox, nbox)) {
PixmapPtr pPixmap = exaGetDrawablePixmap(pSrc);
exaGetDrawableDeltas(pSrc, pPixmap, &xoff, &yoff);
RegionInit(&reg, pbox, nbox);
RegionTranslate(&reg, xoff + dx, yoff + dy);
pExaScr->prepare_access_reg(pPixmap, EXA_PREPARE_SRC, &reg);
RegionUninit(&reg);
@ -140,11 +139,11 @@ ExaCheckCopyNtoN (DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
if (pExaScr->prepare_access_reg &&
!exaGCReadsDestination(pDst, pGC->planemask, pGC->fillStyle,
pGC->alu, pGC->clientClipType)) {
pGC->alu, pGC->clientClipType) &&
RegionInitBoxes (&reg, pbox, nbox)) {
PixmapPtr pPixmap = exaGetDrawablePixmap(pDst);
exaGetDrawableDeltas(pSrc, pPixmap, &xoff, &yoff);
RegionInit(&reg, pbox, nbox);
RegionTranslate(&reg, xoff, yoff);
pExaScr->prepare_access_reg(pPixmap, EXA_PREPARE_DEST, &reg);
RegionUninit(&reg);

View File

@ -817,10 +817,19 @@ static void __glXReportDamage(__DRIdrawable *driDraw,
__glXenterServer(GL_FALSE);
RegionInit(&region, (BoxPtr) rects, num_rects);
RegionTranslate(&region, pDraw->x, pDraw->y);
DamageDamageRegion(pDraw, &region);
RegionUninit(&region);
if (RegionInitBoxes(&region, (BoxPtr) rects, num_rects)) {
RegionTranslate(&region, pDraw->x, pDraw->y);
DamageDamageRegion(pDraw, &region);
RegionUninit(&region);
}
else {
while (num_rects--) {
RegionInit (&region, (BoxPtr) rects++, 1);
RegionTranslate(&region, pDraw->x, pDraw->y);
DamageDamageRegion(pDraw, &region);
RegionUninit(&region);
}
}
__glXleaveServer(GL_FALSE);
}

View File

@ -132,6 +132,11 @@ static inline void RegionInit(RegionPtr _pReg, BoxPtr _rect, int _size)
}
}
static inline Bool RegionInitBoxes(RegionPtr pReg, BoxPtr boxes, int nBoxes)
{
return pixman_region_init_rects (pReg, boxes, nBoxes);
}
static inline void RegionUninit(RegionPtr _pReg)
{
if ((_pReg)->data && (_pReg)->data->size) {