summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-09-10 15:03:47 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2012-09-10 15:09:15 +0100
commitdf6780442feba5c0c9404353177f24913b58bd32 (patch)
treef1c481ce7929c7d54311a6e8fd31ddc0e6eb2426 /src
parentf864e2d70f53a1feeee5e32bf9724b1e544025a6 (diff)
downloadcairo-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.h29
-rw-r--r--src/cairo-default-context.c44
-rw-r--r--src/cairo-gstate-private.h10
-rw-r--r--src/cairo-gstate.c7
-rw-r--r--src/skia/cairo-skia-context.cpp4
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,