diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2012-05-11 21:20:35 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2012-05-11 21:31:13 +0100 |
commit | cd1004ce19c7ea28c7fedb6464562a08416586c0 (patch) | |
tree | 15a721c7b42dc7168b2f6c98c6cc8da8b4f1531f /src/cairo-spans-compositor.c | |
parent | de1150cc0e1cb11710b196806335817255cb4abe (diff) | |
download | cairo-cd1004ce19c7ea28c7fedb6464562a08416586c0.tar.gz |
traps,spans-compositor: Avoid mistreating unaligned clips as aligned
An unaligned clip requires careful handling, and so exclude processing
along the fast paths.
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 | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/src/cairo-spans-compositor.c b/src/cairo-spans-compositor.c index 2e2f4f457..a60cff407 100644 --- a/src/cairo-spans-compositor.c +++ b/src/cairo-spans-compositor.c @@ -519,6 +519,26 @@ upload_boxes (const cairo_spans_compositor_t *compositor, return status; } +static cairo_bool_t +_clip_is_region (const cairo_clip_t *clip) +{ + int i; + + if (clip->is_region) + return TRUE; + + if (clip->path) + return FALSE; + + for (i = 0; i < clip->num_boxes; i++) { + const cairo_box_t *b = &clip->boxes[i]; + if (!_cairo_fixed_is_integer (b->p1.x | b->p1.y | b->p2.x | b->p2.y)) + return FALSE; + } + + return TRUE; +} + static cairo_int_status_t composite_aligned_boxes (const cairo_spans_compositor_t *compositor, const cairo_composite_rectangles_t *extents, @@ -528,7 +548,7 @@ composite_aligned_boxes (const cairo_spans_compositor_t *compositor, cairo_operator_t op = extents->op; const cairo_pattern_t *source = &extents->source_pattern.base; cairo_int_status_t status; - cairo_bool_t need_clip_mask = extents->clip->path != NULL; + cairo_bool_t need_clip_mask = ! _clip_is_region (extents->clip); cairo_bool_t op_is_source; cairo_bool_t no_mask; cairo_bool_t inplace; @@ -716,7 +736,7 @@ composite_polygon (const cairo_spans_compositor_t *compositor, cairo_bool_t needs_clip; cairo_int_status_t status; - needs_clip = extents->clip->path != NULL || extents->clip->num_boxes > 1; + needs_clip = extents->clip->num_boxes > 1 || ! _clip_is_region (extents->clip); TRACE ((stderr, "%s - needs_clip=%d\n", __FUNCTION__, needs_clip)); if (needs_clip) { return CAIRO_INT_STATUS_UNSUPPORTED; |