summaryrefslogtreecommitdiff
path: root/src/cairo-spans-compositor.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-03-04 17:22:38 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2012-03-04 22:54:02 +0000
commitaed5a1cf1e38ae451d2aeaf0a56aa1248b42c0fa (patch)
treeac644553b86b5f42e24e08364dd03a93607ffcdf /src/cairo-spans-compositor.c
parentcc13379ee37cc077cd728588dfbb15a38980c23c (diff)
downloadcairo-aed5a1cf1e38ae451d2aeaf0a56aa1248b42c0fa.tar.gz
spans: Reduce composite_aligned_boxes with over to source for opaque patterns
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'src/cairo-spans-compositor.c')
-rw-r--r--src/cairo-spans-compositor.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/src/cairo-spans-compositor.c b/src/cairo-spans-compositor.c
index 9a1c905e3..2398ace70 100644
--- a/src/cairo-spans-compositor.c
+++ b/src/cairo-spans-compositor.c
@@ -420,7 +420,8 @@ recording_pattern_contains_sample (const cairo_pattern_t *pattern,
}
static cairo_bool_t
-op_reduces_to_source (const cairo_composite_rectangles_t *extents)
+op_reduces_to_source (const cairo_composite_rectangles_t *extents,
+ cairo_bool_t no_mask)
{
if (extents->op == CAIRO_OPERATOR_SOURCE)
return TRUE;
@@ -428,6 +429,10 @@ op_reduces_to_source (const cairo_composite_rectangles_t *extents)
if (extents->surface->is_clear)
return extents->op == CAIRO_OPERATOR_OVER || extents->op == CAIRO_OPERATOR_ADD;
+ if (no_mask && extents->op == CAIRO_OPERATOR_OVER)
+ return _cairo_pattern_is_opaque (&extents->source_pattern.base,
+ &extents->source_sample_area);
+
return FALSE;
}
@@ -450,9 +455,9 @@ composite_aligned_boxes (const cairo_spans_compositor_t *compositor,
if (need_clip_mask && ! extents->is_bounded)
return CAIRO_INT_STATUS_UNSUPPORTED;
- op_is_source = op_reduces_to_source (extents);
no_mask = extents->mask_pattern.base.type == CAIRO_PATTERN_TYPE_SOLID &&
- CAIRO_ALPHA_IS_OPAQUE (extents->mask_pattern.solid.color.alpha);
+ CAIRO_COLOR_IS_OPAQUE (&extents->mask_pattern.solid.color);
+ op_is_source = op_reduces_to_source (extents, no_mask);
inplace = ! need_clip_mask && op_is_source && no_mask;
TRACE ((stderr, "%s: op-is-source=%d [op=%d], no-mask=%d, inplace=%d\n",