[Xorg-driver-geode] [PATCH 2/5] Fix the PictOpSrc rendering

Huang, FrankR FrankR.Huang at amd.com
Fri Jul 23 02:17:34 PDT 2010


Fix the PictOpSrc rendering

*Add the maskrepeat variabel to record mask picture's repeat attribute
*Add the maskflag to record the exaScratch.type when it is COMP_TYPE_MASK
*Use the PictOpClear to make other non-blending region(out of src or mask)
to be black if the op is PictOpSrc or PictOpClear

Signed-off-by: Frank Huang <frankr.huang at amd.com>
---
 src/lx_exa.c |   35 ++++++++++++++++++++++++++++++-----
 1 files changed, 30 insertions(+), 5 deletions(-)

diff --git a/src/lx_exa.c b/src/lx_exa.c
index 5d95e26..39090e3 100644
--- a/src/lx_exa.c
+++ b/src/lx_exa.c
@@ -88,6 +88,7 @@ static struct
     unsigned int srcColor;
     int op;
     int repeat;
+    int maskrepeat;
     unsigned int fourBpp;
     unsigned int bufferOffset;
     struct exa_format_t *srcFormat;
@@ -685,6 +686,7 @@ lx_prepare_composite(int op, PicturePtr pSrc, PicturePtr pMsk,
 	/* Save off the info we need (reuse the source values to save space) */
 
 	exaScratch.type = COMP_TYPE_MASK;
+	exaScratch.maskrepeat = pMsk->repeat;
 
 	exaScratch.srcOffset = exaGetPixmapOffset(pxMsk);
 	exaScratch.srcPitch = exaGetPixmapPitch(pxMsk);
@@ -955,6 +957,10 @@ lx_do_composite(PixmapPtr pxDst, int srcX, int srcY, int maskX,
 
     unsigned int dstOffset, srcOffset = 0;
 
+    /* Use maskflag to record the exaScratch.type when it is COMP_TYPE_MASK.
+     * This is useful for PictOpSrc operation when exaScratch.type is changed */
+    int maskflag = 0;
+
     xPointFixed srcPoint;
 
     int opX = dstX;
@@ -1022,7 +1028,8 @@ lx_do_composite(PixmapPtr pxDst, int srcX, int srcY, int maskX,
     /* 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 */
+    /* exaScratch.repeat is the source repeat attribute
+     * exaScratch.maskrepeat is the mask repeat attribute */
     /* If type is COMP_TYPE_MASK, maskX and maskY are not zero, we should
      * subtract them to do the operation in the correct region */
 
@@ -1053,6 +1060,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);
@@ -1080,9 +1088,6 @@ lx_do_composite(PixmapPtr pxDst, int srcX, int srcY, int maskX,
 	    break;
 	}
 
-	if (!exaScratch.repeat)
-	    break;
-
 	opX += opWidth;
 
 	if (opX >= dstX + width) {
@@ -1097,16 +1102,36 @@ lx_do_composite(PixmapPtr pxDst, int srcX, int srcY, int maskX,
 	 * and maskY coordinate are negative or greater than
 	 * exaScratch.srcWidth and exaScratch.srcHeight */
 
-	if (exaScratch.type == COMP_TYPE_MASK) {
+	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;
+	    /* Use the PictOpClear to make other non-blending region(out of
+	     * mask region) to be black if the op is PictOpSrc or
+	     * PictOpClear */
+	    if (!exaScratch.maskrepeat)
+		if ((exaScratch.op == PictOpClear) ||
+		    (exaScratch.op == PictOpSrc)) {
+		    exaScratch.op = PictOpClear;
+		    exaScratch.type = COMP_TYPE_ONEPASS;
+		}
 	} else {
 	    opWidth = ((dstX + width) - opX) > exaScratch.srcWidth ?
 		exaScratch.srcWidth : (dstX + width) - opX;
 	    opHeight = ((dstY + height) - opY) > exaScratch.srcHeight ?
 		exaScratch.srcHeight : (dstY + height) - opY;
+	    /* Use the PictOpClear to make other non-blending region(out of
+	     * source region) to be black if the op is PictOpSrc or
+	     * PictOpClear. Special attention to rotation condition */
+	    if (!exaScratch.repeat && (exaScratch.type == COMP_TYPE_ONEPASS))
+		if ((exaScratch.op == PictOpClear) ||
+		    (exaScratch.op == PictOpSrc))
+		    exaScratch.op = PictOpClear;
+		else
+		    break;
+	    if (!exaScratch.repeat && (exaScratch.type == COMP_TYPE_ROTATE))
+		    break;
 	}
     }
 }
-- 
1.7.1




More information about the Xorg-driver-geode mailing list