summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2011-10-26 12:40:46 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2011-10-27 10:25:36 +0100
commitff4715a36999a43cee20cf3474b4ae0af646342c (patch)
tree9351e22272a2e47172de091a913726726d48c91d
parent0079579ebd548fc1b490a42928373507a93229bd (diff)
sna/composite: Discard opaque masks
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--src/sna/sna_blt.c11
-rw-r--r--src/sna/sna_composite.c3
-rw-r--r--src/sna/sna_render.h3
3 files changed, 17 insertions, 0 deletions
diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c
index 80ccf9c4..bbe9dda3 100644
--- a/src/sna/sna_blt.c
+++ b/src/sna/sna_blt.c
@@ -652,6 +652,17 @@ is_white(PicturePtr picture)
return pixel_is_white(get_pixel(picture), picture->format);
}
+bool
+sna_composite_mask_is_opaque(PicturePtr mask)
+{
+ if (mask->componentAlpha && PICT_FORMAT_RGB(mask->format))
+ return is_solid(mask) && is_white(mask);
+ else if (!PICT_FORMAT_A(mask->format))
+ return TRUE;
+ else
+ return is_solid(mask) && is_opaque_solid(mask);
+}
+
fastcall
static void blt_composite_fill(struct sna *sna,
const struct sna_composite_op *op,
diff --git a/src/sna/sna_composite.c b/src/sna/sna_composite.c
index 3962d759..e9dc965f 100644
--- a/src/sna/sna_composite.c
+++ b/src/sna/sna_composite.c
@@ -426,6 +426,9 @@ sna_composite(CARD8 op,
dst_x, dst_y, dst->pDrawable->x, dst->pDrawable->y,
width, height));
+ if (mask && sna_composite_mask_is_opaque(mask))
+ mask = NULL;
+
if (!sna_compute_composite_region(&region,
src, mask, dst,
src_x, src_y,
diff --git a/src/sna/sna_render.h b/src/sna/sna_render.h
index 6c187915..d31b55c0 100644
--- a/src/sna/sna_render.h
+++ b/src/sna/sna_render.h
@@ -569,4 +569,7 @@ void
sna_render_composite_redirect_done(struct sna *sna,
const struct sna_composite_op *op);
+bool
+sna_composite_mask_is_opaque(PicturePtr mask);
+
#endif /* SNA_RENDER_H */