From 080f81bf5c360398a9376cf75ed245603483236b Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Sun, 24 Jul 2011 13:05:55 +0100 Subject: [PATCH] image: Fix clip-intersect Explicitly convert the clearing of the unbounded area. Signed-off-by: Chris Wilson --- src/cairo-image-surface.c | 19 ++++++++++++------- src/cairoint.h | 8 ++++++++ 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/cairo-image-surface.c b/src/cairo-image-surface.c index e2e0e18c7..c14aac064 100644 --- a/src/cairo-image-surface.c +++ b/src/cairo-image-surface.c @@ -3671,17 +3671,22 @@ _clip_and_composite_polygon (cairo_image_surface_t *dst, { cairo_status_t status; - if (polygon->num_edges == 0) { - cairo_traps_t traps; + if (_cairo_polygon_is_empty (polygon)) { + cairo_boxes_t boxes; if (extents->is_bounded) return CAIRO_STATUS_SUCCESS; - _cairo_traps_init (&traps); - status = _clip_and_composite_trapezoids (dst, op, src, - &traps, antialias, - extents); - _cairo_traps_fini (&traps); + status = _cairo_clip_to_boxes (extents->clip, &boxes); + if (likely (status == CAIRO_STATUS_SUCCESS)) { + extents->is_bounded = _cairo_operator_bounded_by_either (op); + extents->mask = extents->bounded = extents->unbounded; + status = _clip_and_composite_boxes (dst, + CAIRO_OPERATOR_CLEAR, + &_cairo_pattern_clear.base, + &boxes, extents); + _cairo_boxes_fini (&boxes); + } return status; } diff --git a/src/cairoint.h b/src/cairoint.h index 5503a07e2..b3ee61eb1 100644 --- a/src/cairoint.h +++ b/src/cairoint.h @@ -2070,6 +2070,14 @@ cairo_private cairo_status_t _cairo_polygon_intersect (cairo_polygon_t *a, int winding_a, cairo_polygon_t *b, int winding_b); +static inline cairo_bool_t +_cairo_polygon_is_empty (const cairo_polygon_t *polygon) +{ + return + polygon->num_edges == 0 || + polygon->extents.p2.x <= polygon->extents.p1.x; +} + #define _cairo_polygon_status(P) ((cairo_polygon_t *) (P))->status /* cairo-spline.c */