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);