[Xorg-driver-geode] [PATCH 8/8] Fix the chaos picture bug
Huang, FrankR
FrankR.Huang at amd.com
Sun Jun 13 02:13:24 PDT 2010
From: Frank Huang <frankr.huang at amd.com>
This patch is used as a test:)
---
src/lx_exa.c | 26 ++++++++++++++++----------
1 files changed, 16 insertions(+), 10 deletions(-)
diff --git a/src/lx_exa.c b/src/lx_exa.c
index db73088..066d8b8 100644
--- a/src/lx_exa.c
+++ b/src/lx_exa.c
@@ -544,7 +544,7 @@ lx_check_composite(int op, PicturePtr pSrc, PicturePtr pMsk, PicturePtr pDst)
return FALSE;
/* We need the off-screen buffer to do the multipass work */
-
+
if (usesPasses(op)) {
if (pGeode->exaBfrOffset == 0 || !pMsk)
return FALSE;
@@ -1000,6 +1000,7 @@ lx_do_composite(PixmapPtr pxDst, int srcX, int srcY, int maskX,
unsigned int dstOffset, srcOffset = 0;
int maskflag = 0;
+ int fail = 0;
xPointFixed srcPoint;
@@ -1008,6 +1009,9 @@ lx_do_composite(PixmapPtr pxDst, int srcX, int srcY, int maskX,
int opWidth = width;
int opHeight = height;
+ if ((exaScratch.srcWidth < srcX) && (exaScratch.type != COMP_TYPE_MASK))
+ fail = 1;
+
/* Transform the source coordinates */
if (exaScratch.type == COMP_TYPE_MASK) {
@@ -1079,15 +1083,17 @@ lx_do_composite(PixmapPtr pxDst, int srcX, int srcY, int maskX,
if ((exaScratch.srcHeight - maskY) < opHeight)
opHeight = exaScratch.srcHeight - maskY;
} else {
- if (exaScratch.srcWidth < opWidth)
- opWidth = exaScratch.srcWidth;
- if (exaScratch.srcHeight < opHeight)
- opHeight = exaScratch.srcHeight;
+ if (((exaScratch.srcWidth - srcX) < opWidth) && (exaScratch.srcWidth > srcX))
+ opWidth = exaScratch.srcWidth - srcX;
+ if (((exaScratch.srcHeight - srcY) < opHeight) && (exaScratch.srcHeight > srcY))
+ opHeight = exaScratch.srcHeight - srcY;
}
while (1) {
dstOffset = GetPixmapOffset(pxDst, opX, opY);
+ if(fail == 1)
+ break;
switch (exaScratch.type) {
@@ -1154,13 +1160,13 @@ lx_do_composite(PixmapPtr pxDst, int srcX, int srcY, int maskX,
exaScratch.op = PictOpClear;
}
if (exaScratch.repeat && (!exaScratch.maskrepeat) &&
- (exaScratch.op == PictOpSrc))
+ (exaScratch.op == PictOpOver))
break;
} else {
- opWidth = ((dstX + width) - opX) > exaScratch.srcWidth ?
- exaScratch.srcWidth : (dstX + width) - opX;
- opHeight = ((dstY + height) - opY) > exaScratch.srcHeight ?
- exaScratch.srcHeight : (dstY + height) - opY;
+ opWidth = ((dstX + width) - opX) > (exaScratch.srcWidth - srcX) ?
+ (exaScratch.srcWidth - srcX) : (dstX + width) - opX;
+ opHeight = ((dstY + height) - opY) > (exaScratch.srcHeight - srcY) ?
+ (exaScratch.srcHeight - srcY) : (dstY + height) - opY;
if ((!exaScratch.repeat) && (exaScratch.op == PictOpSrc)) {
exaScratch.type = COMP_TYPE_ONEPASS;
exaScratch.op = PictOpClear;
--
1.7.1
More information about the Xorg-driver-geode
mailing list