Skip to main content

singe_npp/image/
morphology_mask.rs

1use super::*;
2
3macro_rules! impl_morphology_mask {
4    ($name:ident, $ty:ty, $layout:ty, $ffi:ident) => {
5        pub fn $name(
6            stream_context: &StreamContext,
7            source: &ImageView<'_, $ty, $layout>,
8            destination: &mut ImageViewMut<'_, $ty, $layout>,
9            mask: &[u8],
10            mask_size: Size,
11            anchor: Point,
12        ) -> Result<()> {
13            validate_same_size(source.size(), destination.size())?;
14            validate_mask(mask, mask_size, anchor)?;
15
16            unsafe {
17                try_ffi!(sys::$ffi(
18                    source.as_ptr().cast(),
19                    source.step(),
20                    destination.as_mut_ptr().cast(),
21                    destination.step(),
22                    source.size().into(),
23                    mask.as_ptr().cast(),
24                    mask_size.into(),
25                    anchor.into(),
26                    stream_context.as_raw(),
27                ))?;
28            }
29            Ok(())
30        }
31    };
32}
33
34macro_rules! impl_generic_morphology_mask {
35    ($trait:ident, $method:ident, $function:ident, $layout:ty, [$($ty:ty => $direct:ident),* $(,)?]) => {
36        pub trait $trait<Layout>: DataTypeLike + Sized {
37            fn $method(
38                stream_context: &StreamContext,
39                source: &ImageView<'_, Self, Layout>,
40                destination: &mut ImageViewMut<'_, Self, Layout>,
41                mask: &[u8],
42                mask_size: Size,
43                anchor: Point,
44            ) -> Result<()>;
45        }
46
47        pub fn $function<T>(
48            stream_context: &StreamContext,
49            source: &ImageView<'_, T, $layout>,
50            destination: &mut ImageViewMut<'_, T, $layout>,
51            mask: &[u8],
52            mask_size: Size,
53            anchor: Point,
54        ) -> Result<()>
55        where
56            T: $trait<$layout>,
57        {
58            T::$method(stream_context, source, destination, mask, mask_size, anchor)
59        }
60
61        $(
62            impl $trait<$layout> for $ty {
63                fn $method(
64                    stream_context: &StreamContext,
65                    source: &ImageView<'_, Self, $layout>,
66                    destination: &mut ImageViewMut<'_, Self, $layout>,
67                    mask: &[u8],
68                    mask_size: Size,
69                    anchor: Point,
70                ) -> Result<()> {
71                    $direct(stream_context, source, destination, mask, mask_size, anchor)
72                }
73            }
74        )*
75    };
76}
77
78impl_morphology_mask!(dilate_u8_c1, u8, C1, nppiDilate_8u_C1R_Ctx);
79impl_morphology_mask!(dilate_u8_c3, u8, C3, nppiDilate_8u_C3R_Ctx);
80impl_morphology_mask!(dilate_u8_c4, u8, C4, nppiDilate_8u_C4R_Ctx);
81impl_morphology_mask!(dilate_u8_ac4, u8, AC4, nppiDilate_8u_AC4R_Ctx);
82impl_morphology_mask!(dilate_u16_c1, u16, C1, nppiDilate_16u_C1R_Ctx);
83impl_morphology_mask!(dilate_u16_c3, u16, C3, nppiDilate_16u_C3R_Ctx);
84impl_morphology_mask!(dilate_u16_c4, u16, C4, nppiDilate_16u_C4R_Ctx);
85impl_morphology_mask!(dilate_u16_ac4, u16, AC4, nppiDilate_16u_AC4R_Ctx);
86impl_morphology_mask!(dilate_f32_c1, f32, C1, nppiDilate_32f_C1R_Ctx);
87impl_morphology_mask!(dilate_f32_c3, f32, C3, nppiDilate_32f_C3R_Ctx);
88impl_morphology_mask!(dilate_f32_c4, f32, C4, nppiDilate_32f_C4R_Ctx);
89impl_morphology_mask!(dilate_f32_ac4, f32, AC4, nppiDilate_32f_AC4R_Ctx);
90
91impl_morphology_mask!(erode_u8_c1, u8, C1, nppiErode_8u_C1R_Ctx);
92impl_morphology_mask!(erode_u8_c3, u8, C3, nppiErode_8u_C3R_Ctx);
93impl_morphology_mask!(erode_u8_c4, u8, C4, nppiErode_8u_C4R_Ctx);
94impl_morphology_mask!(erode_u8_ac4, u8, AC4, nppiErode_8u_AC4R_Ctx);
95impl_morphology_mask!(erode_u16_c1, u16, C1, nppiErode_16u_C1R_Ctx);
96impl_morphology_mask!(erode_u16_c3, u16, C3, nppiErode_16u_C3R_Ctx);
97impl_morphology_mask!(erode_u16_c4, u16, C4, nppiErode_16u_C4R_Ctx);
98impl_morphology_mask!(erode_u16_ac4, u16, AC4, nppiErode_16u_AC4R_Ctx);
99impl_morphology_mask!(erode_f32_c1, f32, C1, nppiErode_32f_C1R_Ctx);
100impl_morphology_mask!(erode_f32_c3, f32, C3, nppiErode_32f_C3R_Ctx);
101impl_morphology_mask!(erode_f32_c4, f32, C4, nppiErode_32f_C4R_Ctx);
102impl_morphology_mask!(erode_f32_ac4, f32, AC4, nppiErode_32f_AC4R_Ctx);
103
104impl_generic_morphology_mask!(DilateC1, dilate, dilate_c1, C1, [
105    u8 => dilate_u8_c1,
106    u16 => dilate_u16_c1,
107    f32 => dilate_f32_c1,
108]);
109impl_generic_morphology_mask!(DilateC3, dilate, dilate_c3, C3, [
110    u8 => dilate_u8_c3,
111    u16 => dilate_u16_c3,
112    f32 => dilate_f32_c3,
113]);
114impl_generic_morphology_mask!(DilateC4, dilate, dilate_c4, C4, [
115    u8 => dilate_u8_c4,
116    u16 => dilate_u16_c4,
117    f32 => dilate_f32_c4,
118]);
119impl_generic_morphology_mask!(DilateAc4, dilate, dilate_ac4, AC4, [
120    u8 => dilate_u8_ac4,
121    u16 => dilate_u16_ac4,
122    f32 => dilate_f32_ac4,
123]);
124impl_generic_morphology_mask!(ErodeC1, erode, erode_c1, C1, [
125    u8 => erode_u8_c1,
126    u16 => erode_u16_c1,
127    f32 => erode_f32_c1,
128]);
129impl_generic_morphology_mask!(ErodeC3, erode, erode_c3, C3, [
130    u8 => erode_u8_c3,
131    u16 => erode_u16_c3,
132    f32 => erode_f32_c3,
133]);
134impl_generic_morphology_mask!(ErodeC4, erode, erode_c4, C4, [
135    u8 => erode_u8_c4,
136    u16 => erode_u16_c4,
137    f32 => erode_f32_c4,
138]);
139impl_generic_morphology_mask!(ErodeAc4, erode, erode_ac4, AC4, [
140    u8 => erode_u8_ac4,
141    u16 => erode_u16_ac4,
142    f32 => erode_f32_ac4,
143]);