Skip to main content

singe_npp/image/
morphology_3x3.rs

1use super::*;
2
3macro_rules! impl_morphology_3x3 {
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        ) -> Result<()> {
10            validate_same_size(source.size(), destination.size())?;
11
12            unsafe {
13                try_ffi!(sys::$ffi(
14                    source.as_ptr().cast(),
15                    source.step(),
16                    destination.as_mut_ptr().cast(),
17                    destination.step(),
18                    source.size().into(),
19                    stream_context.as_raw(),
20                ))?;
21            }
22            Ok(())
23        }
24    };
25}
26
27macro_rules! impl_generic_morphology_3x3 {
28    ($trait:ident, $method:ident, $function:ident, $layout:ty, [$($ty:ty => $direct:ident),* $(,)?]) => {
29        pub trait $trait<Layout>: DataTypeLike + Sized {
30            fn $method(
31                stream_context: &StreamContext,
32                source: &ImageView<'_, Self, Layout>,
33                destination: &mut ImageViewMut<'_, Self, Layout>,
34            ) -> Result<()>;
35        }
36
37        pub fn $function<T>(
38            stream_context: &StreamContext,
39            source: &ImageView<'_, T, $layout>,
40            destination: &mut ImageViewMut<'_, T, $layout>,
41        ) -> Result<()>
42        where
43            T: $trait<$layout>,
44        {
45            T::$method(stream_context, source, destination)
46        }
47
48        $(
49            impl $trait<$layout> for $ty {
50                fn $method(
51                    stream_context: &StreamContext,
52                    source: &ImageView<'_, Self, $layout>,
53                    destination: &mut ImageViewMut<'_, Self, $layout>,
54                ) -> Result<()> {
55                    $direct(stream_context, source, destination)
56                }
57            }
58        )*
59    };
60}
61
62impl_morphology_3x3!(dilate_3x3_u8_c1, u8, C1, nppiDilate3x3_8u_C1R_Ctx);
63impl_morphology_3x3!(dilate_3x3_u8_c3, u8, C3, nppiDilate3x3_8u_C3R_Ctx);
64impl_morphology_3x3!(dilate_3x3_u8_c4, u8, C4, nppiDilate3x3_8u_C4R_Ctx);
65impl_morphology_3x3!(dilate_3x3_u8_ac4, u8, AC4, nppiDilate3x3_8u_AC4R_Ctx);
66impl_morphology_3x3!(dilate_3x3_u16_c1, u16, C1, nppiDilate3x3_16u_C1R_Ctx);
67impl_morphology_3x3!(dilate_3x3_u16_c3, u16, C3, nppiDilate3x3_16u_C3R_Ctx);
68impl_morphology_3x3!(dilate_3x3_u16_c4, u16, C4, nppiDilate3x3_16u_C4R_Ctx);
69impl_morphology_3x3!(dilate_3x3_u16_ac4, u16, AC4, nppiDilate3x3_16u_AC4R_Ctx);
70impl_morphology_3x3!(dilate_3x3_f32_c1, f32, C1, nppiDilate3x3_32f_C1R_Ctx);
71impl_morphology_3x3!(dilate_3x3_f32_c3, f32, C3, nppiDilate3x3_32f_C3R_Ctx);
72impl_morphology_3x3!(dilate_3x3_f32_c4, f32, C4, nppiDilate3x3_32f_C4R_Ctx);
73impl_morphology_3x3!(dilate_3x3_f32_ac4, f32, AC4, nppiDilate3x3_32f_AC4R_Ctx);
74impl_morphology_3x3!(dilate_3x3_f64_c1, f64, C1, nppiDilate3x3_64f_C1R_Ctx);
75
76impl_morphology_3x3!(erode_3x3_u8_c1, u8, C1, nppiErode3x3_8u_C1R_Ctx);
77impl_morphology_3x3!(erode_3x3_u8_c3, u8, C3, nppiErode3x3_8u_C3R_Ctx);
78impl_morphology_3x3!(erode_3x3_u8_c4, u8, C4, nppiErode3x3_8u_C4R_Ctx);
79impl_morphology_3x3!(erode_3x3_u8_ac4, u8, AC4, nppiErode3x3_8u_AC4R_Ctx);
80impl_morphology_3x3!(erode_3x3_u16_c1, u16, C1, nppiErode3x3_16u_C1R_Ctx);
81impl_morphology_3x3!(erode_3x3_u16_c3, u16, C3, nppiErode3x3_16u_C3R_Ctx);
82impl_morphology_3x3!(erode_3x3_u16_c4, u16, C4, nppiErode3x3_16u_C4R_Ctx);
83impl_morphology_3x3!(erode_3x3_u16_ac4, u16, AC4, nppiErode3x3_16u_AC4R_Ctx);
84impl_morphology_3x3!(erode_3x3_f32_c1, f32, C1, nppiErode3x3_32f_C1R_Ctx);
85impl_morphology_3x3!(erode_3x3_f32_c3, f32, C3, nppiErode3x3_32f_C3R_Ctx);
86impl_morphology_3x3!(erode_3x3_f32_c4, f32, C4, nppiErode3x3_32f_C4R_Ctx);
87impl_morphology_3x3!(erode_3x3_f32_ac4, f32, AC4, nppiErode3x3_32f_AC4R_Ctx);
88impl_morphology_3x3!(erode_3x3_f64_c1, f64, C1, nppiErode3x3_64f_C1R_Ctx);
89
90impl_generic_morphology_3x3!(Dilate3x3C1, dilate_3x3, dilate_3x3_c1, C1, [
91    u8 => dilate_3x3_u8_c1,
92    u16 => dilate_3x3_u16_c1,
93    f32 => dilate_3x3_f32_c1,
94    f64 => dilate_3x3_f64_c1,
95]);
96impl_generic_morphology_3x3!(Dilate3x3C3, dilate_3x3, dilate_3x3_c3, C3, [
97    u8 => dilate_3x3_u8_c3,
98    u16 => dilate_3x3_u16_c3,
99    f32 => dilate_3x3_f32_c3,
100]);
101impl_generic_morphology_3x3!(Dilate3x3C4, dilate_3x3, dilate_3x3_c4, C4, [
102    u8 => dilate_3x3_u8_c4,
103    u16 => dilate_3x3_u16_c4,
104    f32 => dilate_3x3_f32_c4,
105]);
106impl_generic_morphology_3x3!(Dilate3x3Ac4, dilate_3x3, dilate_3x3_ac4, AC4, [
107    u8 => dilate_3x3_u8_ac4,
108    u16 => dilate_3x3_u16_ac4,
109    f32 => dilate_3x3_f32_ac4,
110]);
111impl_generic_morphology_3x3!(Erode3x3C1, erode_3x3, erode_3x3_c1, C1, [
112    u8 => erode_3x3_u8_c1,
113    u16 => erode_3x3_u16_c1,
114    f32 => erode_3x3_f32_c1,
115    f64 => erode_3x3_f64_c1,
116]);
117impl_generic_morphology_3x3!(Erode3x3C3, erode_3x3, erode_3x3_c3, C3, [
118    u8 => erode_3x3_u8_c3,
119    u16 => erode_3x3_u16_c3,
120    f32 => erode_3x3_f32_c3,
121]);
122impl_generic_morphology_3x3!(Erode3x3C4, erode_3x3, erode_3x3_c4, C4, [
123    u8 => erode_3x3_u8_c4,
124    u16 => erode_3x3_u16_c4,
125    f32 => erode_3x3_f32_c4,
126]);
127impl_generic_morphology_3x3!(Erode3x3Ac4, erode_3x3, erode_3x3_ac4, AC4, [
128    u8 => erode_3x3_u8_ac4,
129    u16 => erode_3x3_u16_ac4,
130    f32 => erode_3x3_f32_ac4,
131]);