diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2011-07-14 21:19:54 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2011-07-19 21:14:34 +0100 |
commit | b132fae5e843c329d1414d1a65b2e8d66b99852f (patch) | |
tree | 7df5e21300eefe3abcc30616b22d7f5d3248b4d4 /src/cairo-surface-offset.c | |
parent | f58ade7bace8c82d0ea6740f56d227696181d616 (diff) | |
download | cairo-b132fae5e843c329d1414d1a65b2e8d66b99852f.tar.gz |
clip: Rudimentary support for clip-polygon extraction
Step 1, fix the failings sighted recently by tracking clip-boxes as an
explicit property of the clipping and of composition.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'src/cairo-surface-offset.c')
-rw-r--r-- | src/cairo-surface-offset.c | 102 |
1 files changed, 33 insertions, 69 deletions
diff --git a/src/cairo-surface-offset.c b/src/cairo-surface-offset.c index c36196e93..d2cc03032 100644 --- a/src/cairo-surface-offset.c +++ b/src/cairo-surface-offset.c @@ -59,29 +59,22 @@ _cairo_surface_offset_paint (cairo_surface_t *target, int x, int y, cairo_operator_t op, const cairo_pattern_t *source, - cairo_clip_t *clip) + const cairo_clip_t *clip) { cairo_status_t status; - cairo_clip_t clip_copy, *dev_clip = clip; + cairo_clip_t *dev_clip = (cairo_clip_t *) clip; cairo_pattern_union_t source_copy; if (unlikely (target->status)) return target->status; - if (clip && clip->all_clipped) + if (_cairo_clip_is_all_clipped (clip)) return CAIRO_STATUS_SUCCESS; if (x | y) { cairo_matrix_t m; - if (clip != NULL) { - cairo_matrix_init_translate (&m, -x, -y); - status = _cairo_clip_init_copy_transformed (&clip_copy, clip, &m); - if (unlikely (status)) - goto FINISH; - - dev_clip = &clip_copy; - } + dev_clip = _cairo_clip_copy_with_translation (clip, -x, -y); cairo_matrix_init_translate (&m, x, y); _copy_transformed_pattern (&source_copy.base, source, &m); @@ -90,9 +83,8 @@ _cairo_surface_offset_paint (cairo_surface_t *target, status = _cairo_surface_paint (target, op, source, dev_clip); - FINISH: if (dev_clip != clip) - _cairo_clip_reset (dev_clip); + _cairo_clip_destroy (dev_clip); return status; } @@ -103,30 +95,23 @@ _cairo_surface_offset_mask (cairo_surface_t *target, cairo_operator_t op, const cairo_pattern_t *source, const cairo_pattern_t *mask, - cairo_clip_t *clip) + const cairo_clip_t *clip) { cairo_status_t status; - cairo_clip_t clip_copy, *dev_clip = clip; + cairo_clip_t *dev_clip = (cairo_clip_t *) clip; cairo_pattern_union_t source_copy; cairo_pattern_union_t mask_copy; if (unlikely (target->status)) return target->status; - if (clip && clip->all_clipped) + if (_cairo_clip_is_all_clipped (clip)) return CAIRO_STATUS_SUCCESS; if (x | y) { cairo_matrix_t m; - if (clip != NULL) { - cairo_matrix_init_translate (&m, -x, -y); - status = _cairo_clip_init_copy_transformed (&clip_copy, clip, &m); - if (unlikely (status)) - goto FINISH; - - dev_clip = &clip_copy; - } + dev_clip = _cairo_clip_copy_with_translation (clip, -x, -y); cairo_matrix_init_translate (&m, x, y); _copy_transformed_pattern (&source_copy.base, source, &m); @@ -139,9 +124,8 @@ _cairo_surface_offset_mask (cairo_surface_t *target, source, mask, dev_clip); - FINISH: if (dev_clip != clip) - _cairo_clip_reset (dev_clip); + _cairo_clip_destroy (dev_clip); return status; } @@ -151,16 +135,16 @@ _cairo_surface_offset_stroke (cairo_surface_t *surface, int x, int y, cairo_operator_t op, const cairo_pattern_t *source, - cairo_path_fixed_t *path, + const cairo_path_fixed_t *path, const cairo_stroke_style_t*stroke_style, const cairo_matrix_t *ctm, const cairo_matrix_t *ctm_inverse, double tolerance, cairo_antialias_t antialias, - cairo_clip_t *clip) + const cairo_clip_t *clip) { - cairo_path_fixed_t path_copy, *dev_path = path; - cairo_clip_t clip_copy, *dev_clip = clip; + cairo_path_fixed_t path_copy, *dev_path = (cairo_path_fixed_t *) path; + cairo_clip_t *dev_clip = (cairo_clip_t *) clip; cairo_matrix_t dev_ctm = *ctm; cairo_matrix_t dev_ctm_inverse = *ctm_inverse; cairo_pattern_union_t source_copy; @@ -169,12 +153,14 @@ _cairo_surface_offset_stroke (cairo_surface_t *surface, if (unlikely (surface->status)) return surface->status; - if (clip && clip->all_clipped) + if (_cairo_clip_is_all_clipped (clip)) return CAIRO_STATUS_SUCCESS; if (x | y) { cairo_matrix_t m; + dev_clip = _cairo_clip_copy_with_translation (clip, -x, -y); + status = _cairo_path_fixed_init_copy (&path_copy, dev_path); if (unlikely (status)) goto FINISH; @@ -186,13 +172,6 @@ _cairo_surface_offset_stroke (cairo_surface_t *surface, cairo_matrix_init_translate (&m, -x, -y); cairo_matrix_multiply (&dev_ctm, &dev_ctm, &m); - if (clip != NULL) { - status = _cairo_clip_init_copy_transformed (&clip_copy, clip, &m); - if (unlikely (status)) - goto FINISH; - - dev_clip = &clip_copy; - } cairo_matrix_init_translate (&m, x, y); _copy_transformed_pattern (&source_copy.base, source, &m); @@ -206,11 +185,11 @@ _cairo_surface_offset_stroke (cairo_surface_t *surface, tolerance, antialias, dev_clip); - FINISH: +FINISH: if (dev_path != path) _cairo_path_fixed_fini (dev_path); if (dev_clip != clip) - _cairo_clip_reset (dev_clip); + _cairo_clip_destroy (dev_clip); return status; } @@ -220,26 +199,28 @@ _cairo_surface_offset_fill (cairo_surface_t *surface, int x, int y, cairo_operator_t op, const cairo_pattern_t*source, - cairo_path_fixed_t *path, + const cairo_path_fixed_t *path, cairo_fill_rule_t fill_rule, double tolerance, cairo_antialias_t antialias, - cairo_clip_t *clip) + const cairo_clip_t *clip) { cairo_status_t status; - cairo_path_fixed_t path_copy, *dev_path = path; - cairo_clip_t clip_copy, *dev_clip = clip; + cairo_path_fixed_t path_copy, *dev_path = (cairo_path_fixed_t *) path; + cairo_clip_t *dev_clip = (cairo_clip_t *) clip; cairo_pattern_union_t source_copy; if (unlikely (surface->status)) return surface->status; - if (clip && clip->all_clipped) + if (_cairo_clip_is_all_clipped (clip)) return CAIRO_STATUS_SUCCESS; if (x | y) { cairo_matrix_t m; + dev_clip = _cairo_clip_copy_with_translation (clip, -x, -y); + status = _cairo_path_fixed_init_copy (&path_copy, dev_path); if (unlikely (status)) goto FINISH; @@ -249,15 +230,6 @@ _cairo_surface_offset_fill (cairo_surface_t *surface, _cairo_fixed_from_int (-y)); dev_path = &path_copy; - if (clip != NULL) { - cairo_matrix_init_translate (&m, -x, -y); - status = _cairo_clip_init_copy_transformed (&clip_copy, clip, &m); - if (unlikely (status)) - goto FINISH; - - dev_clip = &clip_copy; - } - cairo_matrix_init_translate (&m, x, y); _copy_transformed_pattern (&source_copy.base, source, &m); source = &source_copy.base; @@ -268,11 +240,11 @@ _cairo_surface_offset_fill (cairo_surface_t *surface, tolerance, antialias, dev_clip); - FINISH: +FINISH: if (dev_path != path) _cairo_path_fixed_fini (dev_path); if (dev_clip != clip) - _cairo_clip_reset (dev_clip); + _cairo_clip_destroy (dev_clip); return status; } @@ -285,10 +257,10 @@ _cairo_surface_offset_glyphs (cairo_surface_t *surface, cairo_scaled_font_t *scaled_font, cairo_glyph_t *glyphs, int num_glyphs, - cairo_clip_t *clip) + const cairo_clip_t *clip) { cairo_status_t status; - cairo_clip_t clip_copy, *dev_clip = clip; + cairo_clip_t *dev_clip = (cairo_clip_t *) clip; cairo_pattern_union_t source_copy; cairo_glyph_t *dev_glyphs; int i; @@ -296,7 +268,7 @@ _cairo_surface_offset_glyphs (cairo_surface_t *surface, if (unlikely (surface->status)) return surface->status; - if (clip && clip->all_clipped) + if (_cairo_clip_is_all_clipped (clip)) return CAIRO_STATUS_SUCCESS; dev_glyphs = _cairo_malloc_ab (num_glyphs, sizeof (cairo_glyph_t)); @@ -308,14 +280,7 @@ _cairo_surface_offset_glyphs (cairo_surface_t *surface, if (x | y) { cairo_matrix_t m; - if (clip != NULL) { - cairo_matrix_init_translate (&m, -x, -y); - status = _cairo_clip_init_copy_transformed (&clip_copy, clip, &m); - if (unlikely (status)) - goto FINISH; - - dev_clip = &clip_copy; - } + dev_clip = _cairo_clip_copy_with_translation (clip, -x, -y); cairo_matrix_init_translate (&m, x, y); _copy_transformed_pattern (&source_copy.base, source, &m); @@ -334,9 +299,8 @@ _cairo_surface_offset_glyphs (cairo_surface_t *surface, scaled_font, dev_clip); - FINISH: if (dev_clip != clip) - _cairo_clip_reset (dev_clip); + _cairo_clip_destroy (dev_clip); free (dev_glyphs); return status; |