mirror of
https://gitlab.freedesktop.org/cairo/cairo.git
synced 2026-05-05 04:08:13 +02:00
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:
parent
dc2ed6dca2
commit
7cf7ee5e29
1 changed files with 14 additions and 9 deletions
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue