summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2013-05-30 19:47:19 +0200
committerAlexander Larsson <alexl@redhat.com>2013-06-03 15:40:50 +0200
commit60eca0363114414268c2822f73cac6b969d62594 (patch)
tree644864779b7a53d9d74f35b390c1e59473384029
parent41bef0fc385381b8c6b9091ec7ca2abe04cfc147 (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 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);