diff --git a/node-graph/gcore/src/vector/algorithms/bezpath_algorithms.rs b/node-graph/gcore/src/vector/algorithms/bezpath_algorithms.rs index 9a0ee93a..c61140e6 100644 --- a/node-graph/gcore/src/vector/algorithms/bezpath_algorithms.rs +++ b/node-graph/gcore/src/vector/algorithms/bezpath_algorithms.rs @@ -150,19 +150,24 @@ enum BezPathTValue { /// Convert a [BezPathTValue] to a parametric `(segment_index, t)` tuple. /// - Asserts that `t` values contained within the `SubpathTValue` argument lie in the range [0, 1]. -fn bezpath_t_value_to_parametric(bezpath: &kurbo::BezPath, t: BezPathTValue, segments_length: Option<&[f64]>) -> (usize, f64) { +fn bezpath_t_value_to_parametric(bezpath: &kurbo::BezPath, t: BezPathTValue, precomputed_segments_length: Option<&[f64]>) -> (usize, f64) { let segment_count = bezpath.segments().count(); assert!(segment_count >= 1); match t { BezPathTValue::GlobalEuclidean(t) => { - let lengths = segments_length - .map(|segments_length| segments_length.to_vec()) - .unwrap_or(bezpath.segments().map(|segment| segment.perimeter(PERIMETER_ACCURACY)).collect()); + let computed_segments_length; - let total_length = lengths.iter().sum(); + let segments_length = if let Some(segments_length) = precomputed_segments_length { + segments_length + } else { + computed_segments_length = bezpath.segments().map(|segment| segment.perimeter(PERIMETER_ACCURACY)).collect::>(); + computed_segments_length.as_slice() + }; - global_euclidean_to_local_euclidean(bezpath, t, lengths.as_slice(), total_length) + let total_length = segments_length.iter().sum(); + + global_euclidean_to_local_euclidean(bezpath, t, segments_length, total_length) } BezPathTValue::GlobalParametric(global_t) => { assert!((0.0..=1.).contains(&global_t));