Bug #15369: Don't reduce Over to Src for transform + RepeatNone.

Only do no-src-alpha optimizations for a RepeatNone source if we can
easily probe that we won't sample outside the edges of the source.
This commit is contained in:
Owen Taylor 2008-06-24 12:40:47 -04:00 committed by Adam Jackson
parent 100afae578
commit 574c62e305

View File

@ -1548,12 +1548,24 @@ FreePictFormat (pointer pPictFormat,
* being careful to avoid these cases. * being careful to avoid these cases.
*/ */
static CARD8 static CARD8
ReduceCompositeOp (CARD8 op, PicturePtr pSrc, PicturePtr pMask, PicturePtr pDst) ReduceCompositeOp (CARD8 op, PicturePtr pSrc, PicturePtr pMask, PicturePtr pDst,
INT16 xSrc, INT16 ySrc, CARD16 width, CARD16 height)
{ {
Bool no_src_alpha, no_dst_alpha; Bool no_src_alpha, no_dst_alpha;
/* Sampling off the edge of a RepeatNone picture introduces alpha
* even if the picture itself doesn't have alpha. We don't try to
* detect every case where we don't sample off the edge, just the
* simplest case where there is no transform on the source
* picture.
*/
no_src_alpha = PICT_FORMAT_COLOR(pSrc->format) && no_src_alpha = PICT_FORMAT_COLOR(pSrc->format) &&
PICT_FORMAT_A(pSrc->format) == 0 && PICT_FORMAT_A(pSrc->format) == 0 &&
(pSrc->repeatType != RepeatNone ||
(!pSrc->transform &&
xSrc >= 0 && ySrc >= 0 &&
xSrc + width <= pSrc->pDrawable->width &&
ySrc + height <= pSrc->pDrawable->height)) &&
pSrc->alphaMap == NULL && pSrc->alphaMap == NULL &&
pMask == NULL; pMask == NULL;
no_dst_alpha = PICT_FORMAT_COLOR(pDst->format) && no_dst_alpha = PICT_FORMAT_COLOR(pDst->format) &&
@ -1655,7 +1667,7 @@ CompositePicture (CARD8 op,
ValidatePicture (pMask); ValidatePicture (pMask);
ValidatePicture (pDst); ValidatePicture (pDst);
op = ReduceCompositeOp (op, pSrc, pMask, pDst); op = ReduceCompositeOp (op, pSrc, pMask, pDst, xSrc, ySrc, width, height);
if (op == PictOpDst) if (op == PictOpDst)
return; return;