From b96cc6b3ce508d0bf4a1178e1664bb8b1f2ee211 Mon Sep 17 00:00:00 2001 From: "Dylan M. Taylor" Date: Fri, 13 Nov 2026 08:00:22 -0500 Subject: [PATCH] Group shared writer paths by layer --- crates/file-import/src/write.rs | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/crates/file-import/src/write.rs b/crates/file-import/src/write.rs index 2b7754837..676206282 100644 --- a/crates/file-import/src/write.rs +++ b/crates/file-import/src/write.rs @@ -123,15 +123,14 @@ fn write_svg(scene: &OutputScene) -> Result { if !(view_scale.is_finite() && view_scale > 0.0) { return Err(Error::InvalidGeometry); } + let paths_by_layer = paths_by_layer(scene); let elements = scene .layers .iter() .enumerate() .map(|(layer_index, layer)| { - let paths = scene - .paths + let paths = paths_by_layer[layer_index] .iter() - .filter(|path| path.layer == layer_index) .map(|path| { let color = path.color_rgb; let mut attributes = vec![ @@ -166,18 +165,30 @@ fn write_svg(scene: &OutputScene) -> Result { fn write_pdf(scene: &OutputScene) -> Result, Error> { validate_scene(scene)?; + let paths_by_layer = paths_by_layer(scene); // Match SVG's painter order: layers in order, then paths in source order within each layer. let paths = scene .layers .iter() .enumerate() .filter(|(_, layer)| layer.visible) - .flat_map(|(layer_index, _)| scene.paths.iter().filter(move |path| path.layer == layer_index)) + .flat_map(|(layer_index, _)| paths_by_layer[layer_index].iter().copied()) .map(|path| PdfPath { path: path.path.clone(), color_rgb: path.color_rgb, stroke_width_mm: Some(path.stroke_width_mm) }) .collect(); write_pdf_pages(&[PdfPage { width_mm: scene.width_mm, height_mm: scene.height_mm, view_box: scene.view_box, paths }]) } +/// Group the neutral paths once so writing does not rescan all paths for every layer. +fn paths_by_layer(scene: &OutputScene) -> Vec> { + let mut grouped: Vec> = (0..scene.layers.len()).map(|_| Vec::new()).collect(); + for path in &scene.paths { + if let Some(layer) = grouped.get_mut(path.layer) { + layer.push(path); + } + } + grouped +} + /// Encode a neutral list of laid-out pages with vector paths as PDF. pub fn write_pdf_pages(pages: &[PdfPage]) -> Result, Error> { use craft_pdf::write::{Metadata, Writer, backend};