diff options
author | Alexander Larsson <alexl@redhat.com> | 2013-05-30 19:47:19 +0200 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2013-09-05 16:08:19 +0100 |
commit | db7e551a6bf06a0aa7e2e6b3744b7663807d003f (patch) | |
tree | b7425b485dfc9563bb4fcaf02e8a354511ffcc2f | |
parent | fb57ea13e04d82866cbc8e86c83261148bb3e231 (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 b8caa63f1..56e961e66 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); |