Skip to main content

singe_npp/image/
color_grayscale.rs

1use super::*;
2
3impl_rgb_to_gray!(rgb_to_gray_u8_c3, u8, C3, nppiRGBToGray_8u_C3C1R_Ctx);
4impl_rgb_to_gray!(rgb_to_gray_u8_ac4, u8, AC4, nppiRGBToGray_8u_AC4C1R_Ctx);
5impl_rgb_to_gray!(rgb_to_gray_u16_c3, u16, C3, nppiRGBToGray_16u_C3C1R_Ctx);
6impl_rgb_to_gray!(rgb_to_gray_u16_ac4, u16, AC4, nppiRGBToGray_16u_AC4C1R_Ctx);
7impl_rgb_to_gray!(rgb_to_gray_i16_c3, i16, C3, nppiRGBToGray_16s_C3C1R_Ctx);
8impl_rgb_to_gray!(rgb_to_gray_i16_ac4, i16, AC4, nppiRGBToGray_16s_AC4C1R_Ctx);
9impl_rgb_to_gray!(rgb_to_gray_f32_c3, f32, C3, nppiRGBToGray_32f_C3C1R_Ctx);
10impl_rgb_to_gray!(rgb_to_gray_f32_ac4, f32, AC4, nppiRGBToGray_32f_AC4C1R_Ctx);
11impl_generic_rgb_to_gray!(RgbToGrayC3, rgb_to_gray, rgb_to_gray_c3, C3, [
12    u8 => rgb_to_gray_u8_c3,
13    u16 => rgb_to_gray_u16_c3,
14    i16 => rgb_to_gray_i16_c3,
15    f32 => rgb_to_gray_f32_c3,
16]);
17impl_generic_rgb_to_gray!(RgbToGrayAC4, rgb_to_gray, rgb_to_gray_ac4, AC4, [
18    u8 => rgb_to_gray_u8_ac4,
19    u16 => rgb_to_gray_u16_ac4,
20    i16 => rgb_to_gray_i16_ac4,
21    f32 => rgb_to_gray_f32_ac4,
22]);
23impl_color_to_gray!(color_to_gray_u8_c3, u8, C3, 3, nppiColorToGray_8u_C3C1R_Ctx);
24impl_color_to_gray!(
25    color_to_gray_u8_ac4,
26    u8,
27    AC4,
28    3,
29    nppiColorToGray_8u_AC4C1R_Ctx
30);
31impl_color_to_gray!(color_to_gray_u8_c4, u8, C4, 4, nppiColorToGray_8u_C4C1R_Ctx);
32impl_color_to_gray!(
33    color_to_gray_u16_c3,
34    u16,
35    C3,
36    3,
37    nppiColorToGray_16u_C3C1R_Ctx
38);
39impl_color_to_gray!(
40    color_to_gray_u16_ac4,
41    u16,
42    AC4,
43    3,
44    nppiColorToGray_16u_AC4C1R_Ctx
45);
46impl_color_to_gray!(
47    color_to_gray_u16_c4,
48    u16,
49    C4,
50    4,
51    nppiColorToGray_16u_C4C1R_Ctx
52);
53impl_color_to_gray!(
54    color_to_gray_i16_c3,
55    i16,
56    C3,
57    3,
58    nppiColorToGray_16s_C3C1R_Ctx
59);
60impl_color_to_gray!(
61    color_to_gray_i16_ac4,
62    i16,
63    AC4,
64    3,
65    nppiColorToGray_16s_AC4C1R_Ctx
66);
67impl_color_to_gray!(
68    color_to_gray_i16_c4,
69    i16,
70    C4,
71    4,
72    nppiColorToGray_16s_C4C1R_Ctx
73);
74impl_color_to_gray!(
75    color_to_gray_f32_c3,
76    f32,
77    C3,
78    3,
79    nppiColorToGray_32f_C3C1R_Ctx
80);
81impl_color_to_gray!(
82    color_to_gray_f32_ac4,
83    f32,
84    AC4,
85    3,
86    nppiColorToGray_32f_AC4C1R_Ctx
87);
88impl_color_to_gray!(
89    color_to_gray_f32_c4,
90    f32,
91    C4,
92    4,
93    nppiColorToGray_32f_C4C1R_Ctx
94);
95impl_generic_color_to_gray!(ColorToGrayC3, color_to_gray, color_to_gray_c3, C3, 3, [
96    u8 => color_to_gray_u8_c3,
97    u16 => color_to_gray_u16_c3,
98    i16 => color_to_gray_i16_c3,
99    f32 => color_to_gray_f32_c3,
100]);
101impl_generic_color_to_gray!(
102    ColorToGrayAC4,
103    color_to_gray,
104    color_to_gray_ac4,
105    AC4,
106    3,
107    [
108        u8 => color_to_gray_u8_ac4,
109        u16 => color_to_gray_u16_ac4,
110        i16 => color_to_gray_i16_ac4,
111        f32 => color_to_gray_f32_ac4,
112    ]
113);
114impl_generic_color_to_gray!(ColorToGrayC4, color_to_gray, color_to_gray_c4, C4, 4, [
115    u8 => color_to_gray_u8_c4,
116    u16 => color_to_gray_u16_c4,
117    i16 => color_to_gray_i16_c4,
118    f32 => color_to_gray_f32_c4,
119]);
120impl_gradient_color_to_gray!(
121    gradient_color_to_gray_u8_c3,
122    u8,
123    nppiGradientColorToGray_8u_C3C1R_Ctx
124);
125impl_gradient_color_to_gray!(
126    gradient_color_to_gray_u16_c3,
127    u16,
128    nppiGradientColorToGray_16u_C3C1R_Ctx
129);
130impl_gradient_color_to_gray!(
131    gradient_color_to_gray_i16_c3,
132    i16,
133    nppiGradientColorToGray_16s_C3C1R_Ctx
134);
135impl_gradient_color_to_gray!(
136    gradient_color_to_gray_f32_c3,
137    f32,
138    nppiGradientColorToGray_32f_C3C1R_Ctx
139);
140
141pub trait GradientColorToGray: DataTypeLike {
142    fn gradient_color_to_gray(
143        stream_context: &StreamContext,
144        source: &ImageView<'_, Self, C3>,
145        destination: &mut ImageViewMut<'_, Self, C1>,
146        norm: ImageNormalization,
147    ) -> Result<()>;
148}
149
150macro_rules! impl_gradient_color_to_gray_dispatch {
151    ($ty:ty, $function:ident) => {
152        impl GradientColorToGray for $ty {
153            fn gradient_color_to_gray(
154                stream_context: &StreamContext,
155                source: &ImageView<'_, Self, C3>,
156                destination: &mut ImageViewMut<'_, Self, C1>,
157                norm: ImageNormalization,
158            ) -> Result<()> {
159                $function(stream_context, source, destination, norm)
160            }
161        }
162    };
163}
164
165impl_gradient_color_to_gray_dispatch!(u8, gradient_color_to_gray_u8_c3);
166impl_gradient_color_to_gray_dispatch!(u16, gradient_color_to_gray_u16_c3);
167impl_gradient_color_to_gray_dispatch!(i16, gradient_color_to_gray_i16_c3);
168impl_gradient_color_to_gray_dispatch!(f32, gradient_color_to_gray_f32_c3);
169
170pub fn gradient_color_to_gray<T>(
171    stream_context: &StreamContext,
172    source: &ImageView<'_, T, C3>,
173    destination: &mut ImageViewMut<'_, T, C1>,
174    norm: ImageNormalization,
175) -> Result<()>
176where
177    T: GradientColorToGray,
178{
179    T::gradient_color_to_gray(stream_context, source, destination, norm)
180}
181
182impl_cfa_to_rgb!(cfa_to_rgb_u8_c3, u8, C3, nppiCFAToRGB_8u_C1C3R_Ctx);
183impl_cfa_to_rgba!(cfa_to_rgba_u8_ac4, u8, nppiCFAToRGBA_8u_C1AC4R_Ctx);
184impl_cfa_to_rgb!(cfa_to_rgb_u16_c3, u16, C3, nppiCFAToRGB_16u_C1C3R_Ctx);
185impl_cfa_to_rgba!(cfa_to_rgba_u16_ac4, u16, nppiCFAToRGBA_16u_C1AC4R_Ctx);
186impl_cfa_to_rgb!(cfa_to_rgb_u32_c3, u32, C3, nppiCFAToRGB_32u_C1C3R_Ctx);
187impl_cfa_to_rgba!(cfa_to_rgba_u32_ac4, u32, nppiCFAToRGBA_32u_C1AC4R_Ctx);
188
189pub trait CfaToRgb: DataTypeLike {
190    fn cfa_to_rgb(
191        stream_context: &StreamContext,
192        source: &ImageView<'_, Self, C1>,
193        source_roi: Rectangle,
194        destination: &mut ImageViewMut<'_, Self, C3>,
195        grid: BayerGridPosition,
196    ) -> Result<()>;
197}
198
199macro_rules! impl_cfa_to_rgb_dispatch {
200    ($ty:ty, $function:ident) => {
201        impl CfaToRgb for $ty {
202            fn cfa_to_rgb(
203                stream_context: &StreamContext,
204                source: &ImageView<'_, Self, C1>,
205                source_roi: Rectangle,
206                destination: &mut ImageViewMut<'_, Self, C3>,
207                grid: BayerGridPosition,
208            ) -> Result<()> {
209                $function(stream_context, source, source_roi, destination, grid)
210            }
211        }
212    };
213}
214
215impl_cfa_to_rgb_dispatch!(u8, cfa_to_rgb_u8_c3);
216impl_cfa_to_rgb_dispatch!(u16, cfa_to_rgb_u16_c3);
217impl_cfa_to_rgb_dispatch!(u32, cfa_to_rgb_u32_c3);
218
219pub fn cfa_to_rgb<T>(
220    stream_context: &StreamContext,
221    source: &ImageView<'_, T, C1>,
222    source_roi: Rectangle,
223    destination: &mut ImageViewMut<'_, T, C3>,
224    grid: BayerGridPosition,
225) -> Result<()>
226where
227    T: CfaToRgb,
228{
229    T::cfa_to_rgb(stream_context, source, source_roi, destination, grid)
230}
231
232pub trait CfaToRgba: DataTypeLike {
233    fn cfa_to_rgba(
234        stream_context: &StreamContext,
235        source: &ImageView<'_, Self, C1>,
236        source_roi: Rectangle,
237        destination: &mut ImageViewMut<'_, Self, AC4>,
238        grid: BayerGridPosition,
239        alpha: Self,
240    ) -> Result<()>;
241}
242
243macro_rules! impl_cfa_to_rgba_dispatch {
244    ($ty:ty, $function:ident) => {
245        impl CfaToRgba for $ty {
246            fn cfa_to_rgba(
247                stream_context: &StreamContext,
248                source: &ImageView<'_, Self, C1>,
249                source_roi: Rectangle,
250                destination: &mut ImageViewMut<'_, Self, AC4>,
251                grid: BayerGridPosition,
252                alpha: Self,
253            ) -> Result<()> {
254                $function(stream_context, source, source_roi, destination, grid, alpha)
255            }
256        }
257    };
258}
259
260impl_cfa_to_rgba_dispatch!(u8, cfa_to_rgba_u8_ac4);
261impl_cfa_to_rgba_dispatch!(u16, cfa_to_rgba_u16_ac4);
262impl_cfa_to_rgba_dispatch!(u32, cfa_to_rgba_u32_ac4);
263
264pub fn cfa_to_rgba<T>(
265    stream_context: &StreamContext,
266    source: &ImageView<'_, T, C1>,
267    source_roi: Rectangle,
268    destination: &mut ImageViewMut<'_, T, AC4>,
269    grid: BayerGridPosition,
270    alpha: T,
271) -> Result<()>
272where
273    T: CfaToRgba,
274{
275    T::cfa_to_rgba(stream_context, source, source_roi, destination, grid, alpha)
276}