summaryrefslogtreecommitdiff
path: root/src/cairo-surface-wrapper.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2011-07-26 09:03:37 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2011-07-26 09:05:02 +0100
commit168b5a5348beb66977e5948c43a1e4855c24d95b (patch)
tree823c28bf9c2b30be3bb36743f3dc0d0e52f9d785 /src/cairo-surface-wrapper.c
parentc596483f854a14840ee591304ce08dee3f0edeee (diff)
downloadcairo-168b5a5348beb66977e5948c43a1e4855c24d95b.tar.gz
wrapper: target to recording needs the inverse transform
Gah, I thought about this and noted that I need the inverse of the normal transformation, yet failed to remember to actually use it. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'src/cairo-surface-wrapper.c')
-rw-r--r--src/cairo-surface-wrapper.c25
1 files changed, 23 insertions, 2 deletions
diff --git a/src/cairo-surface-wrapper.c b/src/cairo-surface-wrapper.c
index 2a3f4b3fd..d2fead83e 100644
--- a/src/cairo-surface-wrapper.c
+++ b/src/cairo-surface-wrapper.c
@@ -86,11 +86,32 @@ _cairo_surface_wrapper_get_transform (cairo_surface_wrapper_t *wrapper,
if (! _cairo_matrix_is_identity (&wrapper->transform))
cairo_matrix_multiply (m, &wrapper->transform, m);
-
if (! _cairo_matrix_is_identity (&wrapper->target->device_transform))
cairo_matrix_multiply (m, &wrapper->target->device_transform, m);
}
+static void
+_cairo_surface_wrapper_get_inverse_transform (cairo_surface_wrapper_t *wrapper,
+ cairo_matrix_t *m)
+{
+ cairo_matrix_init_identity (m);
+
+ if (! _cairo_matrix_is_identity (&wrapper->target->device_transform_inverse))
+ cairo_matrix_multiply (m, &wrapper->target->device_transform_inverse, m);
+
+ if (! _cairo_matrix_is_identity (&wrapper->transform)) {
+ cairo_matrix_t inv;
+ cairo_status_t status;
+
+ inv = wrapper->transform;
+ status = cairo_matrix_invert (&inv);
+ assert (status == CAIRO_STATUS_SUCCESS);
+ cairo_matrix_multiply (m, &inv, m);
+ }
+
+ if (wrapper->has_extents && (wrapper->extents.x || wrapper->extents.y))
+ cairo_matrix_translate (m, wrapper->extents.x, wrapper->extents.y);
+}
static cairo_clip_t *
_cairo_surface_wrapper_get_clip (cairo_surface_wrapper_t *wrapper,
@@ -586,7 +607,7 @@ _cairo_surface_wrapper_get_target_extents (cairo_surface_wrapper_t *wrapper,
cairo_matrix_t m;
double x1, y1, x2, y2;
- _cairo_surface_wrapper_get_transform (wrapper, &m);
+ _cairo_surface_wrapper_get_inverse_transform (wrapper, &m);
x1 = r->x;
y1 = r->y;