Skip to content

Commit 67ff022

Browse files
committed
Merge branch 'main' into normalized-coordinate-system-docs
2 parents b3e6873 + 64a60b5 commit 67ff022

File tree

19 files changed

+1297
-966
lines changed

19 files changed

+1297
-966
lines changed

crates/mujou-app/src/main.rs

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ fn app() -> Element {
111111
let mut error = use_signal(|| Option::<String>::None);
112112
let mut generation = use_signal(|| 0u64);
113113
let mut debounce_generation = use_signal(|| 0u64);
114-
let mut selected_stage = use_signal(|| StageId::Masked);
114+
let mut selected_stage = use_signal(|| StageId::Canvas);
115115

116116
// Elapsed time tracking for the processing indicator.
117117
let mut elapsed_ms = use_signal(|| 0.0_f64);
@@ -743,31 +743,32 @@ fn app() -> Element {
743743
config_description: {
744744
let cfg = committed_config();
745745
format!(
746-
"blur={}, canny={}/{}, simplify={}, tracer={:?}, joiner={:?}, mask={}, res={}",
746+
"blur={}, canny={}/{}, simplify={}, tracer={:?}, joiner={:?}, canvas={}, border_margin={:.0}%, res={}",
747747
cfg.blur_sigma,
748748
cfg.canny_low,
749749
cfg.canny_high,
750750
cfg.simplify_tolerance,
751751
cfg.contour_tracer,
752752
cfg.path_joiner,
753-
match cfg.mask_mode {
754-
mujou_pipeline::MaskMode::Off => "off".to_owned(),
755-
mujou_pipeline::MaskMode::Circle => {
756-
format!("circle {:.0}%", cfg.mask_scale * 100.0)
753+
match cfg.shape {
754+
mujou_pipeline::CanvasShape::Circle => {
755+
format!("circle s={:.2}", cfg.scale)
757756
}
758-
mujou_pipeline::MaskMode::Rectangle => {
757+
mujou_pipeline::CanvasShape::Rectangle => {
759758
format!(
760-
"rect {:.0}% ar={:.2} {}",
761-
cfg.mask_scale * 100.0,
762-
cfg.mask_aspect_ratio,
763-
if cfg.mask_landscape { "land" } else { "port" },
759+
"rect s={:.2} ar={:.2} {}",
760+
cfg.scale,
761+
cfg.aspect_ratio,
762+
if cfg.landscape { "land" } else { "port" },
764763
)
765764
}
766765
},
766+
cfg.border_margin * 100.0,
767767
cfg.working_resolution,
768768
)
769769
},
770770
config_json: serde_json::to_string(&committed_config()).ok(),
771+
border_margin: committed_config().border_margin,
771772
show: show_export,
772773
}
773774
}

crates/mujou-bench/src/main.rs

Lines changed: 37 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -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

crates/mujou-export/src/lib.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,8 @@
66
pub mod svg;
77
pub mod thr;
88

9-
pub use svg::{SvgMetadata, build_path_data, to_diagnostic_svg, to_segment_diagnostic_svg, to_svg};
9+
pub use svg::{
10+
DocumentMapping, SvgMetadata, build_path_data, document_mapping, to_diagnostic_svg,
11+
to_segment_diagnostic_svg, to_svg,
12+
};
1013
pub use thr::{ThrMetadata, to_thr};

0 commit comments

Comments
 (0)