summaryrefslogtreecommitdiff
path: root/src/cairo-spans-compositor.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-05-11 21:20:35 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2012-05-11 21:31:13 +0100
commitcd1004ce19c7ea28c7fedb6464562a08416586c0 (patch)
tree15a721c7b42dc7168b2f6c98c6cc8da8b4f1531f /src/cairo-spans-compositor.c
parentde1150cc0e1cb11710b196806335817255cb4abe (diff)
downloadcairo-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.c24
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;