summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2013-05-30 19:47:19 +0200
committerChris Wilson <chris@chris-wilson.co.uk>2013-09-05 16:08:19 +0100
commitdb7e551a6bf06a0aa7e2e6b3744b7663807d003f (patch)
treeb7425b485dfc9563bb4fcaf02e8a354511ffcc2f
parentfb57ea13e04d82866cbc8e86c83261148bb3e231 (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.c15
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);