[Xorg-driver-geode] [PATCH 2/2] Fix the PictOpIn and PictOpOut

Huang, FrankR FrankR.Huang at amd.com
Wed Aug 18 00:37:18 PDT 2010


From: Frank Huang <frankr.huang at amd.com>

*Correct the entry for PictOpIn, PictOpOut, PictOpOverReverse
*Some code format adjustment
*Delete the maskflag(temp variable)
*Change the code to make the black region(More reasonable than change
op from PictOpSrc to PictOpClear)

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

diff --git a/src/lx_exa.c b/src/lx_exa.c
index e6a3b32..6bc84ea 100644
--- a/src/lx_exa.c
+++ b/src/lx_exa.c
@@ -414,20 +414,20 @@ struct blend_ops_t
     CIMGP_ALPHA_TIMES_A, CIMGP_CONVERTED_ALPHA, CIMGP_CHANNEL_A_SOURCE},
 	/* PictOpOverReverse */
     {
-    CIMGP_A_PLUS_BETA_B, CIMGP_CHANNEL_B_ALPHA, CIMGP_CHANNEL_A_DEST}, {
+    CIMGP_A_PLUS_BETA_B, CIMGP_CHANNEL_A_ALPHA, CIMGP_CHANNEL_A_DEST}, {
     CIMGP_ALPHA_TIMES_A, CIMGP_CONVERTED_ALPHA, CIMGP_CHANNEL_A_SOURCE},
 	/* PictOpIn */
     {
     CIMGP_ALPHA_TIMES_A, CIMGP_CHANNEL_B_ALPHA, CIMGP_CHANNEL_A_SOURCE}, {
-    },
+    CIMGP_ALPHA_TIMES_A, CIMGP_CONVERTED_ALPHA, CIMGP_CHANNEL_A_SOURCE},
 	/* PictOpInReverse */
     {
     CIMGP_ALPHA_TIMES_A, CIMGP_CHANNEL_B_ALPHA, CIMGP_CHANNEL_A_DEST}, {
     CIMGP_ALPHA_TIMES_A, CIMGP_CONVERTED_ALPHA, CIMGP_CHANNEL_A_SOURCE},
 	/* PictOpOut */
     {
-    CIMGP_BETA_TIMES_B, CIMGP_CHANNEL_A_ALPHA, CIMGP_CHANNEL_A_SOURCE}, {
-    },
+    CIMGP_BETA_TIMES_B, CIMGP_CHANNEL_A_ALPHA, CIMGP_CHANNEL_A_DEST}, {
+    CIMGP_ALPHA_TIMES_A, CIMGP_CONVERTED_ALPHA, CIMGP_CHANNEL_A_SOURCE},
 	/* PictOpOutReverse */
     {
     CIMGP_BETA_TIMES_B, CIMGP_CHANNEL_A_ALPHA, CIMGP_CHANNEL_A_SOURCE}, {
@@ -680,14 +680,18 @@ lx_prepare_composite(int op, PicturePtr pSrc, PicturePtr pMsk,
 
     if (pMsk && op != PictOpClear) {
 	/* Get the source color */
-	/* If the op is PictOpOver(or PictOpOutReverse,PictOpInReverse)
-	 * we should get the ARGB32 source format */
+	/* If the op is PictOpOver(or PictOpOutReverse, PictOpInReverse,
+	 * PictOpIn, PictOpOut, PictOpOverReverse), we should get the
+	 * ARGB32 source format */
 
 	if ((op == PictOpOver || op == PictOpOutReverse || op ==
-	    PictOpInReverse) && (srcFmt->alphabits != 0))
+	    PictOpInReverse || op == PictOpIn || op == PictOpOut ||
+	    op == PictOpOverReverse) && (srcFmt->alphabits != 0))
 	    exaScratch.srcColor = exaGetPixmapFirstPixel(pxSrc);
 	else if ((op == PictOpOver || op == PictOpOutReverse || op ==
-	    PictOpInReverse) && (srcFmt->alphabits == 0))
+	    PictOpInReverse || op == PictOpIn || op == PictOpOut ||
+	    op == PictOpOverReverse) &&
+	    (srcFmt->alphabits == 0))
 	    exaScratch.srcColor = lx_get_source_color(pxSrc, pSrc->format,
 		PICT_a8r8g8b8);
 	else
