diff options
author | Frank Huang <frankr.huang@amd.com> | 2010-08-18 15:36:49 +0800 |
---|---|---|
committer | Martin-Éric Racine <q-funk@iki.fi> | 2010-08-18 11:10:23 +0300 |
commit | 32a927b8e627b3f9759ccfbff231f5fd22445f02 (patch) | |
tree | f4d798aacef4b9fb75c76d802130e6c940ad98e7 /src/lx_exa.c | |
parent | f0e24491ca676244b2fd6f2d4476e996847824cd (diff) |
Fix the PictOpInReverse op
*Correct the entry for PictOpOverReverse and PictOpInReverse
*Correct the channel reverse use, delete direction use
*Add a function lx_composite_all_black to generate a all zero vectors
including alpha
*Modify some comments
Signed-off-by: Frank Huang <frankr.huang@amd.com>
Diffstat (limited to 'src/lx_exa.c')
-rw-r--r-- | src/lx_exa.c | 100 |
1 files changed, 49 insertions, 51 deletions
diff --git a/src/lx_exa.c b/src/lx_exa.c index c43417f..e6a3b32 100644 --- a/src/lx_exa.c +++ b/src/lx_exa.c @@ -414,8 +414,8 @@ struct blend_ops_t CIMGP_ALPHA_TIMES_A, CIMGP_CONVERTED_ALPHA, CIMGP_CHANNEL_A_SOURCE}, /* PictOpOverReverse */ { - CIMGP_A_PLUS_BETA_B, CIMGP_CHANNEL_A_ALPHA, CIMGP_CHANNEL_A_DEST}, { - CIMGP_ALPHA_TIMES_A, CIMGP_CONVERTED_ALPHA, CIMGP_CHANNEL_A_DEST}, + CIMGP_A_PLUS_BETA_B, CIMGP_CHANNEL_B_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}, { @@ -423,7 +423,7 @@ struct blend_ops_t /* 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}, { @@ -679,27 +679,20 @@ lx_prepare_composite(int op, PicturePtr pSrc, PicturePtr pMsk, exaScratch.bufferOffset = pGeode->exaBfrOffset; if (pMsk && op != PictOpClear) { - struct blend_ops_t *opPtr = &lx_alpha_ops[op * 2]; - int direction = (opPtr->channel == CIMGP_CHANNEL_A_SOURCE) ? 0 : 1; - /* Get the source color */ - /* If the op is PictOpOver, we should get the ARGB32 source format */ + /* If the op is PictOpOver(or PictOpOutReverse,PictOpInReverse) + * we should get the ARGB32 source format */ - if ((op == PictOpOver || op == PictOpOutReverse) && - (srcFmt->alphabits != 0)) + if ((op == PictOpOver || op == PictOpOutReverse || op == + PictOpInReverse) && (srcFmt->alphabits != 0)) exaScratch.srcColor = exaGetPixmapFirstPixel(pxSrc); - else if ((op == PictOpOver || op == PictOpOutReverse) && - (srcFmt->alphabits == 0)) + else if ((op == PictOpOver || op == PictOpOutReverse || op == + PictOpInReverse) && (srcFmt->alphabits == 0)) exaScratch.srcColor = lx_get_source_color(pxSrc, pSrc->format, PICT_a8r8g8b8); - else { - if (direction == 0) - exaScratch.srcColor = lx_get_source_color(pxSrc, pSrc->format, - pDst->format); - else - exaScratch.srcColor = lx_get_source_color(pxDst, pDst->format, - pSrc->format); - } + else + exaScratch.srcColor = lx_get_source_color(pxSrc, pSrc->format, + pDst->format); /* Save off the info we need (reuse the source values to save space) */ @@ -715,11 +708,6 @@ lx_prepare_composite(int op, PicturePtr pSrc, PicturePtr pMsk, /* Flag to indicate if this a 8BPP or a 4BPP mask */ exaScratch.fourBpp = (pxMsk->drawable.bitsPerPixel == 4) ? 1 : 0; - - /* If the direction is reversed, then remember the source */ - - if (direction == 1) - exaScratch.srcPixmap = pxSrc; } else { if (usesPasses(op)) exaScratch.type = COMP_TYPE_TWOPASS; @@ -891,6 +879,27 @@ lx_composite_onepass(PixmapPtr pxDst, unsigned long dstOffset, } static void +lx_composite_all_black(unsigned long srcOffset, int width, int height) +{ + struct blend_ops_t *opPtr; + int apply, type; + + opPtr = &lx_alpha_ops[0]; + apply = (exaScratch.srcFormat->alphabits != 0) ? + CIMGP_APPLY_BLEND_TO_ALL : CIMGP_APPLY_BLEND_TO_RGB; + gp_declare_blt(0); + gp_set_bpp(lx_get_bpp_from_format(exaScratch.srcFormat->fmt)); + gp_set_strides(exaScratch.srcPitch, exaScratch.srcPitch); + lx_set_source_format(exaScratch.srcFormat->fmt, + exaScratch.srcFormat->fmt); + type = + get_op_type(exaScratch.srcFormat, exaScratch.srcFormat, opPtr->type); + gp_set_alpha_operation(opPtr->operation, type, opPtr->channel, apply, 0); + gp_screen_to_screen_convert(srcOffset, srcOffset, width, height, 0); + +} + +static void lx_composite_onepass_special(PixmapPtr pxDst, int width, int height, int opX, int opY, int srcX, int srcY) { @@ -1130,8 +1139,8 @@ lx_do_composite_mask_two_pass(PixmapPtr pxDst, unsigned long dstOffset, maskOffset, exaScratch.srcPitch, opPtr->operation, exaScratch.fourBpp); - /* Do a PictOpOver operation(src + (1-a) * dst), and copy the operation - * result to destination */ + /* Do a relative operation(refer rendercheck ops.c), and copy the + * operation result to destination */ gp_declare_blt(CIMGP_BLTFLAGS_HAZARD); opPtr = &lx_alpha_ops[exaScratch.op * 2]; @@ -1182,8 +1191,6 @@ static void lx_do_composite(PixmapPtr pxDst, int srcX, int srcY, int maskX, int maskY, int dstX, int dstY, int width, int height) { - struct blend_ops_t *opPtr = &lx_alpha_ops[exaScratch.op * 2]; - unsigned int dstOffset, srcOffset = 0; /* Use maskflag to record the exaScratch.type when it is COMP_TYPE_MASK. @@ -1337,29 +1344,14 @@ lx_do_composite(PixmapPtr pxDst, int srcX, int srcY, int maskX, switch (exaScratch.type) { case COMP_TYPE_MASK:{ - int direction = - (opPtr->channel == CIMGP_CHANNEL_A_SOURCE) ? 0 : 1; maskflag = 1; - if (direction == 1) { - dstOffset = - GetPixmapOffset(exaScratch.srcPixmap, opX, opY); - if (exaScratch.op == PictOpOver || exaScratch.op == - PictOpOutReverse) - lx_do_composite_mask_two_pass(exaScratch.srcPixmap, - dstOffset, srcOffset, opWidth, opHeight, - opX, opY, srcPoint); - else - lx_do_composite_mask(exaScratch.srcPixmap, dstOffset, - srcOffset, opWidth, opHeight); - } else { - if (exaScratch.op == PictOpOver || exaScratch.op == - PictOpOutReverse) - 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) + 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; @@ -1418,7 +1410,8 @@ lx_do_composite(PixmapPtr pxDst, int srcX, int srcY, int maskX, } else if (exaScratch.op == PictOpOver) break; /* Outside the source is all zero vectors */ - else if (exaScratch.op == PictOpOutReverse) + else if (exaScratch.op == PictOpOutReverse || exaScratch.op == + PictOpInReverse) exaScratch.srcColor = 0x0; } } else { @@ -1452,6 +1445,11 @@ lx_do_composite(PixmapPtr pxDst, int srcX, int srcY, int maskX, 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; } |