1use super::*;
2
3macro_rules! impl_morphology_3x3_border {
4 ($name:ident, $ty:ty, $layout:ty, $ffi:ident) => {
5 pub fn $name(
6 stream_context: &StreamContext,
7 source: &ImageView<'_, $ty, $layout>,
8 source_offset: Point,
9 destination: &mut ImageViewMut<'_, $ty, $layout>,
10 border_type: BorderType,
11 ) -> Result<()> {
12 validate_border_roi(source.size(), source_offset, destination.size())?;
13
14 unsafe {
15 try_ffi!(sys::$ffi(
16 source.as_ptr().cast(),
17 source.step(),
18 source.size().into(),
19 source_offset.into(),
20 destination.as_mut_ptr().cast(),
21 destination.step(),
22 destination.size().into(),
23 border_type.into(),
24 stream_context.as_raw(),
25 ))?;
26 }
27 Ok(())
28 }
29 };
30}
31
32macro_rules! impl_generic_morphology_3x3_border {
33 ($trait:ident, $method:ident, $function:ident, $layout:ty, [$($ty:ty => $direct:ident),* $(,)?]) => {
34 pub trait $trait<Layout>: DataTypeLike + Sized {
35 fn $method(
36 stream_context: &StreamContext,
37 source: &ImageView<'_, Self, Layout>,
38 source_offset: Point,
39 destination: &mut ImageViewMut<'_, Self, Layout>,
40 border_type: BorderType,
41 ) -> Result<()>;
42 }
43
44 pub fn $function<T>(
45 stream_context: &StreamContext,
46 source: &ImageView<'_, T, $layout>,
47 source_offset: Point,
48 destination: &mut ImageViewMut<'_, T, $layout>,
49 border_type: BorderType,
50 ) -> Result<()>
51 where
52 T: $trait<$layout>,
53 {
54 T::$method(
55 stream_context,
56 source,
57 source_offset,
58 destination,
59 border_type,
60 )
61 }
62
63 $(
64 impl $trait<$layout> for $ty {
65 fn $method(
66 stream_context: &StreamContext,
67 source: &ImageView<'_, Self, $layout>,
68 source_offset: Point,
69 destination: &mut ImageViewMut<'_, Self, $layout>,
70 border_type: BorderType,
71 ) -> Result<()> {
72 $direct(
73 stream_context,
74 source,
75 source_offset,
76 destination,
77 border_type,
78 )
79 }
80 }
81 )*
82 };
83}
84
85impl_morphology_3x3_border!(
86 dilate_3x3_border_u8_c1,
87 u8,
88 C1,
89 nppiDilate3x3Border_8u_C1R_Ctx
90);
91impl_morphology_3x3_border!(
92 dilate_3x3_border_u8_c3,
93 u8,
94 C3,
95 nppiDilate3x3Border_8u_C3R_Ctx
96);
97impl_morphology_3x3_border!(
98 dilate_3x3_border_u8_c4,
99 u8,
100 C4,
101 nppiDilate3x3Border_8u_C4R_Ctx
102);
103impl_morphology_3x3_border!(
104 dilate_3x3_border_u8_ac4,
105 u8,
106 AC4,
107 nppiDilate3x3Border_8u_AC4R_Ctx
108);
109impl_morphology_3x3_border!(
110 dilate_3x3_border_u16_c1,
111 u16,
112 C1,
113 nppiDilate3x3Border_16u_C1R_Ctx
114);
115impl_morphology_3x3_border!(
116 dilate_3x3_border_u16_c3,
117 u16,
118 C3,
119 nppiDilate3x3Border_16u_C3R_Ctx
120);
121impl_morphology_3x3_border!(
122 dilate_3x3_border_u16_c4,
123 u16,
124 C4,
125 nppiDilate3x3Border_16u_C4R_Ctx
126);
127impl_morphology_3x3_border!(
128 dilate_3x3_border_u16_ac4,
129 u16,
130 AC4,
131 nppiDilate3x3Border_16u_AC4R_Ctx
132);
133impl_morphology_3x3_border!(
134 dilate_3x3_border_f32_c1,
135 f32,
136 C1,
137 nppiDilate3x3Border_32f_C1R_Ctx
138);
139impl_morphology_3x3_border!(
140 dilate_3x3_border_f32_c3,
141 f32,
142 C3,
143 nppiDilate3x3Border_32f_C3R_Ctx
144);
145impl_morphology_3x3_border!(
146 dilate_3x3_border_f32_c4,
147 f32,
148 C4,
149 nppiDilate3x3Border_32f_C4R_Ctx
150);
151impl_morphology_3x3_border!(
152 dilate_3x3_border_f32_ac4,
153 f32,
154 AC4,
155 nppiDilate3x3Border_32f_AC4R_Ctx
156);
157
158impl_morphology_3x3_border!(
159 erode_3x3_border_u8_c1,
160 u8,
161 C1,
162 nppiErode3x3Border_8u_C1R_Ctx
163);
164impl_morphology_3x3_border!(
165 erode_3x3_border_u8_c3,
166 u8,
167 C3,
168 nppiErode3x3Border_8u_C3R_Ctx
169);
170impl_morphology_3x3_border!(
171 erode_3x3_border_u8_c4,
172 u8,
173 C4,
174 nppiErode3x3Border_8u_C4R_Ctx
175);
176impl_morphology_3x3_border!(
177 erode_3x3_border_u8_ac4,
178 u8,
179 AC4,
180 nppiErode3x3Border_8u_AC4R_Ctx
181);
182impl_morphology_3x3_border!(
183 erode_3x3_border_u16_c1,
184 u16,
185 C1,
186 nppiErode3x3Border_16u_C1R_Ctx
187);
188impl_morphology_3x3_border!(
189 erode_3x3_border_u16_c3,
190 u16,
191 C3,
192 nppiErode3x3Border_16u_C3R_Ctx
193);
194impl_morphology_3x3_border!(
195 erode_3x3_border_u16_c4,
196 u16,
197 C4,
198 nppiErode3x3Border_16u_C4R_Ctx
199);
200impl_morphology_3x3_border!(
201 erode_3x3_border_u16_ac4,
202 u16,
203 AC4,
204 nppiErode3x3Border_16u_AC4R_Ctx
205);
206impl_morphology_3x3_border!(
207 erode_3x3_border_f32_c1,
208 f32,
209 C1,
210 nppiErode3x3Border_32f_C1R_Ctx
211);
212impl_morphology_3x3_border!(
213 erode_3x3_border_f32_c3,
214 f32,
215 C3,
216 nppiErode3x3Border_32f_C3R_Ctx
217);
218impl_morphology_3x3_border!(
219 erode_3x3_border_f32_c4,
220 f32,
221 C4,
222 nppiErode3x3Border_32f_C4R_Ctx
223);
224impl_morphology_3x3_border!(
225 erode_3x3_border_f32_ac4,
226 f32,
227 AC4,
228 nppiErode3x3Border_32f_AC4R_Ctx
229);
230
231impl_generic_morphology_3x3_border!(
232 Dilate3x3BorderC1,
233 dilate_3x3_border,
234 dilate_3x3_border_c1,
235 C1,
236 [
237 u8 => dilate_3x3_border_u8_c1,
238 u16 => dilate_3x3_border_u16_c1,
239 f32 => dilate_3x3_border_f32_c1,
240 ]
241);
242impl_generic_morphology_3x3_border!(
243 Dilate3x3BorderC3,
244 dilate_3x3_border,
245 dilate_3x3_border_c3,
246 C3,
247 [
248 u8 => dilate_3x3_border_u8_c3,
249 u16 => dilate_3x3_border_u16_c3,
250 f32 => dilate_3x3_border_f32_c3,
251 ]
252);
253impl_generic_morphology_3x3_border!(
254 Dilate3x3BorderC4,
255 dilate_3x3_border,
256 dilate_3x3_border_c4,
257 C4,
258 [
259 u8 => dilate_3x3_border_u8_c4,
260 u16 => dilate_3x3_border_u16_c4,
261 f32 => dilate_3x3_border_f32_c4,
262 ]
263);
264impl_generic_morphology_3x3_border!(
265 Dilate3x3BorderAc4,
266 dilate_3x3_border,
267 dilate_3x3_border_ac4,
268 AC4,
269 [
270 u8 => dilate_3x3_border_u8_ac4,
271 u16 => dilate_3x3_border_u16_ac4,
272 f32 => dilate_3x3_border_f32_ac4,
273 ]
274);
275impl_generic_morphology_3x3_border!(
276 Erode3x3BorderC1,
277 erode_3x3_border,
278 erode_3x3_border_c1,
279 C1,
280 [
281 u8 => erode_3x3_border_u8_c1,
282 u16 => erode_3x3_border_u16_c1,
283 f32 => erode_3x3_border_f32_c1,
284 ]
285);
286impl_generic_morphology_3x3_border!(
287 Erode3x3BorderC3,
288 erode_3x3_border,
289 erode_3x3_border_c3,
290 C3,
291 [
292 u8 => erode_3x3_border_u8_c3,
293 u16 => erode_3x3_border_u16_c3,
294 f32 => erode_3x3_border_f32_c3,
295 ]
296);
297impl_generic_morphology_3x3_border!(
298 Erode3x3BorderC4,
299 erode_3x3_border,
300 erode_3x3_border_c4,
301 C4,
302 [
303 u8 => erode_3x3_border_u8_c4,
304 u16 => erode_3x3_border_u16_c4,
305 f32 => erode_3x3_border_f32_c4,
306 ]
307);
308impl_generic_morphology_3x3_border!(
309 Erode3x3BorderAc4,
310 erode_3x3_border,
311 erode_3x3_border_ac4,
312 AC4,
313 [
314 u8 => erode_3x3_border_u8_ac4,
315 u16 => erode_3x3_border_u16_ac4,
316 f32 => erode_3x3_border_f32_ac4,
317 ]
318);