diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2009-09-04 08:55:19 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2009-09-04 08:55:19 +0100 |
commit | de99f841886de5cc6e5bc91f9d3e82076d838dee (patch) | |
tree | 73e6a496d72ddac7b16ab786761ce818cca513c3 | |
parent | 0ffca06d7feec6fdc56c47a378fcc37c1951a00a (diff) |
[fallback] Only eliminate the clip if the operation is bounded
For unbounded operations we still need to pass along the clip in order to
correctly limit the extents of the operation.
-rw-r--r-- | src/cairo-surface-fallback.c | 57 |
1 files changed, 42 insertions, 15 deletions
diff --git a/src/cairo-surface-fallback.c b/src/cairo-surface-fallback.c index 79d719dc..35befa53 100644 --- a/src/cairo-surface-fallback.c +++ b/src/cairo-surface-fallback.c @@ -907,9 +907,10 @@ _clip_contains_rectangle (cairo_clip_t *clip, return TRUE; } -static cairo_status_t +static inline cairo_status_t _clip_to_boxes (cairo_clip_t **clip, const cairo_rectangle_int_t *extents, + cairo_bool_t is_bounded, cairo_box_t **boxes, int *num_boxes) { @@ -923,7 +924,8 @@ _clip_to_boxes (cairo_clip_t **clip, status = _cairo_clip_get_boxes (*clip, boxes, num_boxes); switch ((int) status) { case CAIRO_STATUS_SUCCESS: - *clip = NULL; + if (is_bounded) + *clip = NULL; goto DONE; case CAIRO_INT_STATUS_UNSUPPORTED: @@ -955,15 +957,18 @@ _cairo_surface_fallback_paint (cairo_surface_t *surface, is_bounded = _cairo_surface_get_extents (surface, &extents); assert (is_bounded || clip); + is_bounded = FALSE; if (_cairo_operator_bounded_by_source (op)) { cairo_rectangle_int_t source_extents; _cairo_pattern_get_extents (source, &source_extents); if (! _cairo_rectangle_intersect (&extents, &source_extents)) return CAIRO_STATUS_SUCCESS; + + is_bounded = TRUE; } - if (clip != NULL && _clip_contains_rectangle (clip, &extents)) + if (is_bounded && clip != NULL && _clip_contains_rectangle (clip, &extents)) clip = NULL; status = _rectangle_intersect_clip (&extents, clip); @@ -973,7 +978,7 @@ _cairo_surface_fallback_paint (cairo_surface_t *surface, return status; } - status = _clip_to_boxes (&clip, &extents, &boxes, &num_boxes); + status = _clip_to_boxes (&clip, &extents, is_bounded, &boxes, &num_boxes); if (unlikely (status)) { if (status == CAIRO_INT_STATUS_NOTHING_TO_DO) status = CAIRO_STATUS_SUCCESS; @@ -1057,12 +1062,15 @@ _cairo_surface_fallback_mask (cairo_surface_t *surface, is_bounded = _cairo_surface_get_extents (surface, &extents); assert (is_bounded || clip); + is_bounded = FALSE; if (_cairo_operator_bounded_by_source (op)) { cairo_rectangle_int_t source_extents; _cairo_pattern_get_extents (source, &source_extents); if (! _cairo_rectangle_intersect (&extents, &source_extents)) return CAIRO_STATUS_SUCCESS; + + is_bounded = TRUE; } if (_cairo_operator_bounded_by_mask (op)) { @@ -1071,9 +1079,11 @@ _cairo_surface_fallback_mask (cairo_surface_t *surface, _cairo_pattern_get_extents (mask, &mask_extents); if (! _cairo_rectangle_intersect (&extents, &mask_extents)) return CAIRO_STATUS_SUCCESS; + + is_bounded = TRUE; } - if (clip != NULL && _clip_contains_rectangle (clip, &extents)) + if (is_bounded && clip != NULL && _clip_contains_rectangle (clip, &extents)) clip = NULL; status = _rectangle_intersect_clip (&extents, clip); @@ -1112,12 +1122,15 @@ _cairo_surface_fallback_stroke (cairo_surface_t *surface, is_bounded = _cairo_surface_get_extents (surface, &extents); assert (is_bounded || clip); + is_bounded = FALSE; if (_cairo_operator_bounded_by_source (op)) { cairo_rectangle_int_t source_extents; _cairo_pattern_get_extents (source, &source_extents); if (! _cairo_rectangle_intersect (&extents, &source_extents)) return CAIRO_STATUS_SUCCESS; + + is_bounded = TRUE; } if (_cairo_operator_bounded_by_mask (op)) { @@ -1128,9 +1141,11 @@ _cairo_surface_fallback_stroke (cairo_surface_t *surface, &path_extents); if (! _cairo_rectangle_intersect (&extents, &path_extents)) return CAIRO_STATUS_SUCCESS; + + is_bounded = TRUE; } - if (clip != NULL && _clip_contains_rectangle (clip, &extents)) + if (is_bounded && clip != NULL && _clip_contains_rectangle (clip, &extents)) clip = NULL; status = _rectangle_intersect_clip (&extents, clip); @@ -1140,7 +1155,7 @@ _cairo_surface_fallback_stroke (cairo_surface_t *surface, return status; } - status = _clip_to_boxes (&clip, &extents, &boxes, &num_boxes); + status = _clip_to_boxes (&clip, &extents, is_bounded, &boxes, &num_boxes); if (unlikely (status)) { if (status == CAIRO_INT_STATUS_NOTHING_TO_DO) status = CAIRO_STATUS_SUCCESS; @@ -1239,12 +1254,15 @@ _cairo_surface_fallback_fill (cairo_surface_t *surface, is_bounded = _cairo_surface_get_extents (surface, &extents); assert (is_bounded || clip); + is_bounded = FALSE; if (_cairo_operator_bounded_by_source (op)) { cairo_rectangle_int_t source_extents; _cairo_pattern_get_extents (source, &source_extents); if (! _cairo_rectangle_intersect (&extents, &source_extents)) return CAIRO_STATUS_SUCCESS; + + is_bounded = TRUE; } if (_cairo_operator_bounded_by_mask (op)) { @@ -1253,15 +1271,19 @@ _cairo_surface_fallback_fill (cairo_surface_t *surface, _cairo_path_fixed_approximate_fill_extents (path, &path_extents); if (! _cairo_rectangle_intersect (&extents, &path_extents)) return CAIRO_STATUS_SUCCESS; + + is_bounded = TRUE; } - if (clip != NULL && _clip_contains_rectangle (clip, &extents)) - clip = NULL; + if (is_bounded) { + if (clip != NULL && _clip_contains_rectangle (clip, &extents)) + clip = NULL; - if (clip != NULL && clip->path->prev == NULL && - _cairo_path_fixed_equal (&clip->path->path, path)) - { - clip = NULL; + if (clip != NULL && clip->path->prev == NULL && + _cairo_path_fixed_equal (&clip->path->path, path)) + { + clip = NULL; + } } status = _rectangle_intersect_clip (&extents, clip); @@ -1271,7 +1293,7 @@ _cairo_surface_fallback_fill (cairo_surface_t *surface, return status; } - status = _clip_to_boxes (&clip, &extents, &boxes, &num_boxes); + status = _clip_to_boxes (&clip, &extents, is_bounded, &boxes, &num_boxes); if (unlikely (status)) { if (status == CAIRO_INT_STATUS_NOTHING_TO_DO) status = CAIRO_STATUS_SUCCESS; @@ -1433,12 +1455,15 @@ _cairo_surface_fallback_show_glyphs (cairo_surface_t *surface, is_bounded = _cairo_surface_get_extents (surface, &extents); assert (is_bounded || clip); + is_bounded = FALSE; if (_cairo_operator_bounded_by_source (op)) { cairo_rectangle_int_t source_extents; _cairo_pattern_get_extents (source, &source_extents); if (! _cairo_rectangle_intersect (&extents, &source_extents)) return CAIRO_STATUS_SUCCESS; + + is_bounded = TRUE; } if (_cairo_operator_bounded_by_mask (op)) { @@ -1454,9 +1479,11 @@ _cairo_surface_fallback_show_glyphs (cairo_surface_t *surface, if (! _cairo_rectangle_intersect (&extents, &glyph_extents)) return CAIRO_STATUS_SUCCESS; + + is_bounded = TRUE; } - if (clip != NULL && _clip_contains_rectangle (clip, &extents)) + if (is_bounded && clip != NULL && _clip_contains_rectangle (clip, &extents)) clip = NULL; status = _rectangle_intersect_clip (&extents, clip); |