diff --git a/fb/fbpict.c b/fb/fbpict.c index 471f7e325..d438cdc94 100644 --- a/fb/fbpict.c +++ b/fb/fbpict.c @@ -54,9 +54,9 @@ fbComposite (CARD8 op, int msk_xoff, msk_yoff; int dst_xoff, dst_yoff; - miCompositeSourceValidate (pSrc); + miCompositeSourceValidate (pSrc, xSrc - xDst, ySrc - yDst, width, height); if (pMask) - miCompositeSourceValidate (pMask); + miCompositeSourceValidate (pMask, xMask - xDst, yMask - yDst, width, height); src = image_from_pict (pSrc, FALSE, &src_xoff, &src_yoff); mask = image_from_pict (pMask, FALSE, &msk_xoff, &msk_yoff); diff --git a/render/mipict.c b/render/mipict.c index 2159ebefd..de5eea6be 100644 --- a/render/mipict.c +++ b/render/mipict.c @@ -333,8 +333,12 @@ miClipPictureSrc (RegionPtr pRegion, return TRUE; } -static void -SourceValidateOnePicture (PicturePtr pPicture) +void +miCompositeSourceValidate (PicturePtr pPicture, + INT16 x, + INT16 y, + CARD16 width, + CARD16 height) { DrawablePtr pDrawable = pPicture->pDrawable; ScreenPtr pScreen; @@ -343,20 +347,48 @@ SourceValidateOnePicture (PicturePtr pPicture) return; pScreen = pDrawable->pScreen; - + if (pScreen->SourceValidate) { - pScreen->SourceValidate ( - pDrawable, 0, 0, pDrawable->width, pDrawable->height, pPicture->subWindowMode); - } -} + if (pPicture->transform) + { + xPoint points[4]; + int i; + int xmin, ymin, xmax, ymax; -void -miCompositeSourceValidate (PicturePtr pPicture) -{ - SourceValidateOnePicture (pPicture); - if (pPicture->alphaMap) - SourceValidateOnePicture (pPicture->alphaMap); +#define VectorSet(i,_x,_y) { points[i].x = _x; points[i].y = _y; } + VectorSet (0, x, y); + VectorSet (1, x + width, y); + VectorSet (2, x, y + height); + VectorSet (3, x + width, y + height); + xmin = ymin = 32767; + xmax = ymax = -32737; + for (i = 0; i < 4; i++) + { + PictVector t; + t.vector[0] = IntToxFixed (points[i].x); + t.vector[1] = IntToxFixed (points[i].y); + t.vector[2] = xFixed1; + if (pixman_transform_point (pPicture->transform, &t)) + { + int tx = xFixedToInt (t.vector[0]); + int ty = xFixedToInt (t.vector[1]); + if (tx < xmin) xmin = tx; + if (tx > xmax) xmax = tx; + if (ty < ymin) ymin = ty; + if (ty > ymax) ymax = ty; + } + } + x = xmin; + y = ymin; + width = xmax - xmin; + height = ymax - ymin; + } + x += pPicture->pDrawable->x; + y += pPicture->pDrawable->y; + (*pScreen->SourceValidate) (pDrawable, x, y, width, height, + pPicture->subWindowMode); + } } /* @@ -448,9 +480,9 @@ miComputeCompositeRegion (RegionPtr pRegion, } - miCompositeSourceValidate (pSrc); + miCompositeSourceValidate (pSrc, xSrc, ySrc, width, height); if (pMask) - miCompositeSourceValidate (pMask); + miCompositeSourceValidate (pMask, xMask, yMask, width, height); return TRUE; } diff --git a/render/mipict.h b/render/mipict.h index 4f5b3baed..eb6b6645d 100644 --- a/render/mipict.h +++ b/render/mipict.h @@ -81,8 +81,11 @@ miChangePictureFilter (PicturePtr pPicture, int nparams); extern _X_EXPORT void -miCompositeSourceValidate (PicturePtr pPicture); - +miCompositeSourceValidate (PicturePtr pPicture, + INT16 x, + INT16 y, + CARD16 width, + CARD16 height); extern _X_EXPORT Bool miComputeCompositeRegion (RegionPtr pRegion, PicturePtr pSrc,