diff options
author | Frank Huang <frankr.huang@amd.com> | 2010-07-05 16:49:05 +0800 |
---|---|---|
committer | Mart Raudsepp <leio@gentoo.org> | 2010-07-06 09:11:01 +0300 |
commit | f21fb29dbe54e7a237047920a00632752a970da1 (patch) | |
tree | 5e90b936109445e9562b5734829bae9d5c1c72a3 /src/lx_exa.c | |
parent | d8baf45eb79e473fba68b8335b6aaca27df681cf (diff) |
Correctly calculate the rendering region with the mask picture
If the opeartion is with a shifted position mask, then adjust the
operation region based on the operations mask width and height
parameters(instead of clipping based on source width/height)
Signed-off-by: Frank Huang <frankr.huang@amd.com>
Acked-by: Mart Raudsepp <leio@gentoo.org>
Diffstat (limited to 'src/lx_exa.c')
-rw-r--r-- | src/lx_exa.c | 47 |
1 files changed, 39 insertions, 8 deletions
diff --git a/src/lx_exa.c b/src/lx_exa.c index 14980ae..a70766f 100644 --- a/src/lx_exa.c +++ b/src/lx_exa.c @@ -1009,13 +1009,33 @@ lx_do_composite(PixmapPtr pxDst, int srcX, int srcY, int maskX, srcPoint.y = F(0); } + /* Get the source point offset position */ + srcOffset = GetSrcOffset(I(srcPoint.x), I(srcPoint.y)); - if (exaScratch.srcWidth < opWidth) - opWidth = exaScratch.srcWidth; + /* 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 */ + /* If type is COMP_TYPE_MASK, maskX and maskY are not zero, we should + * subtract them to do the operation in the correct region */ + + /* FIXME: Please add the code to handle the condition when the maskX + * and maskY coordinate are negative or greater than + * exaScratch.srcWidth and exaScratch.srcHeight */ - if (exaScratch.srcHeight < opHeight) - opHeight = exaScratch.srcHeight; + + if (exaScratch.type == COMP_TYPE_MASK) { + if ((exaScratch.srcWidth - maskX) < opWidth) + opWidth = exaScratch.srcWidth - maskX; + if ((exaScratch.srcHeight - maskY) < opHeight) + opHeight = exaScratch.srcHeight - maskY; + } else { + if (exaScratch.srcWidth < opWidth) + opWidth = exaScratch.srcWidth; + if (exaScratch.srcHeight < opHeight) + opHeight = exaScratch.srcHeight; + } while (1) { @@ -1067,10 +1087,21 @@ lx_do_composite(PixmapPtr pxDst, int srcX, int srcY, int maskX, break; } - opWidth = ((dstX + width) - opX) > exaScratch.srcWidth ? - exaScratch.srcWidth : (dstX + width) - opX; - opHeight = ((dstY + height) - opY) > exaScratch.srcHeight ? - exaScratch.srcHeight : (dstY + height) - opY; + /* FIXME: Please add the code to handle the condition when the maskX + * and maskY coordinate are negative or greater than + * exaScratch.srcWidth and exaScratch.srcHeight */ + + 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; + } else { + opWidth = ((dstX + width) - opX) > exaScratch.srcWidth ? + exaScratch.srcWidth : (dstX + width) - opX; + opHeight = ((dstY + height) - opY) > exaScratch.srcHeight ? + exaScratch.srcHeight : (dstY + height) - opY; + } } } |