1use super::*;
2
3impl_warp_perspective_back!(
4 warp_perspective_back_u8_c1,
5 u8,
6 C1,
7 nppiWarpPerspectiveBack_8u_C1R_Ctx
8);
9impl_warp_perspective_back!(
10 warp_perspective_back_u8_c3,
11 u8,
12 C3,
13 nppiWarpPerspectiveBack_8u_C3R_Ctx
14);
15impl_warp_perspective_back!(
16 warp_perspective_back_u8_c4,
17 u8,
18 C4,
19 nppiWarpPerspectiveBack_8u_C4R_Ctx
20);
21impl_warp_perspective_back!(
22 warp_perspective_back_u8_ac4,
23 u8,
24 AC4,
25 nppiWarpPerspectiveBack_8u_AC4R_Ctx
26);
27impl_warp_perspective_back!(
28 warp_perspective_back_u16_c1,
29 u16,
30 C1,
31 nppiWarpPerspectiveBack_16u_C1R_Ctx
32);
33impl_warp_perspective_back!(
34 warp_perspective_back_u16_c3,
35 u16,
36 C3,
37 nppiWarpPerspectiveBack_16u_C3R_Ctx
38);
39impl_warp_perspective_back!(
40 warp_perspective_back_u16_c4,
41 u16,
42 C4,
43 nppiWarpPerspectiveBack_16u_C4R_Ctx
44);
45impl_warp_perspective_back!(
46 warp_perspective_back_u16_ac4,
47 u16,
48 AC4,
49 nppiWarpPerspectiveBack_16u_AC4R_Ctx
50);
51impl_warp_perspective_back!(
52 warp_perspective_back_i32_c1,
53 i32,
54 C1,
55 nppiWarpPerspectiveBack_32s_C1R_Ctx
56);
57impl_warp_perspective_back!(
58 warp_perspective_back_i32_c3,
59 i32,
60 C3,
61 nppiWarpPerspectiveBack_32s_C3R_Ctx
62);
63impl_warp_perspective_back!(
64 warp_perspective_back_i32_c4,
65 i32,
66 C4,
67 nppiWarpPerspectiveBack_32s_C4R_Ctx
68);
69impl_warp_perspective_back!(
70 warp_perspective_back_i32_ac4,
71 i32,
72 AC4,
73 nppiWarpPerspectiveBack_32s_AC4R_Ctx
74);
75impl_warp_perspective_back!(
76 warp_perspective_back_f32_c1,
77 f32,
78 C1,
79 nppiWarpPerspectiveBack_32f_C1R_Ctx
80);
81impl_warp_perspective_back!(
82 warp_perspective_back_f32_c3,
83 f32,
84 C3,
85 nppiWarpPerspectiveBack_32f_C3R_Ctx
86);
87impl_warp_perspective_back!(
88 warp_perspective_back_f32_c4,
89 f32,
90 C4,
91 nppiWarpPerspectiveBack_32f_C4R_Ctx
92);
93impl_warp_perspective_back!(
94 warp_perspective_back_f32_ac4,
95 f32,
96 AC4,
97 nppiWarpPerspectiveBack_32f_AC4R_Ctx
98);
99
100pub trait WarpPerspectiveBackOperation<L: ChannelLayout>: DataTypeLike {
101 fn warp_perspective_back(
102 stream_context: &StreamContext,
103 warp: &WarpPerspective,
104 source: &ImageView<'_, Self, L>,
105 destination: &mut ImageViewMut<'_, Self, L>,
106 ) -> Result<()>;
107}
108
109macro_rules! impl_warp_perspective_back_operation {
110 ($ty:ty, $layout:ty, $function:ident) => {
111 impl WarpPerspectiveBackOperation<$layout> for $ty {
112 fn warp_perspective_back(
113 stream_context: &StreamContext,
114 warp: &WarpPerspective,
115 source: &ImageView<'_, Self, $layout>,
116 destination: &mut ImageViewMut<'_, Self, $layout>,
117 ) -> Result<()> {
118 $function(stream_context, warp, source, destination)
119 }
120 }
121 };
122}
123
124impl_warp_perspective_back_operation!(u8, C1, warp_perspective_back_u8_c1);
125impl_warp_perspective_back_operation!(u8, C3, warp_perspective_back_u8_c3);
126impl_warp_perspective_back_operation!(u8, C4, warp_perspective_back_u8_c4);
127impl_warp_perspective_back_operation!(u8, AC4, warp_perspective_back_u8_ac4);
128impl_warp_perspective_back_operation!(u16, C1, warp_perspective_back_u16_c1);
129impl_warp_perspective_back_operation!(u16, C3, warp_perspective_back_u16_c3);
130impl_warp_perspective_back_operation!(u16, C4, warp_perspective_back_u16_c4);
131impl_warp_perspective_back_operation!(u16, AC4, warp_perspective_back_u16_ac4);
132impl_warp_perspective_back_operation!(i32, C1, warp_perspective_back_i32_c1);
133impl_warp_perspective_back_operation!(i32, C3, warp_perspective_back_i32_c3);
134impl_warp_perspective_back_operation!(i32, C4, warp_perspective_back_i32_c4);
135impl_warp_perspective_back_operation!(i32, AC4, warp_perspective_back_i32_ac4);
136impl_warp_perspective_back_operation!(f32, C1, warp_perspective_back_f32_c1);
137impl_warp_perspective_back_operation!(f32, C3, warp_perspective_back_f32_c3);
138impl_warp_perspective_back_operation!(f32, C4, warp_perspective_back_f32_c4);
139impl_warp_perspective_back_operation!(f32, AC4, warp_perspective_back_f32_ac4);
140
141pub fn warp_perspective_back<T, L>(
142 stream_context: &StreamContext,
143 warp: &WarpPerspective,
144 source: &ImageView<'_, T, L>,
145 destination: &mut ImageViewMut<'_, T, L>,
146) -> Result<()>
147where
148 T: WarpPerspectiveBackOperation<L>,
149 L: ChannelLayout,
150{
151 T::warp_perspective_back(stream_context, warp, source, destination)
152}
153
154impl_warp_perspective_back_planar!(
155 warp_perspective_back_u8_p3,
156 u8,
157 3,
158 nppiWarpPerspectiveBack_8u_P3R_Ctx
159);
160impl_warp_perspective_back_planar!(
161 warp_perspective_back_u8_p4,
162 u8,
163 4,
164 nppiWarpPerspectiveBack_8u_P4R_Ctx
165);
166impl_warp_perspective_back_planar!(
167 warp_perspective_back_u16_p3,
168 u16,
169 3,
170 nppiWarpPerspectiveBack_16u_P3R_Ctx
171);
172impl_warp_perspective_back_planar!(
173 warp_perspective_back_u16_p4,
174 u16,
175 4,
176 nppiWarpPerspectiveBack_16u_P4R_Ctx
177);
178impl_warp_perspective_back_planar!(
179 warp_perspective_back_i32_p3,
180 i32,
181 3,
182 nppiWarpPerspectiveBack_32s_P3R_Ctx
183);
184impl_warp_perspective_back_planar!(
185 warp_perspective_back_i32_p4,
186 i32,
187 4,
188 nppiWarpPerspectiveBack_32s_P4R_Ctx
189);
190impl_warp_perspective_back_planar!(
191 warp_perspective_back_f32_p3,
192 f32,
193 3,
194 nppiWarpPerspectiveBack_32f_P3R_Ctx
195);
196impl_warp_perspective_back_planar!(
197 warp_perspective_back_f32_p4,
198 f32,
199 4,
200 nppiWarpPerspectiveBack_32f_P4R_Ctx
201);
202
203pub trait WarpPerspectiveBackPlanar<const PLANES: usize>: DataTypeLike {
204 fn warp_perspective_back_planar(
205 stream_context: &StreamContext,
206 warp: &WarpPerspective,
207 source: &PlanarImageView<'_, Self, PLANES>,
208 destination: &mut PlanarImageViewMut<'_, Self, PLANES>,
209 ) -> Result<()>;
210}
211
212macro_rules! impl_warp_perspective_back_planar_dispatch {
213 ($ty:ty, $planes:literal, $function:ident) => {
214 impl WarpPerspectiveBackPlanar<$planes> for $ty {
215 fn warp_perspective_back_planar(
216 stream_context: &StreamContext,
217 warp: &WarpPerspective,
218 source: &PlanarImageView<'_, Self, $planes>,
219 destination: &mut PlanarImageViewMut<'_, Self, $planes>,
220 ) -> Result<()> {
221 $function(stream_context, warp, source, destination)
222 }
223 }
224 };
225}
226
227impl_warp_perspective_back_planar_dispatch!(u8, 3, warp_perspective_back_u8_p3);
228impl_warp_perspective_back_planar_dispatch!(u8, 4, warp_perspective_back_u8_p4);
229impl_warp_perspective_back_planar_dispatch!(u16, 3, warp_perspective_back_u16_p3);
230impl_warp_perspective_back_planar_dispatch!(u16, 4, warp_perspective_back_u16_p4);
231impl_warp_perspective_back_planar_dispatch!(i32, 3, warp_perspective_back_i32_p3);
232impl_warp_perspective_back_planar_dispatch!(i32, 4, warp_perspective_back_i32_p4);
233impl_warp_perspective_back_planar_dispatch!(f32, 3, warp_perspective_back_f32_p3);
234impl_warp_perspective_back_planar_dispatch!(f32, 4, warp_perspective_back_f32_p4);
235
236pub fn warp_perspective_back_planar<T, const PLANES: usize>(
237 stream_context: &StreamContext,
238 warp: &WarpPerspective,
239 source: &PlanarImageView<'_, T, PLANES>,
240 destination: &mut PlanarImageViewMut<'_, T, PLANES>,
241) -> Result<()>
242where
243 T: WarpPerspectiveBackPlanar<PLANES>,
244{
245 T::warp_perspective_back_planar(stream_context, warp, source, destination)
246}
247
248impl_warp_affine_back!(
249 warp_affine_back_u8_c1,
250 u8,
251 C1,
252 nppiWarpAffineBack_8u_C1R_Ctx
253);
254impl_warp_affine_back!(
255 warp_affine_back_u8_c3,
256 u8,
257 C3,
258 nppiWarpAffineBack_8u_C3R_Ctx
259);
260impl_warp_affine_back!(
261 warp_affine_back_u8_c4,
262 u8,
263 C4,
264 nppiWarpAffineBack_8u_C4R_Ctx
265);
266impl_warp_affine_back!(
267 warp_affine_back_u8_ac4,
268 u8,
269 AC4,
270 nppiWarpAffineBack_8u_AC4R_Ctx
271);
272impl_warp_affine_back!(
273 warp_affine_back_u16_c1,
274 u16,
275 C1,
276 nppiWarpAffineBack_16u_C1R_Ctx
277);
278impl_warp_affine_back!(
279 warp_affine_back_u16_c3,
280 u16,
281 C3,
282 nppiWarpAffineBack_16u_C3R_Ctx
283);
284impl_warp_affine_back!(
285 warp_affine_back_u16_c4,
286 u16,
287 C4,
288 nppiWarpAffineBack_16u_C4R_Ctx
289);
290impl_warp_affine_back!(
291 warp_affine_back_u16_ac4,
292 u16,
293 AC4,
294 nppiWarpAffineBack_16u_AC4R_Ctx
295);
296impl_warp_affine_back!(
297 warp_affine_back_i32_c1,
298 i32,
299 C1,
300 nppiWarpAffineBack_32s_C1R_Ctx
301);
302impl_warp_affine_back!(
303 warp_affine_back_i32_c3,
304 i32,
305 C3,
306 nppiWarpAffineBack_32s_C3R_Ctx
307);
308impl_warp_affine_back!(
309 warp_affine_back_i32_c4,
310 i32,
311 C4,
312 nppiWarpAffineBack_32s_C4R_Ctx
313);
314impl_warp_affine_back!(
315 warp_affine_back_i32_ac4,
316 i32,
317 AC4,
318 nppiWarpAffineBack_32s_AC4R_Ctx
319);
320impl_warp_affine_back!(
321 warp_affine_back_f32_c1,
322 f32,
323 C1,
324 nppiWarpAffineBack_32f_C1R_Ctx
325);
326impl_warp_affine_back!(
327 warp_affine_back_f32_c3,
328 f32,
329 C3,
330 nppiWarpAffineBack_32f_C3R_Ctx
331);
332impl_warp_affine_back!(
333 warp_affine_back_f32_c4,
334 f32,
335 C4,
336 nppiWarpAffineBack_32f_C4R_Ctx
337);
338impl_warp_affine_back!(
339 warp_affine_back_f32_ac4,
340 f32,
341 AC4,
342 nppiWarpAffineBack_32f_AC4R_Ctx
343);
344
345pub trait WarpAffineBackOperation<L: ChannelLayout>: DataTypeLike {
346 fn warp_affine_back(
347 stream_context: &StreamContext,
348 warp: &WarpAffine,
349 source: &ImageView<'_, Self, L>,
350 destination: &mut ImageViewMut<'_, Self, L>,
351 ) -> Result<()>;
352}
353
354macro_rules! impl_warp_affine_back_operation {
355 ($ty:ty, $layout:ty, $function:ident) => {
356 impl WarpAffineBackOperation<$layout> for $ty {
357 fn warp_affine_back(
358 stream_context: &StreamContext,
359 warp: &WarpAffine,
360 source: &ImageView<'_, Self, $layout>,
361 destination: &mut ImageViewMut<'_, Self, $layout>,
362 ) -> Result<()> {
363 $function(stream_context, warp, source, destination)
364 }
365 }
366 };
367}
368
369impl_warp_affine_back_operation!(u8, C1, warp_affine_back_u8_c1);
370impl_warp_affine_back_operation!(u8, C3, warp_affine_back_u8_c3);
371impl_warp_affine_back_operation!(u8, C4, warp_affine_back_u8_c4);
372impl_warp_affine_back_operation!(u8, AC4, warp_affine_back_u8_ac4);
373impl_warp_affine_back_operation!(u16, C1, warp_affine_back_u16_c1);
374impl_warp_affine_back_operation!(u16, C3, warp_affine_back_u16_c3);
375impl_warp_affine_back_operation!(u16, C4, warp_affine_back_u16_c4);
376impl_warp_affine_back_operation!(u16, AC4, warp_affine_back_u16_ac4);
377impl_warp_affine_back_operation!(i32, C1, warp_affine_back_i32_c1);
378impl_warp_affine_back_operation!(i32, C3, warp_affine_back_i32_c3);
379impl_warp_affine_back_operation!(i32, C4, warp_affine_back_i32_c4);
380impl_warp_affine_back_operation!(i32, AC4, warp_affine_back_i32_ac4);
381impl_warp_affine_back_operation!(f32, C1, warp_affine_back_f32_c1);
382impl_warp_affine_back_operation!(f32, C3, warp_affine_back_f32_c3);
383impl_warp_affine_back_operation!(f32, C4, warp_affine_back_f32_c4);
384impl_warp_affine_back_operation!(f32, AC4, warp_affine_back_f32_ac4);
385
386pub fn warp_affine_back<T, L>(
387 stream_context: &StreamContext,
388 warp: &WarpAffine,
389 source: &ImageView<'_, T, L>,
390 destination: &mut ImageViewMut<'_, T, L>,
391) -> Result<()>
392where
393 T: WarpAffineBackOperation<L>,
394 L: ChannelLayout,
395{
396 T::warp_affine_back(stream_context, warp, source, destination)
397}
398
399impl_warp_affine_back_planar!(warp_affine_back_u8_p3, u8, 3, nppiWarpAffineBack_8u_P3R_Ctx);
400impl_warp_affine_back_planar!(warp_affine_back_u8_p4, u8, 4, nppiWarpAffineBack_8u_P4R_Ctx);
401impl_warp_affine_back_planar!(
402 warp_affine_back_u16_p3,
403 u16,
404 3,
405 nppiWarpAffineBack_16u_P3R_Ctx
406);
407impl_warp_affine_back_planar!(
408 warp_affine_back_u16_p4,
409 u16,
410 4,
411 nppiWarpAffineBack_16u_P4R_Ctx
412);
413impl_warp_affine_back_planar!(
414 warp_affine_back_i32_p3,
415 i32,
416 3,
417 nppiWarpAffineBack_32s_P3R_Ctx
418);
419impl_warp_affine_back_planar!(
420 warp_affine_back_i32_p4,
421 i32,
422 4,
423 nppiWarpAffineBack_32s_P4R_Ctx
424);
425impl_warp_affine_back_planar!(
426 warp_affine_back_f32_p3,
427 f32,
428 3,
429 nppiWarpAffineBack_32f_P3R_Ctx
430);
431impl_warp_affine_back_planar!(
432 warp_affine_back_f32_p4,
433 f32,
434 4,
435 nppiWarpAffineBack_32f_P4R_Ctx
436);
437
438pub trait WarpAffineBackPlanar<const PLANES: usize>: DataTypeLike {
439 fn warp_affine_back_planar(
440 stream_context: &StreamContext,
441 warp: &WarpAffine,
442 source: &PlanarImageView<'_, Self, PLANES>,
443 destination: &mut PlanarImageViewMut<'_, Self, PLANES>,
444 ) -> Result<()>;
445}
446
447macro_rules! impl_warp_affine_back_planar_dispatch {
448 ($ty:ty, $planes:literal, $function:ident) => {
449 impl WarpAffineBackPlanar<$planes> for $ty {
450 fn warp_affine_back_planar(
451 stream_context: &StreamContext,
452 warp: &WarpAffine,
453 source: &PlanarImageView<'_, Self, $planes>,
454 destination: &mut PlanarImageViewMut<'_, Self, $planes>,
455 ) -> Result<()> {
456 $function(stream_context, warp, source, destination)
457 }
458 }
459 };
460}
461
462impl_warp_affine_back_planar_dispatch!(u8, 3, warp_affine_back_u8_p3);
463impl_warp_affine_back_planar_dispatch!(u8, 4, warp_affine_back_u8_p4);
464impl_warp_affine_back_planar_dispatch!(u16, 3, warp_affine_back_u16_p3);
465impl_warp_affine_back_planar_dispatch!(u16, 4, warp_affine_back_u16_p4);
466impl_warp_affine_back_planar_dispatch!(i32, 3, warp_affine_back_i32_p3);
467impl_warp_affine_back_planar_dispatch!(i32, 4, warp_affine_back_i32_p4);
468impl_warp_affine_back_planar_dispatch!(f32, 3, warp_affine_back_f32_p3);
469impl_warp_affine_back_planar_dispatch!(f32, 4, warp_affine_back_f32_p4);
470
471pub fn warp_affine_back_planar<T, const PLANES: usize>(
472 stream_context: &StreamContext,
473 warp: &WarpAffine,
474 source: &PlanarImageView<'_, T, PLANES>,
475 destination: &mut PlanarImageViewMut<'_, T, PLANES>,
476) -> Result<()>
477where
478 T: WarpAffineBackPlanar<PLANES>,
479{
480 T::warp_affine_back_planar(stream_context, warp, source, destination)
481}