path_kit/
dash_path_effect.rs1use crate::bridge::ffi;
4use crate::path::Path;
5use crate::stroke_rec::StrokeRec;
6use cxx::UniquePtr;
7
8pub struct DashPathEffect {
11 inner: UniquePtr<ffi::PathEffectHolder>,
12}
13
14impl DashPathEffect {
15 pub fn new(intervals: &[f32], phase: f32) -> Option<Self> {
22 if intervals.is_empty() || !intervals.len().is_multiple_of(2) {
23 return None;
24 }
25 let inner = ffi::dash_effect_make(intervals, phase);
26 if inner.is_null() {
27 return None;
28 }
29 Some(Self { inner })
30 }
31
32 pub fn filter_path(&self, path: &Path, stroke_width: f32) -> Option<Path> {
41 let mut dst = Path::new();
42 let mut rec = StrokeRec::new_stroke(stroke_width, false);
43 let bounds = path.tight_bounds();
44 let cull: ffi::Rect = bounds.into();
45 let ok = ffi::path_effect_filter(
46 self.inner.as_ref().expect("PathEffect"),
47 dst.as_raw_pin_mut(),
48 path.as_raw(),
49 rec.pin_holder_mut(),
50 &cull,
51 );
52 if ok {
53 Some(dst)
54 } else {
55 None
56 }
57 }
58}