summaryrefslogtreecommitdiff
path: root/src/cairo-surface-wrapper.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2009-08-17 10:31:47 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2009-08-29 17:07:33 +0100
commitce6a2cc5d2cb8a299759d764de2e7d2b6b655cb4 (patch)
treeb58bdcf89009a485898d248de68adf69e6fbae51 /src/cairo-surface-wrapper.c
parent6ff711b6305a9cf65e584d92258a6fa4e78c31ef (diff)
downloadcairo-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.c60
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,