summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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 1dd5ea08..cd626b81 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 c020fcb1..3d828efc 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 c95d94a2..b2ccc76d 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 d62f0a40..c90f2f63 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 a08b3fb1..bbe5507f 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,