diff --git a/src/cairo-default-context.c b/src/cairo-default-context.c index dc8c359a9..c020fcb1f 100644 --- a/src/cairo-default-context.c +++ b/src/cairo-default-context.c @@ -748,7 +748,7 @@ _cairo_default_context_rel_move_to (void *abstract_cr, double dx, double dy) cairo_default_context_t *cr = abstract_cr; cairo_fixed_t dx_fixed, dy_fixed; - _cairo_gstate_user_to_device_distance (cr->gstate, &dx, &dy); + _cairo_gstate_user_to_backend_distance (cr->gstate, &dx, &dy); dx_fixed = _cairo_fixed_from_double (dx); dy_fixed = _cairo_fixed_from_double (dy); @@ -762,7 +762,7 @@ _cairo_default_context_rel_line_to (void *abstract_cr, double dx, double dy) cairo_default_context_t *cr = abstract_cr; cairo_fixed_t dx_fixed, dy_fixed; - _cairo_gstate_user_to_device_distance (cr->gstate, &dx, &dy); + _cairo_gstate_user_to_backend_distance (cr->gstate, &dx, &dy); dx_fixed = _cairo_fixed_from_double (dx); dy_fixed = _cairo_fixed_from_double (dy); @@ -782,9 +782,9 @@ _cairo_default_context_rel_curve_to (void *abstract_cr, cairo_fixed_t dx2_fixed, dy2_fixed; cairo_fixed_t dx3_fixed, dy3_fixed; - _cairo_gstate_user_to_device_distance (cr->gstate, &dx1, &dy1); - _cairo_gstate_user_to_device_distance (cr->gstate, &dx2, &dy2); - _cairo_gstate_user_to_device_distance (cr->gstate, &dx3, &dy3); + _cairo_gstate_user_to_backend_distance (cr->gstate, &dx1, &dy1); + _cairo_gstate_user_to_backend_distance (cr->gstate, &dx2, &dy2); + _cairo_gstate_user_to_backend_distance (cr->gstate, &dx3, &dy3); dx1_fixed = _cairo_fixed_from_double (dx1); dy1_fixed = _cairo_fixed_from_double (dy1); diff --git a/src/cairo-gstate-private.h b/src/cairo-gstate-private.h index 38f11c7ad..c95d94a25 100644 --- a/src/cairo-gstate-private.h +++ b/src/cairo-gstate-private.h @@ -208,6 +208,16 @@ _cairo_gstate_user_to_backend (cairo_gstate_t *gstate, double *x, double *y) _do_cairo_gstate_user_to_backend (gstate, x, y); } +cairo_private void +_do_cairo_gstate_user_to_backend_distance (cairo_gstate_t *gstate, double *x, double *y); + +static inline void +_cairo_gstate_user_to_backend_distance (cairo_gstate_t *gstate, double *x, double *y) +{ + if (! gstate->is_identity) + _do_cairo_gstate_user_to_backend_distance (gstate, x, y); +} + cairo_private void _do_cairo_gstate_backend_to_user (cairo_gstate_t *gstate, double *x, double *y); diff --git a/src/cairo-gstate.c b/src/cairo-gstate.c index 15dc46f6b..d62f0a405 100644 --- a/src/cairo-gstate.c +++ b/src/cairo-gstate.c @@ -813,6 +813,13 @@ _do_cairo_gstate_user_to_backend (cairo_gstate_t *gstate, double *x, double *y) cairo_matrix_transform_point (&gstate->target->device_transform, x, y); } +void +_do_cairo_gstate_user_to_backend_distance (cairo_gstate_t *gstate, double *x, double *y) +{ + cairo_matrix_transform_distance (&gstate->ctm, x, y); + cairo_matrix_transform_distance (&gstate->target->device_transform, x, y); +} + void _do_cairo_gstate_backend_to_user (cairo_gstate_t *gstate, double *x, double *y) {