@@ -3,7 +3,10 @@ use std::str::FromStr;
33use euclid:: default:: Transform2D ;
44use log:: { debug, warn} ;
55use roxmltree:: { Document , Node } ;
6- use svgtypes:: { AspectRatio , PathParser , PathSegment , PointsParser , TransformListParser , ViewBox } ;
6+ use svgtypes:: {
7+ AspectRatio , LengthListParser , PathParser , PathSegment , PointsParser , TransformListParser ,
8+ ViewBox ,
9+ } ;
710
811use super :: {
912 ConversionVisitor ,
@@ -108,12 +111,6 @@ impl<'a, T: Turtle> XmlVisitor for ConversionVisitor<'a, T> {
108111 warn ! ( "Clip paths are not supported: {:?}" , node) ;
109112 }
110113
111- // TODO: https://www.w3.org/TR/css-transforms-1/#transform-origin-property
112- if let Some ( mut origin) = node. attribute ( "transform-origin" ) . map ( PointsParser :: from) {
113- let _origin = origin. next ( ) ;
114- warn ! ( "transform-origin not supported yet" ) ;
115- }
116-
117114 let mut flattened_transform = if let Some ( transform) = node. attribute ( "transform" ) {
118115 // https://stackoverflow.com/questions/18582935/the-applying-order-of-svg-transforms
119116 TransformListParser :: from ( transform)
@@ -124,6 +121,28 @@ impl<'a, T: Turtle> XmlVisitor for ConversionVisitor<'a, T> {
124121 Transform2D :: identity ( )
125122 } ;
126123
124+ // https://www.w3.org/TR/css-transforms-1/#transform-origin-property
125+ if let Some ( to_str) = node. attribute ( "transform-origin" ) {
126+ let mut parser = LengthListParser :: from ( to_str) ;
127+ let ox = parser
128+ . next ( )
129+ . and_then ( |r| r. ok ( ) )
130+ . map ( |l| self . length_to_user_units ( l, DimensionHint :: Horizontal ) )
131+ . unwrap_or ( 0. ) ;
132+ let oy = parser
133+ . next ( )
134+ . and_then ( |r| r. ok ( ) )
135+ . map ( |l| self . length_to_user_units ( l, DimensionHint :: Vertical ) )
136+ . unwrap_or ( 0. ) ;
137+ if ox != 0. || oy != 0. {
138+ // https://www.w3.org/TR/css-transforms-1/#transformation-matrix-computation
139+ // Steps 2 & 4
140+ flattened_transform = Transform2D :: translation ( -ox, -oy)
141+ . then ( & flattened_transform)
142+ . then ( & Transform2D :: translation ( ox, oy) ) ;
143+ }
144+ }
145+
127146 // https://www.w3.org/TR/SVG/coords.html#EstablishingANewSVGViewport
128147 if node. has_tag_name ( SVG_TAG_NAME ) {
129148 let view_box = node
0 commit comments