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}