@@ -1193,10 +1197,6 @@ 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;
@@ -1279,62 +1279,62 @@ lx_do_composite(PixmapPtr pxDst, int srcX, int srcY, int maskX,
 	if ((exaScratch.srcHeight - maskY) < opHeight)
 	    opHeight = exaScratch.srcHeight - maskY;
     } else {
-	    if (exaScratch.type == COMP_TYPE_ONEPASS) {
-		/* This is the condition srcX or/and srcY is/are out of source
-		 * region */
-		if (((srcX >= 0 && srcY >= exaScratch.srcHeight)
-		    || (srcX >= exaScratch.srcWidth  && srcY >= 0)) &&
-		    (exaScratch.op == PictOpOver || exaScratch.op == PictOpSrc)) {
-		    if (exaScratch.repeat == 1) {
-			opWidth = width;
-			opHeight = height;
-		    } else {
-			if (exaScratch.op == PictOpOver)
-			    return ;
-			else {
-			    exaScratch.op = PictOpClear;
-			    opWidth = width;
-			    opHeight = height;
-			}
-		    }
-		/* This is the condition srcX or/and srcY is/are in the source
-		 * region */
-		} else if (srcX >= 0 && srcY >= 0 &&
-		    (exaScratch.op == PictOpOver || exaScratch.op == PictOpSrc)) {
-		    if (exaScratch.repeat == 1) {
-			opWidth = width;
-			opHeight = height;
-		    } else {
-			if ((exaScratch.srcWidth - srcX) < opWidth)
-			    opWidth = exaScratch.srcWidth - srcX;
-			if ((exaScratch.srcHeight - srcY) < opHeight)
-			    opHeight = exaScratch.srcHeight - srcY;
-		    }
-		/* This is the condition srcX or/and srcY is/are negative */
-		} else if ((srcX < 0 || srcY < 0) &&
-		    (exaScratch.op == PictOpOver || exaScratch.op == PictOpSrc)) {
-		    if (exaScratch.repeat == 1) {
+	if (exaScratch.type == COMP_TYPE_ONEPASS) {
+	    /* This is the condition srcX or/and srcY is/are out of source
+	     * region */
+	    if (((srcX >= 0 && srcY >= exaScratch.srcHeight)
+		|| (srcX >= exaScratch.srcWidth  && srcY >= 0)) &&
+		(exaScratch.op == PictOpOver || exaScratch.op == PictOpSrc)) {
+		if (exaScratch.repeat == 1) {
+		    opWidth = width;
+		    opHeight = height;
+		} else {
+		    if (exaScratch.op == PictOpOver)
+			return ;
+		    else {
+			exaScratch.op = PictOpClear;
 			opWidth = width;
 			opHeight = height;
-		    } else {
-			/* Have not met this condition till now */
-			return ;
 		    }
+		}
+	    /* This is the condition srcX or/and srcY is/are in the source
+	     * region */
+	    } else if (srcX >= 0 && srcY >= 0 &&
+		(exaScratch.op == PictOpOver || exaScratch.op == PictOpSrc)) {
+		if (exaScratch.repeat == 1) {
+		    opWidth = width;
+		    opHeight = height;
 		} else {
-		    if (exaScratch.srcWidth < opWidth)
-			opWidth = exaScratch.srcWidth;
-		    if (exaScratch.srcHeight < opHeight)
-			opHeight = exaScratch.srcHeight;
+		    if ((exaScratch.srcWidth - srcX) < opWidth)
+			opWidth = exaScratch.srcWidth - srcX;
+		    if ((exaScratch.srcHeight - srcY) < opHeight)
+			opHeight = exaScratch.srcHeight - srcY;
 		}
-	    } else {
-		if (exaScratch.rotate == RR_Rotate_180) {
+	    /* This is the condition srcX or/and srcY is/are negative */
+	    } else if ((srcX < 0 || srcY < 0) &&
+		(exaScratch.op == PictOpOver || exaScratch.op == PictOpSrc)) {
+		if (exaScratch.repeat == 1) {
+		    opWidth = width;
+		    opHeight = height;
 		} else {
-		    if ((exaScratch.srcWidth - srcY) < opWidth)
-			opWidth = exaScratch.srcWidth - srcY;
-		    if ((exaScratch.srcHeight - srcX) < opHeight)
-			opHeight = exaScratch.srcHeight - srcX;
+		/* Have not met this condition till now */
+		    return ;
 		}
+	    } else {
+		if (exaScratch.srcWidth < opWidth)
+		    opWidth = exaScratch.srcWidth;
+		if (exaScratch.srcHeight < opHeight)
+		    opHeight = exaScratch.srcHeight;
+	    }
+	} else {
+	    if (exaScratch.rotate == RR_Rotate_180) {
+	    } else {
+		if ((exaScratch.srcWidth - srcY) < opWidth)
+		    opWidth = exaScratch.srcWidth - srcY;
+		if ((exaScratch.srcHeight - srcX) < opHeight)
+		    opHeight = exaScratch.srcHeight - srcX;
 	    }
+	}
     }
 
     while (1) {
@@ -1344,14 +1344,15 @@ lx_do_composite(PixmapPtr pxDst, int srcX, int srcY, int maskX,
 	switch (exaScratch.type) {
 
 	case COMP_TYPE_MASK:{
-		maskflag = 1;
-		if (exaScratch.op == PictOpOver || exaScratch.op ==
-		    PictOpOutReverse || exaScratch.op == PictOpInReverse)
-		    lx_do_composite_mask_two_pass(pxDst, dstOffset,
-			srcOffset, opWidth, opHeight, opX, opY, srcPoint);
-		else
-		    lx_do_composite_mask(pxDst, dstOffset, srcOffset,
-			opWidth, opHeight);
+	    if (exaScratch.op == PictOpOver || exaScratch.op ==
+		PictOpOutReverse || exaScratch.op == PictOpInReverse ||
+		exaScratch.op == PictOpIn || exaScratch.op == PictOpOut ||
+		exaScratch.op == PictOpOverReverse)
+		lx_do_composite_mask_two_pass(pxDst, dstOffset,
+		    srcOffset, opWidth, opHeight, opX, opY, srcPoint);
+	    else
+		lx_do_composite_mask(pxDst, dstOffset, srcOffset,
+		    opWidth, opHeight);
 	    }
 	    break;
 
@@ -1394,26 +1395,14 @@ 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 (maskflag == 1) {
+	if (exaScratch.type == COMP_TYPE_MASK) {
 	    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 if (exaScratch.op == PictOpOver)
-		    break;
-		/* Outside the source is all zero vectors */
-		else if (exaScratch.op == PictOpOutReverse || exaScratch.op ==
-		    PictOpInReverse)
-		    exaScratch.srcColor = 0x0;
-	    }
+	    /* All black out of the mask */
+	    if (!exaScratch.maskrepeat)
+		exaScratch.srcColor = 0x0;
 	} else {
 	    if (exaScratch.type == COMP_TYPE_ONEPASS) {
 		if (srcX >= 0 && srcY >= 0 && (exaScratch.op == PictOpOver ||
@@ -1437,21 +1426,10 @@ lx_do_composite(PixmapPtr pxDst, int srcX, int srcY, int maskX,
 		opHeight = ((dstY + height) - opY) > (exaScratch.srcHeight - srcX
 		    ) ? (exaScratch.srcHeight - srcX) : (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 */
+	    /* All black out of the source */
 	    if (!exaScratch.repeat && (exaScratch.type == COMP_TYPE_ONEPASS)) {
-		if ((exaScratch.op == PictOpClear) ||
-		    (exaScratch.op == PictOpSrc))
-		    exaScratch.op = PictOpClear;
-		/* Outside the source is all zero vectors */
-		else if (exaScratch.op == PictOpOutReverse || exaScratch.op ==
-		    PictOpInReverse)
 		    lx_composite_all_black(srcOffset, exaScratch.srcWidth,
 			exaScratch.srcHeight);
-		else
-		    break;
 	    }
 	    if (!exaScratch.repeat && (exaScratch.type == COMP_TYPE_ROTATE))
 		    break;
-- 
1.7.1




More information about the Xorg-driver-geode mailing list