clipper2_sys/
int64.rs

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
166// Minkowski
167
168impl 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
264// Area
265
266impl 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}