diff options
author | Alexander Larsson <alexl@redhat.com> | 2013-05-30 19:47:19 +0200 |
---|---|---|
committer | Alexander Larsson <alexl@redhat.com> | 2013-06-03 15:40:50 +0200 |
commit | 60eca0363114414268c2822f73cac6b969d62594 (patch) | |
tree | 644864779b7a53d9d74f35b390c1e59473384029 | |
parent | 41bef0fc385381b8c6b9091ec7ca2abe04cfc147 (diff) |
gstate: Respect device transform in stroke
We need to apply the device transform to the ctm when stroking, as
otherwise line widths are not affected by the device scale.
-rw-r--r-- | src/cairo-gstate.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/src/cairo-gstate.c b/src/cairo-gstate.c index 6319471a..9ca39648 100644 --- a/src/cairo-gstate.c +++ b/src/cairo-gstate.c @@ -1155,6 +1155,8 @@ _cairo_gstate_stroke (cairo_gstate_t *gstate, cairo_path_fixed_t *path) cairo_stroke_style_t style; double dash[2]; cairo_status_t status; + cairo_matrix_t aggregate_transform; + cairo_matrix_t aggregate_transform_inverse; status = _cairo_gstate_get_pattern_status (gstate->source); if (unlikely (status)) @@ -1171,8 +1173,15 @@ _cairo_gstate_stroke (cairo_gstate_t *gstate, cairo_path_fixed_t *path) assert (gstate->opacity == 1.0); + cairo_matrix_multiply (&aggregate_transform, + &gstate->ctm, + &gstate->target->device_transform); + cairo_matrix_multiply (&aggregate_transform_inverse, + &gstate->target->device_transform_inverse, + &gstate->ctm_inverse); + memcpy (&style, &gstate->stroke_style, sizeof (gstate->stroke_style)); - if (_cairo_stroke_style_dash_can_approximate (&gstate->stroke_style, &gstate->ctm, gstate->tolerance)) { + if (_cairo_stroke_style_dash_can_approximate (&gstate->stroke_style, &aggregate_transform, gstate->tolerance)) { style.dash = dash; _cairo_stroke_style_dash_approximate (&gstate->stroke_style, &gstate->ctm, gstate->tolerance, &style.dash_offset, @@ -1187,8 +1196,8 @@ _cairo_gstate_stroke (cairo_gstate_t *gstate, cairo_path_fixed_t *path) &source_pattern.base, path, &style, - &gstate->ctm, - &gstate->ctm_inverse, + &aggregate_transform, + &aggregate_transform_inverse, gstate->tolerance, gstate->antialias, gstate->clip); |