diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2012-09-10 15:03:47 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2012-09-10 15:09:15 +0100 |
commit | df6780442feba5c0c9404353177f24913b58bd32 (patch) | |
tree | f1c481ce7929c7d54311a6e8fd31ddc0e6eb2426 /src | |
parent | f864e2d70f53a1feeee5e32bf9724b1e544025a6 (diff) | |
download | cairo-df6780442feba5c0c9404353177f24913b58bd32.tar.gz |
context: Add missing functions to transform between user and backend coordinates
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'src')
-rw-r--r-- | src/cairo-backend-private.h | 29 | ||||
-rw-r--r-- | src/cairo-default-context.c | 44 | ||||
-rw-r--r-- | src/cairo-gstate-private.h | 10 | ||||
-rw-r--r-- | src/cairo-gstate.c | 7 | ||||
-rw-r--r-- | src/skia/cairo-skia-context.cpp | 4 |
5 files changed, 94 insertions, 0 deletions
diff --git a/src/cairo-backend-private.h b/src/cairo-backend-private.h index 1dd5ea083..cd626b81b 100644 --- a/src/cairo-backend-private.h +++ b/src/cairo-backend-private.h @@ -96,6 +96,11 @@ struct _cairo_backend { void (*device_to_user) (void *cr, double *x, double *y); void (*device_to_user_distance) (void *cr, double *x, double *y); + void (*user_to_backend) (void *cr, double *x, double *y); + void (*user_to_backend_distance) (void *cr, double *x, double *y); + void (*backend_to_user) (void *cr, double *x, double *y); + void (*backend_to_user_distance) (void *cr, double *x, double *y); + cairo_status_t (*new_path) (void *cr); cairo_status_t (*new_sub_path) (void *cr); cairo_status_t (*move_to) (void *cr, double x, double y); @@ -168,4 +173,28 @@ struct _cairo_backend { cairo_status_t (*show_page) (void *cr); }; +static inline void +_cairo_backend_to_user (cairo_t *cr, double *x, double *y) +{ + cr->backend->backend_to_user (cr, x, y); +} + +static inline void +_cairo_backend_to_user_distance (cairo_t *cr, double *x, double *y) +{ + cr->backend->backend_to_user_distance (cr, x, y); +} + +static inline void +_cairo_user_to_backend (cairo_t *cr, double *x, double *y) +{ + cr->backend->user_to_backend (cr, x, y); +} + +static inline void +_cairo_user_to_backend_distance (cairo_t *cr, double *x, double *y) +{ + cr->backend->user_to_backend_distance (cr, x, y); +} + #endif /* CAIRO_BACKEND_PRIVATE_H */ diff --git a/src/cairo-default-context.c b/src/cairo-default-context.c index c020fcb1f..3d828efc7 100644 --- a/src/cairo-default-context.c +++ b/src/cairo-default-context.c @@ -621,6 +621,44 @@ _cairo_default_context_device_to_user_distance (void *abstract_cr, _cairo_gstate_device_to_user_distance (cr->gstate, dx, dy); } +static void +_cairo_default_context_backend_to_user (void *abstract_cr, + double *x, + double *y) +{ + cairo_default_context_t *cr = abstract_cr; + + _cairo_gstate_backend_to_user (cr->gstate, x, y); +} + +static void +_cairo_default_context_backend_to_user_distance (void *abstract_cr, double *dx, double *dy) +{ + cairo_default_context_t *cr = abstract_cr; + + _cairo_gstate_backend_to_user_distance (cr->gstate, dx, dy); +} + +static void +_cairo_default_context_user_to_backend (void *abstract_cr, + double *x, + double *y) +{ + cairo_default_context_t *cr = abstract_cr; + + _cairo_gstate_user_to_backend (cr->gstate, x, y); +} + +static void +_cairo_default_context_user_to_backend_distance (void *abstract_cr, + double *dx, + double *dy) +{ + cairo_default_context_t *cr = abstract_cr; + + _cairo_gstate_user_to_backend_distance (cr->gstate, dx, dy); +} + /* Path constructor */ static cairo_status_t @@ -1321,11 +1359,17 @@ static const cairo_backend_t _cairo_default_context_backend = { _cairo_default_context_set_matrix, _cairo_default_context_set_identity_matrix, _cairo_default_context_get_matrix, + _cairo_default_context_user_to_device, _cairo_default_context_user_to_device_distance, _cairo_default_context_device_to_user, _cairo_default_context_device_to_user_distance, + _cairo_default_context_user_to_backend, + _cairo_default_context_user_to_backend_distance, + _cairo_default_context_backend_to_user, + _cairo_default_context_backend_to_user_distance, + _cairo_default_context_new_path, _cairo_default_context_new_sub_path, _cairo_default_context_move_to, diff --git a/src/cairo-gstate-private.h b/src/cairo-gstate-private.h index c95d94a25..b2ccc76d1 100644 --- a/src/cairo-gstate-private.h +++ b/src/cairo-gstate-private.h @@ -229,6 +229,16 @@ _cairo_gstate_backend_to_user (cairo_gstate_t *gstate, double *x, double *y) } cairo_private void +_do_cairo_gstate_backend_to_user_distance (cairo_gstate_t *gstate, double *x, double *y); + +static inline void +_cairo_gstate_backend_to_user_distance (cairo_gstate_t *gstate, double *x, double *y) +{ + if (! gstate->is_identity) + _do_cairo_gstate_backend_to_user_distance (gstate, x, y); +} + +cairo_private void _cairo_gstate_backend_to_user_rectangle (cairo_gstate_t *gstate, double *x1, double *y1, double *x2, double *y2, diff --git a/src/cairo-gstate.c b/src/cairo-gstate.c index d62f0a405..c90f2f634 100644 --- a/src/cairo-gstate.c +++ b/src/cairo-gstate.c @@ -828,6 +828,13 @@ _do_cairo_gstate_backend_to_user (cairo_gstate_t *gstate, double *x, double *y) } void +_do_cairo_gstate_backend_to_user_distance (cairo_gstate_t *gstate, double *x, double *y) +{ + cairo_matrix_transform_distance (&gstate->target->device_transform_inverse, x, y); + cairo_matrix_transform_distance (&gstate->ctm_inverse, x, y); +} + +void _cairo_gstate_backend_to_user_rectangle (cairo_gstate_t *gstate, double *x1, double *y1, double *x2, double *y2, diff --git a/src/skia/cairo-skia-context.cpp b/src/skia/cairo-skia-context.cpp index a08b3fb13..bbe5507f6 100644 --- a/src/skia/cairo-skia-context.cpp +++ b/src/skia/cairo-skia-context.cpp @@ -1635,6 +1635,10 @@ static const cairo_backend_t _cairo_skia_context_backend = { _cairo_skia_context_user_to_device_distance, _cairo_skia_context_device_to_user, _cairo_skia_context_device_to_user_distance, + _cairo_skia_context_user_to_device, /* XXX backend */ + _cairo_skia_context_user_to_device_distance, /* XXX backend */ + _cairo_skia_context_device_to_user, /* XXX backend */ + _cairo_skia_context_device_to_user_distance, /* XXX backend */ _cairo_skia_context_new_path, _cairo_skia_context_new_sub_path, |