--- /home/frank/git/driver/xf86-video-geode/src/lx_exa.c 2010-03-22 15:20:56.000000000 +0800 +++ /root/src/X/driver/xf86-video-geode/src/lx_exa.c 2010-05-19 19:52:41.000000000 +0800 @@ -407,14 +407,26 @@ CIMGP_ALPHA_TIMES_A, CIMGP_ALPHA_EQUALS_ONE, CIMGP_CHANNEL_A_DEST}, { }, /* PictOpOver */ +// { +// CIMGP_ALPHA_A_PLUS_BETA_B, CIMGP_CHANNEL_A_ALPHA, CIMGP_CHANNEL_A_SOURCE}, +// { +// }, +//Frank { - CIMGP_ALPHA_A_PLUS_BETA_B, CIMGP_CHANNEL_A_ALPHA, CIMGP_CHANNEL_A_SOURCE}, + CIMGP_A_PLUS_BETA_B, CIMGP_CHANNEL_A_ALPHA, CIMGP_CHANNEL_A_SOURCE}, { }, + /* PictOpOverReverse */ +// { +// CIMGP_ALPHA_A_PLUS_BETA_B, CIMGP_CHANNEL_A_ALPHA, CIMGP_CHANNEL_A_DEST}, { +// }, +//Frank + { + CIMGP_A_PLUS_BETA_B, CIMGP_CHANNEL_A_ALPHA, CIMGP_CHANNEL_A_DEST}, { - CIMGP_ALPHA_A_PLUS_BETA_B, CIMGP_CHANNEL_A_ALPHA, CIMGP_CHANNEL_A_DEST}, { }, + /* PictOpIn */ { CIMGP_ALPHA_TIMES_A, CIMGP_CHANNEL_B_ALPHA, CIMGP_CHANNEL_A_SOURCE}, { @@ -582,6 +594,17 @@ if (pSrc->format == PICT_a8 || pDst->format == PICT_a8) return FALSE; +//Frank +// if(pMsk) +// return FAULSE; + + if(pMsk && op != PictOpClear) + if (pMsk->format != PICT_a8 && pMsk->format != PICT_a4) + return FALSE; + + if(pSrc->pDrawable->width != 1 || pSrc->pDrawable->height != 1) + return FALSE; + return TRUE; } @@ -1000,11 +1023,19 @@ srcOffset = GetSrcOffset(I(srcPoint.x), I(srcPoint.y)); - if (exaScratch.srcWidth < opWidth) - opWidth = exaScratch.srcWidth; +//Frank +// if (exaScratch.srcWidth < opWidth) +// opWidth = exaScratch.srcWidth; + +// if (exaScratch.srcHeight < opHeight) +// opHeight = exaScratch.srcHeight; + + if ((exaScratch.srcWidth - maskX) < opWidth) + opWidth = exaScratch.srcWidth - maskX; + + if ((exaScratch.srcHeight - maskY) < opHeight) + opHeight = exaScratch.srcHeight - maskY; - if (exaScratch.srcHeight < opHeight) - opHeight = exaScratch.srcHeight; while (1) { @@ -1024,6 +1055,14 @@ } else { lx_do_composite_mask(pxDst, dstOffset, srcOffset, opWidth, opHeight); + //Frank + if(exaScratch.op == PictOpSrc){ + exaScratch.type = COMP_TYPE_ONEPASS; + exaScratch.op = 0; + } + if(exaScratch.op == PictOpOver){ + exaScratch.repeat = 0; + } } } break; @@ -1056,10 +1095,16 @@ break; } - opWidth = ((dstX + width) - opX) > exaScratch.srcWidth ? - exaScratch.srcWidth : (dstX + width) - opX; - opHeight = ((dstY + height) - opY) > exaScratch.srcHeight ? - exaScratch.srcHeight : (dstY + height) - opY; +//Frank +// opWidth = ((dstX + width) - opX) > exaScratch.srcWidth ? +// exaScratch.srcWidth : (dstX + width) - opX; +// opHeight = ((dstY + height) - opY) > exaScratch.srcHeight ? +// exaScratch.srcHeight : (dstY + height) - opY; + opWidth = ((dstX + width) - opX) > (exaScratch.srcWidth - maskX) ? + (exaScratch.srcWidth - maskX) : (dstX + width) - opX; + opHeight = ((dstY + height) - opY) > (exaScratch.srcHeight - maskY) ? + (exaScratch.srcHeight - maskY) : (dstX + height) - opY; + } }