diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2011-09-14 12:44:27 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2011-09-14 12:45:59 +0100 |
commit | 7cf7ee5e299bf03f1efd100739545f66a4acc24b (patch) | |
tree | e7cd1083f0f72e3cbb1498bd726e686b8e6f5932 /src/cairo-traps-compositor.c | |
parent | dc2ed6dca26ca97372d2d44b953a983907650168 (diff) | |
download | cairo-7cf7ee5e299bf03f1efd100739545f66a4acc24b.tar.gz |
traps: Skip compositing an empty bounded regions
Fixes the cairo-xlib crash with tighten-bounds. (I thought I had fixed
it earlier, but I was obviously wrong.)
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 | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/src/cairo-traps-compositor.c b/src/cairo-traps-compositor.c index 5b22fd746..c84fa5f82 100644 --- a/src/cairo-traps-compositor.c +++ b/src/cairo-traps-compositor.c @@ -760,7 +760,7 @@ clip_and_composite (const cairo_traps_compositor_t *compositor, cairo_surface_t *src; int src_x, src_y; cairo_region_t *clip_region = NULL; - cairo_status_t status; + cairo_status_t status = CAIRO_STATUS_SUCCESS; if (reduce_alpha_op (extents)) { op = CAIRO_OPERATOR_ADD; @@ -772,13 +772,6 @@ clip_and_composite (const cairo_traps_compositor_t *compositor, source = NULL; } - src = compositor->pattern_to_surface (dst, source, FALSE, - &extents->bounded, - &extents->source_sample_area, - &src_x, &src_y); - if (unlikely (src->status)) - return src->status; - compositor->acquire (dst); if (need_clip & NEED_CLIP_REGION) { @@ -804,6 +797,16 @@ clip_and_composite (const cairo_traps_compositor_t *compositor, } } + if (extents->bounded.width == 0 || extents->bounded.height == 0) + goto skip; + + src = compositor->pattern_to_surface (dst, source, FALSE, + &extents->bounded, + &extents->source_sample_area, + &src_x, &src_y); + if (unlikely (status = src->status)) + goto error; + if (op == CAIRO_OPERATOR_SOURCE) { status = clip_and_composite_source (compositor, dst, draw_func, mask_func, draw_closure, @@ -830,7 +833,9 @@ clip_and_composite (const cairo_traps_compositor_t *compositor, extents->clip); } } + cairo_surface_destroy (src); +skip: if (status == CAIRO_STATUS_SUCCESS && ! extents->is_bounded) { if (need_clip & NEED_CLIP_SURFACE) status = fixup_unbounded_with_mask (compositor, extents); @@ -838,10 +843,10 @@ clip_and_composite (const cairo_traps_compositor_t *compositor, status = fixup_unbounded (compositor, extents, NULL); } +error: if (clip_region) compositor->set_clip_region (dst, NULL); - cairo_surface_destroy (src); compositor->release (dst); return status; |