use crate::split_path_contours;
use lyon_algorithms::walk::{walk_along_path, RegularPattern, WalkerEvent};
use lyon_path::iterator::PathIterator;
pub fn path_to_lines(
path: &lyon_path::Path,
tolerance: f32,
interval: f32,
) -> Vec<Vec<(f32, f32)>> {
let mut lines = vec![];
let mut line = None;
each_path_line(path, tolerance, interval, |new_line, p| {
if new_line && let Some(l) = line.take() {
lines.push(l);
}
line = Some(vec![]);
if let Some(p) = p {
if let Some(mut l) = line.take() {
l.push((p.0, p.1));
}
}
});
if let Some(l) = line {
lines.push(l);
}
lines
}
pub fn each_path_line(
path: &lyon_path::Path,
tolerance: f32,
interval: f32,
mut on_point: impl FnMut(bool, Option<(f32, f32)>),
) {
if interval > 0.0 {
let path_vec = split_path_contours(path);
for path in path_vec.iter() {
let start = 0.0;
let mut pattern = RegularPattern {
callback: &mut |event: WalkerEvent| {
on_point(true, None);
on_point(false, Some((event.position.x, event.position.y)));
true },
interval,
};
walk_along_path(path.iter(), start, tolerance, &mut pattern);
}
} else {
path.iter()
.flattened(tolerance)
.for_each(|event| match event {
lyon_path::Event::Begin { at } => {
on_point(true, None);
on_point(false, Some((at.x, at.y)));
}
lyon_path::Event::Line { from, to } => {
on_point(false, Some((to.x, to.y)));
}
_ => {}
});
}
}