mirror of
https://github.com/storytold/cadcraft.git
synced 2026-10-27 20:36:48 -06:00
PNG export (and everything else drawn by raster::render) stroked every polyline primitive with its own tiny-skia stroke_path call: a new path and a newly built paint pipeline per primitive. Hatch patterns, linetype dashes and text strokes produce long runs of short polylines in one colour, so that per-call setup dominated the render. Consecutive hairline polylines (zero width, or at most one pixel when anti-aliased; the default for PNG export) with the same colour, alpha and width are now collected into one path and stroked once. tiny-skia draws hairlines segment by segment straight onto the pixmap with the same per-contour round caps, so the pixels and their blending order are unchanged. Thicker strokes (filled outlines), fills, points, infinite lines and polylines with non-finite or far-out screen coordinates break the run and are drawn exactly as before. Adds crates/io/examples/export_bench.rs, which exports examples/ apartment.dxf repeated on a grid (10x10: 5,800 entities) and reports median/min wall time per format. PNG export, 10x10 grid, 11 interleaved runs (Ryzen, 16 threads, Linux): before: median 1790.7 ms, min 1703.3 ms after: median 1037.6 ms, min 926.0 ms (-42.1 %) A/A noise on the same setup: 1.1 %. Output PNGs are byte-identical (bench at 10x10 and 20x20, CLI export of apartment.dxf and a 23,200- entity drawing). New tests compare render() against stroking each primitive on its own. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>