Skip to main content

singe_npp/image/
geometry_mirror.rs

1use super::*;
2
3impl_mirror!(mirror_u8_c1, u8, C1, nppiMirror_8u_C1R_Ctx);
4impl_mirror!(mirror_u8_c3, u8, C3, nppiMirror_8u_C3R_Ctx);
5impl_mirror!(mirror_u8_c4, u8, C4, nppiMirror_8u_C4R_Ctx);
6impl_mirror!(mirror_u8_ac4, u8, AC4, nppiMirror_8u_AC4R_Ctx);
7impl_mirror!(mirror_u16_c1, u16, C1, nppiMirror_16u_C1R_Ctx);
8impl_mirror!(mirror_u16_c3, u16, C3, nppiMirror_16u_C3R_Ctx);
9impl_mirror!(mirror_u16_c4, u16, C4, nppiMirror_16u_C4R_Ctx);
10impl_mirror!(mirror_u16_ac4, u16, AC4, nppiMirror_16u_AC4R_Ctx);
11impl_mirror!(mirror_i16_c1, i16, C1, nppiMirror_16s_C1R_Ctx);
12impl_mirror!(mirror_i16_c3, i16, C3, nppiMirror_16s_C3R_Ctx);
13impl_mirror!(mirror_i16_c4, i16, C4, nppiMirror_16s_C4R_Ctx);
14impl_mirror!(mirror_i16_ac4, i16, AC4, nppiMirror_16s_AC4R_Ctx);
15impl_mirror!(mirror_i32_c1, i32, C1, nppiMirror_32s_C1R_Ctx);
16impl_mirror!(mirror_i32_c3, i32, C3, nppiMirror_32s_C3R_Ctx);
17impl_mirror!(mirror_i32_c4, i32, C4, nppiMirror_32s_C4R_Ctx);
18impl_mirror!(mirror_i32_ac4, i32, AC4, nppiMirror_32s_AC4R_Ctx);
19impl_mirror!(mirror_f32_c1, f32, C1, nppiMirror_32f_C1R_Ctx);
20impl_mirror!(mirror_f32_c3, f32, C3, nppiMirror_32f_C3R_Ctx);
21impl_mirror!(mirror_f32_c4, f32, C4, nppiMirror_32f_C4R_Ctx);
22impl_mirror!(mirror_f32_ac4, f32, AC4, nppiMirror_32f_AC4R_Ctx);
23
24impl_mirror_in_place!(mirror_u8_c1_in_place, u8, C1, nppiMirror_8u_C1IR_Ctx);
25impl_mirror_in_place!(mirror_u8_c3_in_place, u8, C3, nppiMirror_8u_C3IR_Ctx);
26impl_mirror_in_place!(mirror_u8_c4_in_place, u8, C4, nppiMirror_8u_C4IR_Ctx);
27impl_mirror_in_place!(mirror_u8_ac4_in_place, u8, AC4, nppiMirror_8u_AC4IR_Ctx);
28impl_mirror_in_place!(mirror_u16_c1_in_place, u16, C1, nppiMirror_16u_C1IR_Ctx);
29impl_mirror_in_place!(mirror_u16_c3_in_place, u16, C3, nppiMirror_16u_C3IR_Ctx);
30impl_mirror_in_place!(mirror_u16_c4_in_place, u16, C4, nppiMirror_16u_C4IR_Ctx);
31impl_mirror_in_place!(mirror_u16_ac4_in_place, u16, AC4, nppiMirror_16u_AC4IR_Ctx);
32impl_mirror_in_place!(mirror_i16_c1_in_place, i16, C1, nppiMirror_16s_C1IR_Ctx);
33impl_mirror_in_place!(mirror_i16_c3_in_place, i16, C3, nppiMirror_16s_C3IR_Ctx);
34impl_mirror_in_place!(mirror_i16_c4_in_place, i16, C4, nppiMirror_16s_C4IR_Ctx);
35impl_mirror_in_place!(mirror_i16_ac4_in_place, i16, AC4, nppiMirror_16s_AC4IR_Ctx);
36impl_mirror_in_place!(mirror_i32_c1_in_place, i32, C1, nppiMirror_32s_C1IR_Ctx);
37impl_mirror_in_place!(mirror_i32_c3_in_place, i32, C3, nppiMirror_32s_C3IR_Ctx);
38impl_mirror_in_place!(mirror_i32_c4_in_place, i32, C4, nppiMirror_32s_C4IR_Ctx);
39impl_mirror_in_place!(mirror_i32_ac4_in_place, i32, AC4, nppiMirror_32s_AC4IR_Ctx);
40impl_mirror_in_place!(mirror_f32_c1_in_place, f32, C1, nppiMirror_32f_C1IR_Ctx);
41impl_mirror_in_place!(mirror_f32_c3_in_place, f32, C3, nppiMirror_32f_C3IR_Ctx);
42impl_mirror_in_place!(mirror_f32_c4_in_place, f32, C4, nppiMirror_32f_C4IR_Ctx);
43impl_mirror_in_place!(mirror_f32_ac4_in_place, f32, AC4, nppiMirror_32f_AC4IR_Ctx);
44
45pub trait Mirror<L: ChannelLayout>: DataTypeLike {
46    fn mirror(
47        stream_context: &StreamContext,
48        source: &ImageView<'_, Self, L>,
49        destination: &mut ImageViewMut<'_, Self, L>,
50        axis: Axis,
51    ) -> Result<()>;
52}
53
54macro_rules! impl_mirror_dispatch {
55    ($ty:ty, $layout:ty, $function:ident) => {
56        impl Mirror<$layout> for $ty {
57            fn mirror(
58                stream_context: &StreamContext,
59                source: &ImageView<'_, Self, $layout>,
60                destination: &mut ImageViewMut<'_, Self, $layout>,
61                axis: Axis,
62            ) -> Result<()> {
63                $function(stream_context, source, destination, axis)
64            }
65        }
66    };
67}
68
69impl_mirror_dispatch!(u8, C1, mirror_u8_c1);
70impl_mirror_dispatch!(u8, C3, mirror_u8_c3);
71impl_mirror_dispatch!(u8, C4, mirror_u8_c4);
72impl_mirror_dispatch!(u8, AC4, mirror_u8_ac4);
73impl_mirror_dispatch!(u16, C1, mirror_u16_c1);
74impl_mirror_dispatch!(u16, C3, mirror_u16_c3);
75impl_mirror_dispatch!(u16, C4, mirror_u16_c4);
76impl_mirror_dispatch!(u16, AC4, mirror_u16_ac4);
77impl_mirror_dispatch!(i16, C1, mirror_i16_c1);
78impl_mirror_dispatch!(i16, C3, mirror_i16_c3);
79impl_mirror_dispatch!(i16, C4, mirror_i16_c4);
80impl_mirror_dispatch!(i16, AC4, mirror_i16_ac4);
81impl_mirror_dispatch!(i32, C1, mirror_i32_c1);
82impl_mirror_dispatch!(i32, C3, mirror_i32_c3);
83impl_mirror_dispatch!(i32, C4, mirror_i32_c4);
84impl_mirror_dispatch!(i32, AC4, mirror_i32_ac4);
85impl_mirror_dispatch!(f32, C1, mirror_f32_c1);
86impl_mirror_dispatch!(f32, C3, mirror_f32_c3);
87impl_mirror_dispatch!(f32, C4, mirror_f32_c4);
88impl_mirror_dispatch!(f32, AC4, mirror_f32_ac4);
89
90pub fn mirror<T, L>(
91    stream_context: &StreamContext,
92    source: &ImageView<'_, T, L>,
93    destination: &mut ImageViewMut<'_, T, L>,
94    axis: Axis,
95) -> Result<()>
96where
97    T: Mirror<L>,
98    L: ChannelLayout,
99{
100    T::mirror(stream_context, source, destination, axis)
101}
102
103pub trait MirrorInPlace<L: ChannelLayout>: DataTypeLike {
104    fn mirror_in_place(
105        stream_context: &StreamContext,
106        image: &mut ImageViewMut<'_, Self, L>,
107        axis: Axis,
108    ) -> Result<()>;
109}
110
111macro_rules! impl_mirror_in_place_dispatch {
112    ($ty:ty, $layout:ty, $function:ident) => {
113        impl MirrorInPlace<$layout> for $ty {
114            fn mirror_in_place(
115                stream_context: &StreamContext,
116                image: &mut ImageViewMut<'_, Self, $layout>,
117                axis: Axis,
118            ) -> Result<()> {
119                $function(stream_context, image, axis)
120            }
121        }
122    };
123}
124
125impl_mirror_in_place_dispatch!(u8, C1, mirror_u8_c1_in_place);
126impl_mirror_in_place_dispatch!(u8, C3, mirror_u8_c3_in_place);
127impl_mirror_in_place_dispatch!(u8, C4, mirror_u8_c4_in_place);
128impl_mirror_in_place_dispatch!(u8, AC4, mirror_u8_ac4_in_place);
129impl_mirror_in_place_dispatch!(u16, C1, mirror_u16_c1_in_place);
130impl_mirror_in_place_dispatch!(u16, C3, mirror_u16_c3_in_place);
131impl_mirror_in_place_dispatch!(u16, C4, mirror_u16_c4_in_place);
132impl_mirror_in_place_dispatch!(u16, AC4, mirror_u16_ac4_in_place);
133impl_mirror_in_place_dispatch!(i16, C1, mirror_i16_c1_in_place);
134impl_mirror_in_place_dispatch!(i16, C3, mirror_i16_c3_in_place);
135impl_mirror_in_place_dispatch!(i16, C4, mirror_i16_c4_in_place);
136impl_mirror_in_place_dispatch!(i16, AC4, mirror_i16_ac4_in_place);
137impl_mirror_in_place_dispatch!(i32, C1, mirror_i32_c1_in_place);
138impl_mirror_in_place_dispatch!(i32, C3, mirror_i32_c3_in_place);
139impl_mirror_in_place_dispatch!(i32, C4, mirror_i32_c4_in_place);
140impl_mirror_in_place_dispatch!(i32, AC4, mirror_i32_ac4_in_place);
141impl_mirror_in_place_dispatch!(f32, C1, mirror_f32_c1_in_place);
142impl_mirror_in_place_dispatch!(f32, C3, mirror_f32_c3_in_place);
143impl_mirror_in_place_dispatch!(f32, C4, mirror_f32_c4_in_place);
144impl_mirror_in_place_dispatch!(f32, AC4, mirror_f32_ac4_in_place);
145
146pub fn mirror_in_place<T, L>(
147    stream_context: &StreamContext,
148    image: &mut ImageViewMut<'_, T, L>,
149    axis: Axis,
150) -> Result<()>
151where
152    T: MirrorInPlace<L>,
153    L: ChannelLayout,
154{
155    T::mirror_in_place(stream_context, image, axis)
156}
157
158impl_mirror_batch!(mirror_batch_f32_c1, f32, C1, nppiMirrorBatch_32f_C1R_Ctx);
159impl_mirror_batch!(mirror_batch_f32_c3, f32, C3, nppiMirrorBatch_32f_C3R_Ctx);
160impl_mirror_batch!(mirror_batch_f32_c4, f32, C4, nppiMirrorBatch_32f_C4R_Ctx);
161impl_mirror_batch!(mirror_batch_f32_ac4, f32, AC4, nppiMirrorBatch_32f_AC4R_Ctx);
162impl_mirror_batch_in_place!(
163    mirror_batch_f32_c1_in_place,
164    f32,
165    C1,
166    nppiMirrorBatch_32f_C1IR_Ctx
167);
168impl_mirror_batch_in_place!(
169    mirror_batch_f32_c3_in_place,
170    f32,
171    C3,
172    nppiMirrorBatch_32f_C3IR_Ctx
173);
174impl_mirror_batch_in_place!(
175    mirror_batch_f32_c4_in_place,
176    f32,
177    C4,
178    nppiMirrorBatch_32f_C4IR_Ctx
179);
180impl_mirror_batch_in_place!(
181    mirror_batch_f32_ac4_in_place,
182    f32,
183    AC4,
184    nppiMirrorBatch_32f_AC4IR_Ctx
185);
186
187pub trait MirrorBatch<L: ChannelLayout>: DataTypeLike {
188    fn mirror_batch(
189        stream_context: &StreamContext,
190        axis: Axis,
191        sources: &[ImageView<'_, Self, L>],
192        destinations: &mut [ImageViewMut<'_, Self, L>],
193    ) -> Result<()>;
194}
195
196macro_rules! impl_mirror_batch_dispatch {
197    ($ty:ty, $layout:ty, $function:ident) => {
198        impl MirrorBatch<$layout> for $ty {
199            fn mirror_batch(
200                stream_context: &StreamContext,
201                axis: Axis,
202                sources: &[ImageView<'_, Self, $layout>],
203                destinations: &mut [ImageViewMut<'_, Self, $layout>],
204            ) -> Result<()> {
205                $function(stream_context, axis, sources, destinations)
206            }
207        }
208    };
209}
210
211impl_mirror_batch_dispatch!(f32, C1, mirror_batch_f32_c1);
212impl_mirror_batch_dispatch!(f32, C3, mirror_batch_f32_c3);
213impl_mirror_batch_dispatch!(f32, C4, mirror_batch_f32_c4);
214impl_mirror_batch_dispatch!(f32, AC4, mirror_batch_f32_ac4);
215
216pub fn mirror_batch<T, L>(
217    stream_context: &StreamContext,
218    axis: Axis,
219    sources: &[ImageView<'_, T, L>],
220    destinations: &mut [ImageViewMut<'_, T, L>],
221) -> Result<()>
222where
223    T: MirrorBatch<L>,
224    L: ChannelLayout,
225{
226    T::mirror_batch(stream_context, axis, sources, destinations)
227}
228
229pub trait MirrorBatchInPlace<L: ChannelLayout>: DataTypeLike {
230    fn mirror_batch_in_place(
231        stream_context: &StreamContext,
232        axis: Axis,
233        images: &mut [ImageViewMut<'_, Self, L>],
234    ) -> Result<()>;
235}
236
237macro_rules! impl_mirror_batch_in_place_dispatch {
238    ($ty:ty, $layout:ty, $function:ident) => {
239        impl MirrorBatchInPlace<$layout> for $ty {
240            fn mirror_batch_in_place(
241                stream_context: &StreamContext,
242                axis: Axis,
243                images: &mut [ImageViewMut<'_, Self, $layout>],
244            ) -> Result<()> {
245                $function(stream_context, axis, images)
246            }
247        }
248    };
249}
250
251impl_mirror_batch_in_place_dispatch!(f32, C1, mirror_batch_f32_c1_in_place);
252impl_mirror_batch_in_place_dispatch!(f32, C3, mirror_batch_f32_c3_in_place);
253impl_mirror_batch_in_place_dispatch!(f32, C4, mirror_batch_f32_c4_in_place);
254impl_mirror_batch_in_place_dispatch!(f32, AC4, mirror_batch_f32_ac4_in_place);
255
256pub fn mirror_batch_in_place<T, L>(
257    stream_context: &StreamContext,
258    axis: Axis,
259    images: &mut [ImageViewMut<'_, T, L>],
260) -> Result<()>
261where
262    T: MirrorBatchInPlace<L>,
263    L: ChannelLayout,
264{
265    T::mirror_batch_in_place(stream_context, axis, images)
266}