summaryrefslogtreecommitdiff
path: root/src/lx_exa.c
diff options
context:
space:
mode:
authorFrank Huang <frankr.huang@amd.com>2010-07-05 16:49:05 +0800
committerMart Raudsepp <leio@gentoo.org>2010-07-06 09:11:01 +0300
commitf21fb29dbe54e7a237047920a00632752a970da1 (patch)
tree5e90b936109445e9562b5734829bae9d5c1c72a3 /src/lx_exa.c
parentd8baf45eb79e473fba68b8335b6aaca27df681cf (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.c47
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;
+ }
}
}