[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