summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2013-06-03 20:32:45 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2013-09-05 16:08:19 +0100
commit38217d67fc2226778dde8d05817cb916691d4d22 (patch)
tree0ce1531b4b524b3587541fb93d6e0b0e7648f426
parentf0e2cd4494b1ac9a351d095fbeb53d702342d35c (diff)
spans,traps: Undo device transform from source matrix for recording replays
As the replay of the recording surface applies the device_transform of the matrix once again to all its operations, we end up with a repeated transform through the source matrix of the recording surface. We need to remove one of these, and the easiest way to do that appears to be to undo the application to the source matrix. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--src/cairo-spans-compositor.c13
-rw-r--r--src/cairo-traps-compositor.c15
2 files changed, 23 insertions, 5 deletions
diff --git a/src/cairo-spans-compositor.c b/src/cairo-spans-compositor.c
index 6eb9b42a9..1a46ea3a3 100644
--- a/src/cairo-spans-compositor.c
+++ b/src/cairo-spans-compositor.c
@@ -585,6 +585,8 @@ composite_aligned_boxes (const cairo_spans_compositor_t *compositor,
{
cairo_clip_t *recording_clip;
const cairo_pattern_t *source = &extents->source_pattern.base;
+ const cairo_matrix_t *m;
+ cairo_matrix_t matrix;
/* XXX could also do tiling repeat modes... */
@@ -600,10 +602,17 @@ composite_aligned_boxes (const cairo_spans_compositor_t *compositor,
dst->is_clear = TRUE;
}
+ m = &source->matrix;
+ if (_cairo_surface_has_device_transform (dst)) {
+ cairo_matrix_multiply (&matrix,
+ &source->matrix,
+ &dst->device_transform);
+ m = &matrix;
+ }
+
recording_clip = _cairo_clip_from_boxes (boxes);
status = _cairo_recording_surface_replay_with_clip (unwrap_source (source),
- &source->matrix,
- dst, recording_clip);
+ m, dst, recording_clip);
_cairo_clip_destroy (recording_clip);
return status;
diff --git a/src/cairo-traps-compositor.c b/src/cairo-traps-compositor.c
index 988d23c8d..631e172e7 100644
--- a/src/cairo-traps-compositor.c
+++ b/src/cairo-traps-compositor.c
@@ -1206,7 +1206,9 @@ composite_aligned_boxes (const cairo_traps_compositor_t *compositor,
&extents->source_sample_area))
{
cairo_clip_t *recording_clip;
- cairo_pattern_t *source = &extents->source_pattern.base;
+ const cairo_pattern_t *source = &extents->source_pattern.base;
+ const cairo_matrix_t *m;
+ cairo_matrix_t matrix;
/* XXX could also do tiling repeat modes... */
@@ -1225,10 +1227,17 @@ composite_aligned_boxes (const cairo_traps_compositor_t *compositor,
return status;
}
+ m = &source->matrix;
+ if (_cairo_surface_has_device_transform (dst)) {
+ cairo_matrix_multiply (&matrix,
+ &source->matrix,
+ &dst->device_transform);
+ m = &matrix;
+ }
+
recording_clip = _cairo_clip_from_boxes (boxes);
status = _cairo_recording_surface_replay_with_clip (recording_pattern_get_surface (source),
- &source->matrix,
- dst, recording_clip);
+ m, dst, recording_clip);
_cairo_clip_destroy (recording_clip);
return status;