@@ -6,8 +6,11 @@ use roxmltree::{Document, Node};
66#[ cfg( feature = "serde" ) ]
77use serde:: { Deserialize , Serialize } ;
88use svgtypes:: Length ;
9+ use uom:: si:: f64:: Length as UomLength ;
10+ use uom:: si:: length:: { inch, millimeter} ;
911
1012use crate :: { turtle:: * , Machine } ;
13+ use self :: units:: CSS_DEFAULT_DPI ;
1114
1215#[ cfg( feature = "serde" ) ]
1316mod length_serde;
@@ -26,7 +29,7 @@ pub struct ConversionConfig {
2629 pub feedrate : f64 ,
2730 /// Dots per inch for pixels, picas, points, etc.
2831 pub dpi : f64 ,
29- /// Set the origin point for this conversion
32+ /// Set the origin point in millimeters for this conversion
3033 #[ cfg_attr( feature = "serde" , serde( default = "zero_origin" ) ) ]
3134 pub origin : [ Option < f64 > ; 2 ] ,
3235}
@@ -119,7 +122,13 @@ pub fn svg2program<'a, 'input: 'a>(
119122
120123 visitor. terrarium . turtle . inner . bounding_box
121124 } ;
122- let origin_transform = match config. origin {
125+
126+ // Convert from millimeters to user units
127+ let origin = config
128+ . origin
129+ . map ( |dim| dim. map ( |d| UomLength :: new :: < millimeter > ( d) . get :: < inch > ( ) * CSS_DEFAULT_DPI ) ) ;
130+
131+ let origin_transform = match origin {
123132 [ None , Some ( origin_y) ] => {
124133 let bb = bounding_box_generator ( ) ;
125134 Transform2D :: translation ( 0. , origin_y - bb. min . y )
0 commit comments