summaryrefslogtreecommitdiff
path: root/src/cairo-traps-compositor.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2011-09-14 12:44:27 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2011-09-14 12:45:59 +0100
commit7cf7ee5e299bf03f1efd100739545f66a4acc24b (patch)
treee7cd1083f0f72e3cbb1498bd726e686b8e6f5932 /src/cairo-traps-compositor.c
parentdc2ed6dca26ca97372d2d44b953a983907650168 (diff)
downloadcairo-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.c23
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;