diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2011-10-26 12:40:46 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2011-10-27 10:25:36 +0100 |
commit | ff4715a36999a43cee20cf3474b4ae0af646342c (patch) | |
tree | 9351e22272a2e47172de091a913726726d48c91d | |
parent | 0079579ebd548fc1b490a42928373507a93229bd (diff) |
sna/composite: Discard opaque masks
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r-- | src/sna/sna_blt.c | 11 | ||||
-rw-r--r-- | src/sna/sna_composite.c | 3 | ||||
-rw-r--r-- | src/sna/sna_render.h | 3 |
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(®ion, 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 */ |