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>
This commit is contained in:
Chris Wilson 2011-09-14 12:44:27 +01:00
parent dc2ed6dca2
commit 7cf7ee5e29

View file

@ -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;