diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2009-08-17 10:31:47 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2009-08-29 17:07:33 +0100 |
commit | ce6a2cc5d2cb8a299759d764de2e7d2b6b655cb4 (patch) | |
tree | b58bdcf89009a485898d248de68adf69e6fbae51 /src/cairo-surface-wrapper.c | |
parent | 6ff711b6305a9cf65e584d92258a6fa4e78c31ef (diff) | |
download | cairo-ce6a2cc5d2cb8a299759d764de2e7d2b6b655cb4.tar.gz |
[wrapper] Always copy clip
We always need to make a local copy of the clip as the backends are free
to modify it as they process the operation.
Diffstat (limited to 'src/cairo-surface-wrapper.c')
-rw-r--r-- | src/cairo-surface-wrapper.c | 60 |
1 files changed, 44 insertions, 16 deletions
diff --git a/src/cairo-surface-wrapper.c b/src/cairo-surface-wrapper.c index 0d1dc5156..413ad3ec3 100644 --- a/src/cairo-surface-wrapper.c +++ b/src/cairo-surface-wrapper.c @@ -88,14 +88,18 @@ _cairo_surface_wrapper_paint (cairo_surface_wrapper_t *wrapper, if (clip && clip->all_clipped) return CAIRO_STATUS_SUCCESS; - if (clip != NULL && - _cairo_surface_wrapper_needs_device_transform (wrapper, - &device_transform)) - { - status = _cairo_clip_init_copy_transformed (&clip_copy, clip, - &device_transform); - if (unlikely (status)) - goto FINISH; + if (clip != NULL) { + if (_cairo_surface_wrapper_needs_device_transform (wrapper, + &device_transform)) + { + status = _cairo_clip_init_copy_transformed (&clip_copy, clip, + &device_transform); + if (unlikely (status)) + goto FINISH; + + } else { + _cairo_clip_init_copy (&clip_copy, clip); + } dev_clip = &clip_copy; } @@ -125,14 +129,18 @@ _cairo_surface_wrapper_mask (cairo_surface_wrapper_t *wrapper, if (clip && clip->all_clipped) return CAIRO_STATUS_SUCCESS; - if (clip != NULL && - _cairo_surface_wrapper_needs_device_transform (wrapper, - &device_transform)) - { - status = _cairo_clip_init_copy_transformed (&clip_copy, clip, - &device_transform); - if (unlikely (status)) - goto FINISH; + if (clip != NULL) { + if (_cairo_surface_wrapper_needs_device_transform (wrapper, + &device_transform)) + { + status = _cairo_clip_init_copy_transformed (&clip_copy, clip, + &device_transform); + if (unlikely (status)) + goto FINISH; + + } else { + _cairo_clip_init_copy (&clip_copy, clip); + } dev_clip = &clip_copy; } @@ -195,6 +203,11 @@ _cairo_surface_wrapper_stroke (cairo_surface_wrapper_t *wrapper, cairo_matrix_multiply (&dev_ctm_inverse, &device_transform, &dev_ctm_inverse); + } else { + if (clip != NULL) { + dev_clip = &clip_copy; + _cairo_clip_init_copy (&clip_copy, clip); + } } status = _cairo_surface_stroke (wrapper->target, op, source, @@ -266,6 +279,11 @@ _cairo_surface_wrapper_fill_stroke (cairo_surface_wrapper_t *wrapper, cairo_matrix_multiply (&dev_ctm_inverse, &device_transform, &dev_ctm_inverse); + } else { + if (clip != NULL) { + dev_clip = &clip_copy; + _cairo_clip_init_copy (&clip_copy, clip); + } } status = _cairo_surface_fill_stroke (wrapper->target, @@ -325,6 +343,11 @@ _cairo_surface_wrapper_fill (cairo_surface_wrapper_t *wrapper, dev_clip = &clip_copy; } + } else { + if (clip != NULL) { + dev_clip = &clip_copy; + _cairo_clip_init_copy (&clip_copy, clip); + } } status = _cairo_surface_fill (wrapper->target, op, source, @@ -393,6 +416,11 @@ _cairo_surface_wrapper_show_text_glyphs (cairo_surface_wrapper_t *wrapper, &dev_glyphs[i].x, &dev_glyphs[i].y); } + } else { + if (clip != NULL) { + dev_clip = &clip_copy; + _cairo_clip_init_copy (&clip_copy, clip); + } } status = _cairo_surface_show_text_glyphs (wrapper->target, op, source, |