Subject: [PATCH 1/5] Correctly calculate the renderingregion with the mask picture

From: "Huang, FrankR" <[email-masked]>
Date: Fri, 2 Jul 2010 16:46:01 +0800

From: Frank Huang <[email-masked]>

*Add a maskflag variable to record if the type is COMP_TYPE_MASK
*Add the calculation of the rendering region if there is a mask
picture

Signed-off-by: Frank Huang <[email-masked]>
---
 src/lx_exa.c |   41 +++++++++++++++++++++++++++++++++--------
 1 files changed, 33 insertions(+), 8 deletions(-)

diff --git a/src/lx_exa.c b/src/lx_exa.c
index 14980ae..e0def8f 100644
--- a/src/lx_exa.c
+++ b/src/lx_exa.c
@@ -949,6 +949,8 @@ lx_do_composite(PixmapPtr pxDst, int srcX, int srcY, int maskX,
 
     unsigned int dstOffset, srcOffset = 0;
 
+    int maskflag = 0;
+
     xPointFixed srcPoint;
 
     int opX = dstX;
@@ -1009,13 +1011,28 @@ lx_do_composite(PixmapPtr pxDst, int srcX, int srcY, int maskX,
 	srcPoint.y = F(0);
     }
 
+    /* Get the source point offset position */
+
     srcOffset = GetSrcOffset(I(srcPoint.x), I(srcPoint.y));
 
-    if (exaScratch.srcWidth < opWidth)
-	opWidth = exaScratch.srcWidth;
+    /* When mask exists, exaScratch.srcWidth and exaScratch.srcHeight are
+     * the source width and source height; Otherwise, they are mask width
+     * and mask height */
+    /* exaScratch.repeat is the source repeat attribute */
+    /* If type is COMP_TYPE_MASK, maskX and maskY are not zero, we should
+     * minus them to do the opeartion in the correct region */
 
-    if (exaScratch.srcHeight < opHeight)
-	opHeight = exaScratch.srcHeight;
+    if (exaScratch.type == COMP_TYPE_MASK) {
+	if ((exaScratch.srcWidth - maskX) < opWidth)
+	    opWidth = exaScratch.srcWidth - 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;
+    }
 
     while (1) {
 
@@ -1027,6 +1044,7 @@ lx_do_composite(PixmapPtr pxDst, int srcX, int srcY, int maskX,
 		int direction =
 		    (opPtr->channel == CIMGP_CHANNEL_A_SOURCE) ? 0 : 1;
 
+		maskflag = 1;
 		if (direction == 1) {
 		    dstOffset =
 			GetPixmapOffset(exaScratch.srcPixmap, opX, opY);
@@ -1067,10 +1085,17 @@ lx_do_composite(PixmapPtr pxDst, int srcX, int srcY, int maskX,
 		break;
 	}
 
-	opWidth = ((dstX + width) - opX) > exaScratch.srcWidth ?
-	    exaScratch.srcWidth : (dstX + width) - opX;
-	opHeight = ((dstY + height) - opY) > exaScratch.srcHeight ?
-	    exaScratch.srcHeight : (dstY + height) - opY;
+	if (maskflag == 1) {
+	    opWidth = ((dstX + width) - opX) > (exaScratch.srcWidth - maskX)
+		? (exaScratch.srcWidth - maskX) : (dstX + width) - opX;
+	    opHeight = ((dstY + height) - opY) > (exaScratch.srcHeight - maskY)
+		? (exaScratch.srcHeight - maskY) : (dstY + height) - opY;
+	} else {
+	    opWidth = ((dstX + width) - opX) > exaScratch.srcWidth ?
+		exaScratch.srcWidth : (dstX + width) - opX;
+	    opHeight = ((dstY + height) - opY) > exaScratch.srcHeight ?
+		exaScratch.srcHeight : (dstY + height) - opY;
+	}
     }
 }
 
-- 
1.7.1

_______________________________________________
Xorg-driver-geode mailing list
[email-masked]
http://lists.x.org/mailman/listinfo/xorg-driver-geode