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}