Skip to main content

singe_npp/image/
exchange_copy_subpixel.rs

1use super::*;
2
3pub(crate) fn copy_subpixel_u8_c1(
4    stream_context: &StreamContext,
5    source: &ImageView<'_, u8, C1>,
6    destination: &mut ImageViewMut<'_, u8, C1>,
7    x_shift: f32,
8    y_shift: f32,
9) -> Result<()> {
10    validate_subpixel_copy(source.size(), destination.size(), x_shift, y_shift)?;
11
12    unsafe {
13        try_ffi!(sys::nppiCopySubpix_8u_C1R_Ctx(
14            source.as_ptr().cast(),
15            source.step(),
16            destination.as_mut_ptr().cast(),
17            destination.step(),
18            destination.size().into(),
19            x_shift,
20            y_shift,
21            stream_context.as_raw(),
22        ))?;
23    }
24    Ok(())
25}
26
27macro_rules! impl_copy_subpixel {
28    ($name:ident, $ty:ty, $layout:ty, $ffi:ident) => {
29        pub(crate) fn $name(
30            stream_context: &StreamContext,
31            source: &ImageView<'_, $ty, $layout>,
32            destination: &mut ImageViewMut<'_, $ty, $layout>,
33            x_shift: f32,
34            y_shift: f32,
35        ) -> Result<()> {
36            validate_subpixel_copy(source.size(), destination.size(), x_shift, y_shift)?;
37
38            unsafe {
39                try_ffi!(sys::$ffi(
40                    source.as_ptr().cast(),
41                    source.step(),
42                    destination.as_mut_ptr().cast(),
43                    destination.step(),
44                    destination.size().into(),
45                    x_shift,
46                    y_shift,
47                    stream_context.as_raw(),
48                ))?;
49            }
50            Ok(())
51        }
52    };
53}
54
55macro_rules! impl_generic_copy_subpixel_operation {
56    ($trait:ident, $function:ident, $layout:ty, [$($ty:ty => $direct:ident),+ $(,)?]) => {
57        pub trait $trait<Layout>: DataTypeLike + Sized {
58            fn dispatch(
59                stream_context: &StreamContext,
60                source: &ImageView<'_, Self, Layout>,
61                destination: &mut ImageViewMut<'_, Self, Layout>,
62                x_shift: f32,
63                y_shift: f32,
64            ) -> Result<()>;
65        }
66
67        $(
68            impl $trait<$layout> for $ty {
69                fn dispatch(
70                    stream_context: &StreamContext,
71                    source: &ImageView<'_, Self, $layout>,
72                    destination: &mut ImageViewMut<'_, Self, $layout>,
73                    x_shift: f32,
74                    y_shift: f32,
75                ) -> Result<()> {
76                    $direct(stream_context, source, destination, x_shift, y_shift)
77                }
78            }
79        )+
80
81        pub fn $function<T>(
82            stream_context: &StreamContext,
83            source: &ImageView<'_, T, $layout>,
84            destination: &mut ImageViewMut<'_, T, $layout>,
85            x_shift: f32,
86            y_shift: f32,
87        ) -> Result<()>
88        where
89            T: $trait<$layout>,
90        {
91            T::dispatch(stream_context, source, destination, x_shift, y_shift)
92        }
93    };
94}
95
96impl_copy_subpixel!(copy_subpixel_u8_c3, u8, C3, nppiCopySubpix_8u_C3R_Ctx);
97impl_copy_subpixel!(copy_subpixel_u8_c4, u8, C4, nppiCopySubpix_8u_C4R_Ctx);
98impl_copy_subpixel!(copy_subpixel_u8_ac4, u8, AC4, nppiCopySubpix_8u_AC4R_Ctx);
99impl_copy_subpixel!(copy_subpixel_u16_c1, u16, C1, nppiCopySubpix_16u_C1R_Ctx);
100impl_copy_subpixel!(copy_subpixel_u16_c3, u16, C3, nppiCopySubpix_16u_C3R_Ctx);
101impl_copy_subpixel!(copy_subpixel_u16_c4, u16, C4, nppiCopySubpix_16u_C4R_Ctx);
102impl_copy_subpixel!(copy_subpixel_u16_ac4, u16, AC4, nppiCopySubpix_16u_AC4R_Ctx);
103impl_copy_subpixel!(copy_subpixel_i16_c1, i16, C1, nppiCopySubpix_16s_C1R_Ctx);
104impl_copy_subpixel!(copy_subpixel_i16_c3, i16, C3, nppiCopySubpix_16s_C3R_Ctx);
105impl_copy_subpixel!(copy_subpixel_i16_c4, i16, C4, nppiCopySubpix_16s_C4R_Ctx);
106impl_copy_subpixel!(copy_subpixel_i16_ac4, i16, AC4, nppiCopySubpix_16s_AC4R_Ctx);
107impl_copy_subpixel!(copy_subpixel_i32_c1, i32, C1, nppiCopySubpix_32s_C1R_Ctx);
108impl_copy_subpixel!(copy_subpixel_i32_c3, i32, C3, nppiCopySubpix_32s_C3R_Ctx);
109impl_copy_subpixel!(copy_subpixel_i32_c4, i32, C4, nppiCopySubpix_32s_C4R_Ctx);
110impl_copy_subpixel!(copy_subpixel_i32_ac4, i32, AC4, nppiCopySubpix_32s_AC4R_Ctx);
111impl_copy_subpixel!(copy_subpixel_f32_c1, f32, C1, nppiCopySubpix_32f_C1R_Ctx);
112impl_copy_subpixel!(copy_subpixel_f32_c3, f32, C3, nppiCopySubpix_32f_C3R_Ctx);
113impl_copy_subpixel!(copy_subpixel_f32_c4, f32, C4, nppiCopySubpix_32f_C4R_Ctx);
114impl_copy_subpixel!(copy_subpixel_f32_ac4, f32, AC4, nppiCopySubpix_32f_AC4R_Ctx);
115impl_generic_copy_subpixel_operation!(
116    CopySubpixelC1,
117    copy_subpixel_c1,
118    C1,
119    [
120        u8 => copy_subpixel_u8_c1,
121        u16 => copy_subpixel_u16_c1,
122        i16 => copy_subpixel_i16_c1,
123        i32 => copy_subpixel_i32_c1,
124        f32 => copy_subpixel_f32_c1,
125    ]
126);
127impl_generic_copy_subpixel_operation!(
128    CopySubpixelC3,
129    copy_subpixel_c3,
130    C3,
131    [
132        u8 => copy_subpixel_u8_c3,
133        u16 => copy_subpixel_u16_c3,
134        i16 => copy_subpixel_i16_c3,
135        i32 => copy_subpixel_i32_c3,
136        f32 => copy_subpixel_f32_c3,
137    ]
138);
139impl_generic_copy_subpixel_operation!(
140    CopySubpixelC4,
141    copy_subpixel_c4,
142    C4,
143    [
144        u8 => copy_subpixel_u8_c4,
145        u16 => copy_subpixel_u16_c4,
146        i16 => copy_subpixel_i16_c4,
147        i32 => copy_subpixel_i32_c4,
148        f32 => copy_subpixel_f32_c4,
149    ]
150);
151impl_generic_copy_subpixel_operation!(
152    CopySubpixelAC4,
153    copy_subpixel_ac4,
154    AC4,
155    [
156        u8 => copy_subpixel_u8_ac4,
157        u16 => copy_subpixel_u16_ac4,
158        i16 => copy_subpixel_i16_ac4,
159        i32 => copy_subpixel_i32_ac4,
160        f32 => copy_subpixel_f32_ac4,
161    ]
162);