diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2012-03-04 17:22:38 +0000 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2012-03-04 22:54:02 +0000 |
commit | aed5a1cf1e38ae451d2aeaf0a56aa1248b42c0fa (patch) | |
tree | ac644553b86b5f42e24e08364dd03a93607ffcdf /src/cairo-spans-compositor.c | |
parent | cc13379ee37cc077cd728588dfbb15a38980c23c (diff) | |
download | cairo-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.c | 11 |
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", |