diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2011-07-26 09:03:37 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2011-07-26 09:05:02 +0100 |
commit | 168b5a5348beb66977e5948c43a1e4855c24d95b (patch) | |
tree | 823c28bf9c2b30be3bb36743f3dc0d0e52f9d785 /src/cairo-surface-wrapper.c | |
parent | c596483f854a14840ee591304ce08dee3f0edeee (diff) | |
download | cairo-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.c | 25 |
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; |