clipper2_sys/
double.rs

1use std::os::raw::c_int;
2
3mod path_d;
4pub use path_d::*;
5
6mod paths_d;
7pub use paths_d::*;
8
9mod clipper_d;
10pub use clipper_d::*;
11
12mod poly_tree_d;
13pub use poly_tree_d::*;
14
15use crate::{clipper2::*, malloc, EndType, JoinType, Path64, Paths64, PointInPolygonResult};
16
17pub type PointD = ClipperPointD;
18
19impl PointD {
20    pub fn new(x: f64, y: f64) -> Self {
21        Self { x: x, y: y }
22    }
23}
24
25impl PathD {
26    pub(crate) fn from(ptr: *mut ClipperPathD) -> Self {
27        let points = unsafe {
28            let len: i32 = clipper_pathd_length(ptr).try_into().unwrap();
29            (0..len).map(|i| clipper_pathd_get_point(ptr, i)).collect()
30        };
31        Self::new(&points)
32    }
33
34    pub(crate) fn get_clipper_path(&self) -> *mut ClipperPathD {
35        unsafe {
36            let mem = malloc(clipper_pathd_size());
37            clipper_pathd_of_points(mem, self.0.clone().as_mut_ptr(), self.len())
38        }
39    }
40}
41
42impl PathD {
43    pub fn simplify(&self, epsilon: f64, is_open_path: bool) -> PathD {
44        unsafe {
45            let mem = malloc(clipper_pathd_size());
46            let pathd_prt = self.get_clipper_path();
47            let path_ptr =
48                clipper_pathd_simplify(mem, pathd_prt, epsilon, if is_open_path { 1 } else { 0 });
49            let path = Self::from(path_ptr);
50            clipper_delete_pathd(path_ptr);
51            clipper_delete_pathd(pathd_prt);
52            path
53        }
54    }
55
56    pub fn point_in_polygon(&self, point: PointD) -> PointInPolygonResult {
57        unsafe {
58            let pathd_prt = self.get_clipper_path();
59            let result = clipper_point_in_pathd(pathd_prt, point).into();
60            clipper_delete_pathd(pathd_prt);
61            result
62        }
63    }
64
65    pub fn to_path64(&self) -> Path64 {
66        unsafe {
67            let mem = malloc(clipper_path64_size());
68            let pathd_prt = self.get_clipper_path();
69            let path64_ptr = clipper_pathd_to_path64(mem, pathd_prt);
70            let path64 = Path64::from(path64_ptr);
71            clipper_delete_path64(path64_ptr);
72            clipper_delete_pathd(pathd_prt);
73            path64
74        }
75    }
76}
77
78impl PathsD {
79    pub(crate) fn from(ptr: *mut ClipperPathsD) -> Self {
80        let paths = unsafe {
81            let len: i32 = clipper_pathsd_length(ptr).try_into().unwrap();
82            (0..len)
83                .map(|i| {
84                    let point_len: i32 = clipper_pathsd_path_length(ptr, i).try_into().unwrap();
85                    let points = (0..point_len)
86                        .map(|j| clipper_pathsd_get_point(ptr, i, j))
87                        .collect();
88                    PathD::new(&points)
89                })
90                .collect()
91        };
92        Self::new(&paths)
93    }
94
95    pub(crate) fn get_clipper_paths(&self) -> *mut ClipperPathsD {
96        unsafe {
97            let mem = malloc(clipper_pathsd_size());
98            let mut paths = self
99                .0
100                .iter()
101                .map(|p| p.get_clipper_path())
102                .collect::<Vec<*mut ClipperPathD>>();
103            let result = clipper_pathsd_of_paths(mem, paths.as_mut_ptr(), self.len());
104            for ptr in paths {
105                clipper_delete_pathd(ptr);
106            }
107            result
108        }
109    }
110}
111
112impl PathsD {
113    pub fn simplify(&self, epsilon: f64, is_open_path: bool) -> PathsD {
114        unsafe {
115            let mem = malloc(clipper_pathsd_size());
116            let pathsd_prt = self.get_clipper_paths();
117            let paths_ptr =
118                clipper_pathsd_simplify(mem, pathsd_prt, epsilon, if is_open_path { 1 } else { 0 });
119            let paths = Self::from(paths_ptr);
120            clipper_delete_pathsd(paths_ptr);
121            clipper_delete_pathsd(pathsd_prt);
122            paths
123        }
124    }
125
126    pub fn inflate(
127        &self,
128        delta: f64,
129        join_type: JoinType,
130        end_type: EndType,
131        miter_limit: f64,
132        precision: c_int,
133    ) -> PathsD {
134        unsafe {
135            let mem = malloc(clipper_pathsd_size());
136            let pathsd_prt = self.get_clipper_paths();
137            let paths_ptr = clipper_pathsd_inflate(
138                mem,
139                pathsd_prt,
140                delta,
141                join_type.into(),
142                end_type.into(),
143                miter_limit,
144                precision,
145            );
146            let paths = Self::from(paths_ptr);
147            clipper_delete_pathsd(paths_ptr);
148            clipper_delete_pathsd(pathsd_prt);
149            paths
150        }
151    }
152
153    pub fn to_paths64(&self) -> Paths64 {
154        unsafe {
155            let mem = malloc(clipper_paths64_size());
156            let pathsd_prt = self.get_clipper_paths();
157            let paths64_ptr = clipper_pathsd_to_paths64(mem, pathsd_prt);
158            let paths64 = Paths64::from(paths64_ptr);
159            clipper_delete_paths64(paths64_ptr);
160            clipper_delete_pathsd(pathsd_prt);
161            paths64
162        }
163    }
164}
165
166// Minkowski
167
168impl PathD {
169    pub fn minkowski_sum(&self, pattern: &PathD, is_closed: bool, precision: i32) -> PathsD {
170        unsafe {
171            let pattern_ptr = pattern.get_clipper_path();
172            let path_ptr = self.get_clipper_path();
173
174            let mem = malloc(clipper_pathsd_size());
175            let result_prt = clipper_pathd_minkowski_sum(
176                mem,
177                pattern_ptr,
178                path_ptr,
179                if is_closed { 1 } else { 0 },
180                precision,
181            );
182            let result = PathsD::from(result_prt);
183            clipper_delete_pathsd(result_prt);
184            clipper_delete_pathd(pattern_ptr);
185            clipper_delete_pathd(path_ptr);
186            result
187        }
188    }
189
190    pub fn minkowski_diff(&self, pattern: &PathD, is_closed: bool, precision: i32) -> PathsD {
191        unsafe {
192            let pattern_ptr = pattern.get_clipper_path();
193            let path_ptr = self.get_clipper_path();
194
195            let mem = malloc(clipper_pathsd_size());
196            let result_prt = clipper_pathd_minkowski_diff(
197                mem,
198                pattern_ptr,
199                path_ptr,
200                if is_closed { 1 } else { 0 },
201                precision,
202            );
203            let result = PathsD::from(result_prt);
204            clipper_delete_pathsd(result_prt);
205            clipper_delete_pathd(pattern_ptr);
206            clipper_delete_pathd(path_ptr);
207            result
208        }
209    }
210}
211
212impl PathsD {
213    pub fn minkowski_sum(
214        &self,
215        pattern: &PathD,
216        is_closed: bool,
217        precision: i32,
218        fillrule: ClipperFillRule,
219    ) -> PathsD {
220        unsafe {
221            let pattern_ptr = pattern.get_clipper_path();
222            let paths_ptr = self.get_clipper_paths();
223
224            let mem = malloc(clipper_pathsd_size());
225            let result_prt = clipper_pathsd_minkowski_sum(
226                mem,
227                pattern_ptr,
228                paths_ptr,
229                if is_closed { 1 } else { 0 },
230                precision,
231                fillrule.into(),
232            );
233            let result = PathsD::from(result_prt);
234            clipper_delete_pathsd(result_prt);
235            clipper_delete_pathd(pattern_ptr);
236            clipper_delete_pathsd(paths_ptr);
237            result
238        }
239    }
240
241    pub fn minkowski_diff(
242        &self,
243        pattern: &PathD,
244        is_closed: bool,
245        precision: i32,
246        fillrule: ClipperFillRule,
247    ) -> PathsD {
248        unsafe {
249            let pattern_ptr = pattern.get_clipper_path();
250            let paths_ptr = self.get_clipper_paths();
251
252            let mem = malloc(clipper_pathsd_size());
253            let result_prt = clipper_pathsd_minkowski_diff(
254                mem,
255                pattern_ptr,
256                paths_ptr,
257                if is_closed { 1 } else { 0 },
258                precision,
259                fillrule.into(),
260            );
261            let result = PathsD::from(result_prt);
262            clipper_delete_pathsd(result_prt);
263            clipper_delete_pathd(pattern_ptr);
264            clipper_delete_pathsd(paths_ptr);
265            result
266        }
267    }
268}
269
270// Area
271
272impl PathD {
273
274    pub fn area(&self) -> f64 {
275        unsafe {
276            let pathd_prt = self.get_clipper_path();
277            let reuslt = clipper_pathd_area(pathd_prt);
278            clipper_delete_pathd(pathd_prt);
279            reuslt
280        }
281    }
282
283}
284
285impl PathsD {
286
287    pub fn area(&self) -> f64 {
288        unsafe {
289            let pathsd_prt = self.get_clipper_paths();
290            let reuslt = clipper_pathsd_area(pathsd_prt);
291            clipper_delete_pathsd(pathsd_prt);
292            reuslt
293        }
294    }
295
296}