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