Skip to main content

singe_npp/image/
filtering_wiener.rs

1use super::*;
2
3impl_filter_wiener_border!(
4    filter_wiener_border_u8_c1,
5    u8,
6    C1,
7    1,
8    nppiFilterWienerBorder_8u_C1R_Ctx
9);
10impl_filter_wiener_border!(
11    filter_wiener_border_u8_c3,
12    u8,
13    C3,
14    3,
15    nppiFilterWienerBorder_8u_C3R_Ctx
16);
17impl_filter_wiener_border!(
18    filter_wiener_border_u8_c4,
19    u8,
20    C4,
21    4,
22    nppiFilterWienerBorder_8u_C4R_Ctx
23);
24impl_filter_wiener_border!(
25    filter_wiener_border_u8_ac4,
26    u8,
27    AC4,
28    3,
29    nppiFilterWienerBorder_8u_AC4R_Ctx
30);
31impl_filter_wiener_border!(
32    filter_wiener_border_i16_c1,
33    i16,
34    C1,
35    1,
36    nppiFilterWienerBorder_16s_C1R_Ctx
37);
38impl_filter_wiener_border!(
39    filter_wiener_border_i16_c3,
40    i16,
41    C3,
42    3,
43    nppiFilterWienerBorder_16s_C3R_Ctx
44);
45impl_filter_wiener_border!(
46    filter_wiener_border_i16_c4,
47    i16,
48    C4,
49    4,
50    nppiFilterWienerBorder_16s_C4R_Ctx
51);
52impl_filter_wiener_border!(
53    filter_wiener_border_i16_ac4,
54    i16,
55    AC4,
56    3,
57    nppiFilterWienerBorder_16s_AC4R_Ctx
58);
59impl_filter_wiener_border!(
60    filter_wiener_border_f32_c1,
61    f32,
62    C1,
63    1,
64    nppiFilterWienerBorder_32f_C1R_Ctx
65);
66impl_filter_wiener_border!(
67    filter_wiener_border_f32_c3,
68    f32,
69    C3,
70    3,
71    nppiFilterWienerBorder_32f_C3R_Ctx
72);
73impl_filter_wiener_border!(
74    filter_wiener_border_f32_c4,
75    f32,
76    C4,
77    4,
78    nppiFilterWienerBorder_32f_C4R_Ctx
79);
80impl_filter_wiener_border!(
81    filter_wiener_border_f32_ac4,
82    f32,
83    AC4,
84    3,
85    nppiFilterWienerBorder_32f_AC4R_Ctx
86);
87
88pub trait FilterWienerBorder<L: ChannelLayout, const N: usize>: DataTypeLike {
89    fn filter_wiener_border(
90        stream_context: &StreamContext,
91        source: &ImageView<'_, Self, L>,
92        source_offset: Point,
93        destination: &mut ImageViewMut<'_, Self, L>,
94        mask_size: Size,
95        anchor: Point,
96        noise: &mut [f32; N],
97        border_type: BorderType,
98    ) -> Result<()>;
99}
100
101macro_rules! impl_filter_wiener_border_dispatch {
102    ($pixel_ty:ty, $layout:ty, $noise_len:expr, $name:ident) => {
103        impl FilterWienerBorder<$layout, $noise_len> for $pixel_ty {
104            fn filter_wiener_border(
105                stream_context: &StreamContext,
106                source: &ImageView<'_, Self, $layout>,
107                source_offset: Point,
108                destination: &mut ImageViewMut<'_, Self, $layout>,
109                mask_size: Size,
110                anchor: Point,
111                noise: &mut [f32; $noise_len],
112                border_type: BorderType,
113            ) -> Result<()> {
114                $name(
115                    stream_context,
116                    source,
117                    source_offset,
118                    destination,
119                    mask_size,
120                    anchor,
121                    noise,
122                    border_type,
123                )
124            }
125        }
126    };
127}
128
129impl_filter_wiener_border_dispatch!(u8, C1, 1, filter_wiener_border_u8_c1);
130impl_filter_wiener_border_dispatch!(u8, C3, 3, filter_wiener_border_u8_c3);
131impl_filter_wiener_border_dispatch!(u8, C4, 4, filter_wiener_border_u8_c4);
132impl_filter_wiener_border_dispatch!(u8, AC4, 3, filter_wiener_border_u8_ac4);
133impl_filter_wiener_border_dispatch!(i16, C1, 1, filter_wiener_border_i16_c1);
134impl_filter_wiener_border_dispatch!(i16, C3, 3, filter_wiener_border_i16_c3);
135impl_filter_wiener_border_dispatch!(i16, C4, 4, filter_wiener_border_i16_c4);
136impl_filter_wiener_border_dispatch!(i16, AC4, 3, filter_wiener_border_i16_ac4);
137impl_filter_wiener_border_dispatch!(f32, C1, 1, filter_wiener_border_f32_c1);
138impl_filter_wiener_border_dispatch!(f32, C3, 3, filter_wiener_border_f32_c3);
139impl_filter_wiener_border_dispatch!(f32, C4, 4, filter_wiener_border_f32_c4);
140impl_filter_wiener_border_dispatch!(f32, AC4, 3, filter_wiener_border_f32_ac4);
141
142pub fn filter_wiener_border<T, L, const N: usize>(
143    stream_context: &StreamContext,
144    source: &ImageView<'_, T, L>,
145    source_offset: Point,
146    destination: &mut ImageViewMut<'_, T, L>,
147    mask_size: Size,
148    anchor: Point,
149    noise: &mut [f32; N],
150    border_type: BorderType,
151) -> Result<()>
152where
153    T: FilterWienerBorder<L, N>,
154    L: ChannelLayout,
155{
156    T::filter_wiener_border(
157        stream_context,
158        source,
159        source_offset,
160        destination,
161        mask_size,
162        anchor,
163        noise,
164        border_type,
165    )
166}