diff --git a/crates/geom/src/lib.rs b/crates/geom/src/lib.rs index da351e5b..e0a4dde0 100644 --- a/crates/geom/src/lib.rs +++ b/crates/geom/src/lib.rs @@ -284,7 +284,9 @@ impl ReverseSubpaths for BezPath { kurbo::PathSeg::Cubic(c) => out.curve_to(c.p1, c.p2, c.p3), } } - out.close_path(); + if matches!(seg_path.elements().last(), Some(kurbo::PathEl::ClosePath)) { + out.close_path(); + } } out } diff --git a/crates/geom/src/tests.rs b/crates/geom/src/tests.rs index b99d7d8c..15e24d49 100644 --- a/crates/geom/src/tests.rs +++ b/crates/geom/src/tests.rs @@ -108,3 +108,18 @@ fn set_rotation_keeps_center() { } } } + +#[test] +fn reverse_subpaths_preserves_open_and_closed() { + let mut open = BezPath::new(); + open.move_to((0.0, 0.0)); + open.line_to((10.0, 0.0)); + open.line_to((10.0, 10.0)); + let r = ::reverse_subpaths(&open); + assert!(!r.elements().iter().any(|e| matches!(e, kurbo::PathEl::ClosePath)), "{:?}", r.elements()); + + let mut closed = open.clone(); + closed.close_path(); + let r = ::reverse_subpaths(&closed); + assert!(matches!(r.elements().last(), Some(kurbo::PathEl::ClosePath)), "{:?}", r.elements()); +}