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
166impl 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
270impl 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}