diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2012-03-06 15:01:05 +0000 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2012-03-06 21:13:17 +0000 |
commit | 753007ea0097ecd3ea9611dba69e995f755d5f5c (patch) | |
tree | a7f06ef8ee3df0c6f9bee2b4511c5f000c0c14f0 /src/cairo-traps-compositor.c | |
parent | d40b90a577f3dd159d3871185ed8d649a03a2a4e (diff) | |
download | cairo-753007ea0097ecd3ea9611dba69e995f755d5f5c.tar.gz |
traps: Avoid double application of unaligned clip boxes
Both combine-with-clip functions now take care of any intersection with
clip boxes so the result would be to have overdrawn the unaligned clip
box mask twice.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'src/cairo-traps-compositor.c')
-rw-r--r-- | src/cairo-traps-compositor.c | 59 |
1 files changed, 37 insertions, 22 deletions
diff --git a/src/cairo-traps-compositor.c b/src/cairo-traps-compositor.c index b1ade5caf..371393cb9 100644 --- a/src/cairo-traps-compositor.c +++ b/src/cairo-traps-compositor.c @@ -316,6 +316,32 @@ traps_get_clip_surface (const cairo_traps_compositor_t *compositor, return surface; } +static void blt_unaligned_boxes(const cairo_traps_compositor_t *compositor, + cairo_surface_t *surface, + int dx, int dy, + cairo_box_t *boxes, + int num_boxes) +{ + struct blt_in info; + int i; + + info.compositor = compositor; + info.dst = surface; + _cairo_boxes_init (&info.boxes); + info.boxes.num_boxes = 1; + for (i = 0; i < num_boxes; i++) { + cairo_box_t *b = &boxes[i]; + + if (! _cairo_fixed_is_integer (b->p1.x) || + ! _cairo_fixed_is_integer (b->p1.y) || + ! _cairo_fixed_is_integer (b->p2.x) || + ! _cairo_fixed_is_integer (b->p2.y)) + { + do_unaligned_box(blt_in, &info, b, dx, dy); + } + } +} + static cairo_surface_t * create_composite_mask (const cairo_traps_compositor_t *compositor, cairo_surface_t *dst, @@ -326,9 +352,7 @@ create_composite_mask (const cairo_traps_compositor_t *compositor, { cairo_surface_t *surface, *src; cairo_int_status_t status; - struct blt_in info; int src_x, src_y; - int i; TRACE ((stderr, "%s\n", __FUNCTION__)); @@ -369,6 +393,8 @@ create_composite_mask (const cairo_traps_compositor_t *compositor, &clear); if (unlikely (status)) goto error; + + surface->is_clear = TRUE; } if (mask_func) { @@ -376,8 +402,10 @@ create_composite_mask (const cairo_traps_compositor_t *compositor, CAIRO_OPERATOR_SOURCE, src, src_x, src_y, extents->bounded.x, extents->bounded.y, &extents->bounded, extents->clip); - if (likely (status == CAIRO_INT_STATUS_SUCCESS)) + if (likely (status == CAIRO_INT_STATUS_SUCCESS)) { + surface->is_clear = FALSE; goto out; + } if (unlikely (status != CAIRO_INT_STATUS_UNSUPPORTED)) goto error; } @@ -390,24 +418,7 @@ create_composite_mask (const cairo_traps_compositor_t *compositor, if (unlikely (status)) goto error; - info.compositor = compositor; - info.dst = surface; - _cairo_boxes_init (&info.boxes); - info.boxes.num_boxes = 1; - for (i = 0; i < extents->clip->num_boxes; i++) { - cairo_box_t *b = &extents->clip->boxes[i]; - - if (! _cairo_fixed_is_integer (b->p1.x) || - ! _cairo_fixed_is_integer (b->p1.y) || - ! _cairo_fixed_is_integer (b->p2.x) || - ! _cairo_fixed_is_integer (b->p2.y)) - { - do_unaligned_box(blt_in, &info, b, - extents->bounded.x, - extents->bounded.y); - } - } - + surface->is_clear = FALSE; if (extents->clip->path != NULL) { status = combine_clip_as_traps (compositor, surface, extents->clip, &extents->bounded); @@ -418,12 +429,16 @@ create_composite_mask (const cairo_traps_compositor_t *compositor, } if (unlikely (status)) goto error; + } else if (extents->clip->boxes) { + blt_unaligned_boxes(compositor, surface, + extents->bounded.x, extents->bounded.y, + extents->clip->boxes, extents->clip->num_boxes); + } out: compositor->release (surface); cairo_surface_destroy (src); - surface->is_clear = FALSE; return surface; error: |