clipper2_sys/double/
clipper_d.rs

1use std::os::raw::c_int;
2
3use crate::{
4    clipper_clipperd, clipper_clipperd_add_clip, clipper_clipperd_add_open_subject,
5    clipper_clipperd_add_subject, clipper_clipperd_clear, clipper_clipperd_execute,
6    clipper_clipperd_execute_tree_with_open, clipper_clipperd_get_preserve_collinear,
7    clipper_clipperd_get_reverse_solution, clipper_clipperd_set_preserve_collinear,
8    clipper_clipperd_set_reverse_solution, clipper_clipperd_size, clipper_delete_clipperd,
9    clipper_delete_pathsd, clipper_delete_polytreed, clipper_polytreed, clipper_polytreed_size,
10    malloc, ClipType, ClipperClipperD, FillRule, PathsD, PolyTreeD,
11};
12
13pub struct ClipperD {
14    ptr: *mut ClipperClipperD,
15}
16
17impl ClipperD {
18    pub fn new(precision: c_int) -> Self {
19        let ptr = unsafe {
20            let mem = malloc(clipper_clipperd_size());
21            clipper_clipperd(mem, precision)
22        };
23        Self { ptr: ptr }
24    }
25
26    pub fn set_preserve_collinear(&self, value: bool) {
27        unsafe { clipper_clipperd_set_preserve_collinear(self.ptr, if value { 1 } else { 0 }) }
28    }
29
30    pub fn get_preserve_collinear(&self) -> bool {
31        unsafe { clipper_clipperd_get_preserve_collinear(self.ptr) == 1 }
32    }
33
34    pub fn set_reverse_solution(&self, value: bool) {
35        unsafe { clipper_clipperd_set_reverse_solution(self.ptr, if value { 1 } else { 0 }) }
36    }
37
38    pub fn get_reverse_solution(&self) -> bool {
39        unsafe { clipper_clipperd_get_reverse_solution(self.ptr) == 1 }
40    }
41
42    pub fn clear(&self) {
43        unsafe { clipper_clipperd_clear(self.ptr) }
44    }
45
46    pub fn add_open_subject(&self, open_subject: PathsD) {
47        unsafe {
48            let path_prt = open_subject.get_clipper_paths();
49            clipper_clipperd_add_open_subject(self.ptr, path_prt);
50            clipper_delete_pathsd(path_prt);
51        }
52    }
53
54    pub fn add_subject(&self, subject: PathsD) {
55        unsafe {
56            let path_prt = subject.get_clipper_paths();
57            clipper_clipperd_add_subject(self.ptr, path_prt);
58            clipper_delete_pathsd(path_prt);
59        }
60    }
61
62    pub fn add_clip(&self, clip: PathsD) {
63        unsafe {
64            let path_prt = clip.get_clipper_paths();
65            clipper_clipperd_add_clip(self.ptr, path_prt);
66            clipper_delete_pathsd(path_prt);
67        }
68    }
69
70    pub fn boolean_operation(&self, clip_type: ClipType, fill_rule: FillRule) -> PathsD {
71        let closed_path = PathsD::new(&vec![]).get_clipper_paths();
72        let open_path = PathsD::new(&vec![]).get_clipper_paths();
73        unsafe {
74            let is_success = clipper_clipperd_execute(
75                self.ptr,
76                clip_type.into(),
77                fill_rule.into(),
78                closed_path,
79                open_path,
80            );
81
82            let path = PathsD::from(closed_path);
83            clipper_delete_pathsd(closed_path);
84            clipper_delete_pathsd(open_path);
85            path
86        }
87    }
88
89    pub fn boolean_operation_tree(&self, clip_type: ClipType, fill_rule: FillRule) -> PolyTreeD {
90        let tree_ptr = unsafe {
91            let mem = malloc(clipper_polytreed_size());
92            clipper_polytreed(mem, std::ptr::null_mut())
93        };
94        let open_path = PathsD::new(&vec![]).get_clipper_paths();
95        unsafe {
96            let is_success = clipper_clipperd_execute_tree_with_open(
97                self.ptr,
98                clip_type.into(),
99                fill_rule.into(),
100                tree_ptr,
101                open_path,
102            );
103            clipper_delete_pathsd(open_path);
104            let tree = PolyTreeD::from(tree_ptr);
105            clipper_delete_polytreed(tree_ptr);
106            tree
107        }
108    }
109}
110
111impl Drop for ClipperD {
112    fn drop(&mut self) {
113        unsafe { clipper_delete_clipperd(self.ptr) }
114    }
115}