@@ -57,21 +57,21 @@ struct Cli {
5757 #[ arg( long, value_enum, default_value_t = Parity :: Greedy ) ]
5858 parity_strategy : Parity ,
5959
60- /// Mask shape (off, circle, rectangle).
61- #[ arg( long, value_enum, default_value_t = CLI_DEFAULT_MASK_MODE ) ]
62- mask_mode : CliMaskMode ,
60+ /// Canvas shape (circle, rectangle).
61+ #[ arg( long, value_enum, default_value_t = CLI_DEFAULT_SHAPE ) ]
62+ shape : CliCanvasShape ,
6363
64- /// Mask scale as fraction of image dimension (0.01-1.5 ).
65- #[ arg( long, default_value_t = mujou_pipeline:: PipelineConfig :: DEFAULT_MASK_SCALE ) ]
66- mask_scale : f64 ,
64+ /// Canvas scale divisor (0.1-4.0); radius = min(w,h) / (2 × scale ).
65+ #[ arg( long, default_value_t = mujou_pipeline:: PipelineConfig :: DEFAULT_SCALE ) ]
66+ scale : f64 ,
6767
68- /// Rectangle mask aspect ratio (1.0-4.0, width/height before orientation).
69- #[ arg( long, default_value_t = mujou_pipeline:: PipelineConfig :: DEFAULT_MASK_ASPECT_RATIO ) ]
70- mask_aspect_ratio : f64 ,
68+ /// Rectangle canvas aspect ratio (1.0-4.0, width/height before orientation).
69+ #[ arg( long, default_value_t = mujou_pipeline:: PipelineConfig :: DEFAULT_ASPECT_RATIO ) ]
70+ aspect_ratio : f64 ,
7171
72- /// Rectangle mask orientation: longer side is horizontal.
73- #[ arg( long, default_value_t = mujou_pipeline:: PipelineConfig :: DEFAULT_MASK_LANDSCAPE ) ]
74- mask_landscape : bool ,
72+ /// Rectangle canvas orientation: longer side is horizontal.
73+ #[ arg( long, default_value_t = mujou_pipeline:: PipelineConfig :: DEFAULT_LANDSCAPE ) ]
74+ landscape : bool ,
7575
7676 /// Invert edge map before contour tracing.
7777 #[ arg( long) ]
@@ -125,34 +125,31 @@ enum Parity {
125125 Optimal ,
126126}
127127
128- /// Mask shape selection.
128+ /// Canvas shape selection.
129129///
130- /// Mirrors [`mujou_pipeline::MaskMode `] so that an exhaustive `match` in
130+ /// Mirrors [`mujou_pipeline::CanvasShape `] so that an exhaustive `match` in
131131/// [`config_from_cli`] forces a compile error when a new upstream variant
132132/// is added without a corresponding CLI entry.
133133#[ derive( Clone , Copy , ValueEnum ) ]
134- enum CliMaskMode {
135- /// No mask — polylines pass through unclipped.
136- Off ,
137- /// Circular mask.
134+ enum CliCanvasShape {
135+ /// Circular canvas.
138136 Circle ,
139- /// Axis-aligned rectangular mask .
137+ /// Axis-aligned rectangular canvas .
140138 Rectangle ,
141139}
142140
143- /// Maps a [`mujou_pipeline::MaskMode `] to the local CLI [`CliMaskMode `] enum.
144- const fn mask_mode_from_pipeline ( m : mujou_pipeline:: MaskMode ) -> CliMaskMode {
141+ /// Maps a [`mujou_pipeline::CanvasShape `] to the local CLI [`CliCanvasShape `] enum.
142+ const fn canvas_shape_from_pipeline ( m : mujou_pipeline:: CanvasShape ) -> CliCanvasShape {
145143 match m {
146- mujou_pipeline:: MaskMode :: Off => CliMaskMode :: Off ,
147- mujou_pipeline:: MaskMode :: Circle => CliMaskMode :: Circle ,
148- mujou_pipeline:: MaskMode :: Rectangle => CliMaskMode :: Rectangle ,
144+ mujou_pipeline:: CanvasShape :: Circle => CliCanvasShape :: Circle ,
145+ mujou_pipeline:: CanvasShape :: Rectangle => CliCanvasShape :: Rectangle ,
149146 }
150147}
151148
152- /// The CLI default mask mode , derived from [`PipelineConfig::DEFAULT_MASK_MODE `]
149+ /// The CLI default canvas shape , derived from [`PipelineConfig::DEFAULT_SHAPE `]
153150/// so the two cannot silently diverge.
154- const CLI_DEFAULT_MASK_MODE : CliMaskMode =
155- mask_mode_from_pipeline ( mujou_pipeline:: PipelineConfig :: DEFAULT_MASK_MODE ) ;
151+ const CLI_DEFAULT_SHAPE : CliCanvasShape =
152+ canvas_shape_from_pipeline ( mujou_pipeline:: PipelineConfig :: DEFAULT_SHAPE ) ;
156153
157154/// Downsample resampling filter selection.
158155#[ derive( Clone , Copy , ValueEnum ) ]
@@ -212,14 +209,13 @@ fn config_from_cli(cli: &Cli) -> Result<mujou_pipeline::PipelineConfig, String>
212209 Parity :: Greedy => mujou_pipeline:: ParityStrategy :: Greedy ,
213210 Parity :: Optimal => mujou_pipeline:: ParityStrategy :: Optimal ,
214211 } ,
215- mask_mode : match cli. mask_mode {
216- CliMaskMode :: Off => mujou_pipeline:: MaskMode :: Off ,
217- CliMaskMode :: Circle => mujou_pipeline:: MaskMode :: Circle ,
218- CliMaskMode :: Rectangle => mujou_pipeline:: MaskMode :: Rectangle ,
212+ shape : match cli. shape {
213+ CliCanvasShape :: Circle => mujou_pipeline:: CanvasShape :: Circle ,
214+ CliCanvasShape :: Rectangle => mujou_pipeline:: CanvasShape :: Rectangle ,
219215 } ,
220- mask_scale : cli. mask_scale ,
221- mask_aspect_ratio : cli. mask_aspect_ratio ,
222- mask_landscape : cli. mask_landscape ,
216+ scale : cli. scale ,
217+ aspect_ratio : cli. aspect_ratio ,
218+ landscape : cli. landscape ,
223219 invert : cli. invert ,
224220 working_resolution : cli. working_resolution ,
225221 downsample_filter : match cli. downsample_filter {
@@ -303,12 +299,14 @@ fn main() -> ExitCode {
303299 description : Some ( & desc) ,
304300 config_json : config_json. as_deref ( ) ,
305301 } ;
306- let mask_shape = staged. masked . as_ref ( ) . map ( |mr| & mr. shape ) ;
302+ let mapping =
303+ mujou_export:: document_mapping ( & staged. canvas . shape , config. border_margin ) ;
304+ // Use the joined (pre-subsampled) path for SVG —
305+ // subsampling is for THR polar conversion, not Cartesian SVG.
307306 let svg = mujou_export:: to_svg (
308- & [ staged. final_polyline ( ) . clone ( ) ] ,
309- staged. dimensions ,
307+ std:: slice:: from_ref ( & staged. joined ) ,
310308 & metadata,
311- mask_shape ,
309+ & mapping ,
312310 ) ;
313311 match std:: fs:: write ( svg_path, & svg) {
314312 Ok ( ( ) ) => {
@@ -404,7 +402,7 @@ fn print_multi_run_summary(all_diagnostics: &[PipelineDiagnostics]) {
404402 ( "Invert" , |d| d. invert . as_ref ( ) . map ( |s| s. duration ) ) ,
405403 ( "Contour Tracing" , |d| Some ( d. contour_tracing . duration ) ) ,
406404 ( "Simplification" , |d| Some ( d. simplification . duration ) ) ,
407- ( "Mask " , |d| d . mask . as_ref ( ) . map ( |s| s . duration ) ) ,
405+ ( "Canvas " , |d| Some ( d . canvas . duration ) ) ,
408406 ( "Join" , |d| Some ( d. join . duration ) ) ,
409407 ] ;
410408
0 commit comments