Skip to main content

singe_npp/image/
morphology_3x3_border.rs

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);