{ \
int newRects; \
if ((newRects = rEnd - r)) { \
- RECTALLOC(newReg, newRects); \
+ RECTALLOC_BAIL(newReg, newRects, bail); \
memmove((char *)PIXREGION_TOP(newReg),(char *)r, \
newRects * sizeof(box_type_t)); \
newReg->data->numRects += newRects; \
bot = MIN(r1->y2, r2y1);
if (top != bot) {
curBand = newReg->data->numRects;
- pixman_region_appendNonO(newReg, r1, r1BandEnd, top, bot);
+ if (!pixman_region_appendNonO(newReg, r1, r1BandEnd, top, bot))
+ goto bail;
Coalesce(newReg, prevBand, curBand);
}
}
bot = MIN(r2->y2, r1y1);
if (top != bot) {
curBand = newReg->data->numRects;
- pixman_region_appendNonO(newReg, r2, r2BandEnd, top, bot);
+ if (!pixman_region_appendNonO(newReg, r2, r2BandEnd, top, bot))
+ goto bail;
Coalesce(newReg, prevBand, curBand);
}
}
ybot = MIN(r1->y2, r2->y2);
if (ybot > ytop) {
curBand = newReg->data->numRects;
- (* overlapFunc)(newReg, r1, r1BandEnd, r2, r2BandEnd, ytop, ybot,
- pOverlap);
+ if (!(* overlapFunc)(newReg,
+ r1, r1BandEnd,
+ r2, r2BandEnd,
+ ytop, ybot,
+ pOverlap))
+ goto bail;
Coalesce(newReg, prevBand, curBand);
}
/* Do first nonOverlap1Func call, which may be able to coalesce */
FindBand(r1, r1BandEnd, r1End, r1y1);
curBand = newReg->data->numRects;
- pixman_region_appendNonO(newReg, r1, r1BandEnd, MAX(r1y1, ybot), r1->y2);
+ if (!pixman_region_appendNonO(newReg,
+ r1, r1BandEnd,
+ MAX(r1y1, ybot), r1->y2))
+ goto bail;
Coalesce(newReg, prevBand, curBand);
/* Just append the rest of the boxes */
AppendRegions(newReg, r1BandEnd, r1End);
/* Do first nonOverlap2Func call, which may be able to coalesce */
FindBand(r2, r2BandEnd, r2End, r2y1);
curBand = newReg->data->numRects;
- pixman_region_appendNonO(newReg, r2, r2BandEnd, MAX(r2y1, ybot), r2->y2);
+ if (!pixman_region_appendNonO(newReg,
+ r2, r2BandEnd,
+ MAX(r2y1, ybot), r2->y2))
+ goto bail;
Coalesce(newReg, prevBand, curBand);
/* Append rest of boxes */
AppendRegions(newReg, r2BandEnd, r2End);
}
return TRUE;
+
+bail:
+ if (oldData)
+ free(oldData);
+ return pixman_break (newReg);
}
/*-