1use super::*;
2
3impl_warp_perspective!(
4 warp_perspective_u8_c1,
5 u8,
6 C1,
7 nppiWarpPerspective_8u_C1R_Ctx
8);
9impl_warp_perspective!(
10 warp_perspective_u8_c3,
11 u8,
12 C3,
13 nppiWarpPerspective_8u_C3R_Ctx
14);
15impl_warp_perspective!(
16 warp_perspective_u8_c4,
17 u8,
18 C4,
19 nppiWarpPerspective_8u_C4R_Ctx
20);
21impl_warp_perspective!(
22 warp_perspective_u8_ac4,
23 u8,
24 AC4,
25 nppiWarpPerspective_8u_AC4R_Ctx
26);
27impl_warp_perspective!(
28 warp_perspective_u16_c1,
29 u16,
30 C1,
31 nppiWarpPerspective_16u_C1R_Ctx
32);
33impl_warp_perspective!(
34 warp_perspective_u16_c3,
35 u16,
36 C3,
37 nppiWarpPerspective_16u_C3R_Ctx
38);
39impl_warp_perspective!(
40 warp_perspective_u16_c4,
41 u16,
42 C4,
43 nppiWarpPerspective_16u_C4R_Ctx
44);
45impl_warp_perspective!(
46 warp_perspective_u16_ac4,
47 u16,
48 AC4,
49 nppiWarpPerspective_16u_AC4R_Ctx
50);
51impl_warp_perspective!(
52 warp_perspective_i32_c1,
53 i32,
54 C1,
55 nppiWarpPerspective_32s_C1R_Ctx
56);
57impl_warp_perspective!(
58 warp_perspective_i32_c3,
59 i32,
60 C3,
61 nppiWarpPerspective_32s_C3R_Ctx
62);
63impl_warp_perspective!(
64 warp_perspective_i32_c4,
65 i32,
66 C4,
67 nppiWarpPerspective_32s_C4R_Ctx
68);
69impl_warp_perspective!(
70 warp_perspective_i32_ac4,
71 i32,
72 AC4,
73 nppiWarpPerspective_32s_AC4R_Ctx
74);
75impl_warp_perspective!(
76 warp_perspective_f16_c1,
77 f16,
78 C1,
79 nppiWarpPerspective_16f_C1R_Ctx
80);
81impl_warp_perspective!(
82 warp_perspective_f16_c3,
83 f16,
84 C3,
85 nppiWarpPerspective_16f_C3R_Ctx
86);
87impl_warp_perspective!(
88 warp_perspective_f16_c4,
89 f16,
90 C4,
91 nppiWarpPerspective_16f_C4R_Ctx
92);
93impl_warp_perspective!(
94 warp_perspective_f32_c1,
95 f32,
96 C1,
97 nppiWarpPerspective_32f_C1R_Ctx
98);
99impl_warp_perspective!(
100 warp_perspective_f32_c3,
101 f32,
102 C3,
103 nppiWarpPerspective_32f_C3R_Ctx
104);
105impl_warp_perspective!(
106 warp_perspective_f32_c4,
107 f32,
108 C4,
109 nppiWarpPerspective_32f_C4R_Ctx
110);
111impl_warp_perspective!(
112 warp_perspective_f32_ac4,
113 f32,
114 AC4,
115 nppiWarpPerspective_32f_AC4R_Ctx
116);
117
118pub trait WarpPerspectiveOperation<L: ChannelLayout>: DataTypeLike {
119 fn warp_perspective(
120 stream_context: &StreamContext,
121 warp: &WarpPerspective,
122 source: &ImageView<'_, Self, L>,
123 destination: &mut ImageViewMut<'_, Self, L>,
124 ) -> Result<()>;
125}
126
127macro_rules! impl_warp_perspective_operation {
128 ($ty:ty, $layout:ty, $function:ident) => {
129 impl WarpPerspectiveOperation<$layout> for $ty {
130 fn warp_perspective(
131 stream_context: &StreamContext,
132 warp: &WarpPerspective,
133 source: &ImageView<'_, Self, $layout>,
134 destination: &mut ImageViewMut<'_, Self, $layout>,
135 ) -> Result<()> {
136 $function(stream_context, warp, source, destination)
137 }
138 }
139 };
140}
141
142impl_warp_perspective_operation!(u8, C1, warp_perspective_u8_c1);
143impl_warp_perspective_operation!(u8, C3, warp_perspective_u8_c3);
144impl_warp_perspective_operation!(u8, C4, warp_perspective_u8_c4);
145impl_warp_perspective_operation!(u8, AC4, warp_perspective_u8_ac4);
146impl_warp_perspective_operation!(u16, C1, warp_perspective_u16_c1);
147impl_warp_perspective_operation!(u16, C3, warp_perspective_u16_c3);
148impl_warp_perspective_operation!(u16, C4, warp_perspective_u16_c4);
149impl_warp_perspective_operation!(u16, AC4, warp_perspective_u16_ac4);
150impl_warp_perspective_operation!(i32, C1, warp_perspective_i32_c1);
151impl_warp_perspective_operation!(i32, C3, warp_perspective_i32_c3);
152impl_warp_perspective_operation!(i32, C4, warp_perspective_i32_c4);
153impl_warp_perspective_operation!(i32, AC4, warp_perspective_i32_ac4);
154impl_warp_perspective_operation!(f16, C1, warp_perspective_f16_c1);
155impl_warp_perspective_operation!(f16, C3, warp_perspective_f16_c3);
156impl_warp_perspective_operation!(f16, C4, warp_perspective_f16_c4);
157impl_warp_perspective_operation!(f32, C1, warp_perspective_f32_c1);
158impl_warp_perspective_operation!(f32, C3, warp_perspective_f32_c3);
159impl_warp_perspective_operation!(f32, C4, warp_perspective_f32_c4);
160impl_warp_perspective_operation!(f32, AC4, warp_perspective_f32_ac4);
161
162pub fn warp_perspective<T, L>(
163 stream_context: &StreamContext,
164 warp: &WarpPerspective,
165 source: &ImageView<'_, T, L>,
166 destination: &mut ImageViewMut<'_, T, L>,
167) -> Result<()>
168where
169 T: WarpPerspectiveOperation<L>,
170 L: ChannelLayout,
171{
172 T::warp_perspective(stream_context, warp, source, destination)
173}
174
175impl_warp_perspective_batch!(
176 warp_perspective_batch_u8_c1,
177 u8,
178 C1,
179 nppiWarpPerspectiveBatch_8u_C1R_Ctx
180);
181impl_warp_perspective_batch!(
182 warp_perspective_batch_u8_c3,
183 u8,
184 C3,
185 nppiWarpPerspectiveBatch_8u_C3R_Ctx
186);
187impl_warp_perspective_batch!(
188 warp_perspective_batch_u8_c4,
189 u8,
190 C4,
191 nppiWarpPerspectiveBatch_8u_C4R_Ctx
192);
193impl_warp_perspective_batch!(
194 warp_perspective_batch_u8_ac4,
195 u8,
196 AC4,
197 nppiWarpPerspectiveBatch_8u_AC4R_Ctx
198);
199impl_warp_perspective_batch!(
200 warp_perspective_batch_f16_c1,
201 f16,
202 C1,
203 nppiWarpPerspectiveBatch_16f_C1R_Ctx
204);
205impl_warp_perspective_batch!(
206 warp_perspective_batch_f16_c3,
207 f16,
208 C3,
209 nppiWarpPerspectiveBatch_16f_C3R_Ctx
210);
211impl_warp_perspective_batch!(
212 warp_perspective_batch_f16_c4,
213 f16,
214 C4,
215 nppiWarpPerspectiveBatch_16f_C4R_Ctx
216);
217impl_warp_perspective_batch!(
218 warp_perspective_batch_f32_c1,
219 f32,
220 C1,
221 nppiWarpPerspectiveBatch_32f_C1R_Ctx
222);
223impl_warp_perspective_batch!(
224 warp_perspective_batch_f32_c3,
225 f32,
226 C3,
227 nppiWarpPerspectiveBatch_32f_C3R_Ctx
228);
229impl_warp_perspective_batch!(
230 warp_perspective_batch_f32_c4,
231 f32,
232 C4,
233 nppiWarpPerspectiveBatch_32f_C4R_Ctx
234);
235impl_warp_perspective_batch!(
236 warp_perspective_batch_f32_ac4,
237 f32,
238 AC4,
239 nppiWarpPerspectiveBatch_32f_AC4R_Ctx
240);
241
242pub trait WarpPerspectiveBatchOperation<L: ChannelLayout>: DataTypeLike {
243 fn warp_perspective_batch(
244 stream_context: &StreamContext,
245 warp: &WarpPerspectiveBatch,
246 coefficients: &[PerspectiveCoefficients],
247 sources: &[ImageView<'_, Self, L>],
248 destinations: &mut [ImageViewMut<'_, Self, L>],
249 ) -> Result<()>;
250}
251
252macro_rules! impl_warp_perspective_batch_operation {
253 ($ty:ty, $layout:ty, $function:ident) => {
254 impl WarpPerspectiveBatchOperation<$layout> for $ty {
255 fn warp_perspective_batch(
256 stream_context: &StreamContext,
257 warp: &WarpPerspectiveBatch,
258 coefficients: &[PerspectiveCoefficients],
259 sources: &[ImageView<'_, Self, $layout>],
260 destinations: &mut [ImageViewMut<'_, Self, $layout>],
261 ) -> Result<()> {
262 $function(stream_context, warp, coefficients, sources, destinations)
263 }
264 }
265 };
266}
267
268impl_warp_perspective_batch_operation!(u8, C1, warp_perspective_batch_u8_c1);
269impl_warp_perspective_batch_operation!(u8, C3, warp_perspective_batch_u8_c3);
270impl_warp_perspective_batch_operation!(u8, C4, warp_perspective_batch_u8_c4);
271impl_warp_perspective_batch_operation!(u8, AC4, warp_perspective_batch_u8_ac4);
272impl_warp_perspective_batch_operation!(f16, C1, warp_perspective_batch_f16_c1);
273impl_warp_perspective_batch_operation!(f16, C3, warp_perspective_batch_f16_c3);
274impl_warp_perspective_batch_operation!(f16, C4, warp_perspective_batch_f16_c4);
275impl_warp_perspective_batch_operation!(f32, C1, warp_perspective_batch_f32_c1);
276impl_warp_perspective_batch_operation!(f32, C3, warp_perspective_batch_f32_c3);
277impl_warp_perspective_batch_operation!(f32, C4, warp_perspective_batch_f32_c4);
278impl_warp_perspective_batch_operation!(f32, AC4, warp_perspective_batch_f32_ac4);
279
280pub fn warp_perspective_batch<T, L>(
281 stream_context: &StreamContext,
282 warp: &WarpPerspectiveBatch,
283 coefficients: &[PerspectiveCoefficients],
284 sources: &[ImageView<'_, T, L>],
285 destinations: &mut [ImageViewMut<'_, T, L>],
286) -> Result<()>
287where
288 T: WarpPerspectiveBatchOperation<L>,
289 L: ChannelLayout,
290{
291 T::warp_perspective_batch(stream_context, warp, coefficients, sources, destinations)
292}
293
294impl_warp_perspective_planar!(
295 warp_perspective_u8_p3,
296 u8,
297 3,
298 nppiWarpPerspective_8u_P3R_Ctx
299);
300impl_warp_perspective_planar!(
301 warp_perspective_u8_p4,
302 u8,
303 4,
304 nppiWarpPerspective_8u_P4R_Ctx
305);
306impl_warp_perspective_planar!(
307 warp_perspective_u16_p3,
308 u16,
309 3,
310 nppiWarpPerspective_16u_P3R_Ctx
311);
312impl_warp_perspective_planar!(
313 warp_perspective_u16_p4,
314 u16,
315 4,
316 nppiWarpPerspective_16u_P4R_Ctx
317);
318impl_warp_perspective_planar!(
319 warp_perspective_i32_p3,
320 i32,
321 3,
322 nppiWarpPerspective_32s_P3R_Ctx
323);
324impl_warp_perspective_planar!(
325 warp_perspective_i32_p4,
326 i32,
327 4,
328 nppiWarpPerspective_32s_P4R_Ctx
329);
330impl_warp_perspective_planar!(
331 warp_perspective_f32_p3,
332 f32,
333 3,
334 nppiWarpPerspective_32f_P3R_Ctx
335);
336impl_warp_perspective_planar!(
337 warp_perspective_f32_p4,
338 f32,
339 4,
340 nppiWarpPerspective_32f_P4R_Ctx
341);
342
343pub trait WarpPerspectivePlanar<const PLANES: usize>: DataTypeLike {
344 fn warp_perspective_planar(
345 stream_context: &StreamContext,
346 warp: &WarpPerspective,
347 source: &PlanarImageView<'_, Self, PLANES>,
348 destination: &mut PlanarImageViewMut<'_, Self, PLANES>,
349 ) -> Result<()>;
350}
351
352macro_rules! impl_warp_perspective_planar_dispatch {
353 ($ty:ty, $planes:literal, $function:ident) => {
354 impl WarpPerspectivePlanar<$planes> for $ty {
355 fn warp_perspective_planar(
356 stream_context: &StreamContext,
357 warp: &WarpPerspective,
358 source: &PlanarImageView<'_, Self, $planes>,
359 destination: &mut PlanarImageViewMut<'_, Self, $planes>,
360 ) -> Result<()> {
361 $function(stream_context, warp, source, destination)
362 }
363 }
364 };
365}
366
367impl_warp_perspective_planar_dispatch!(u8, 3, warp_perspective_u8_p3);
368impl_warp_perspective_planar_dispatch!(u8, 4, warp_perspective_u8_p4);
369impl_warp_perspective_planar_dispatch!(u16, 3, warp_perspective_u16_p3);
370impl_warp_perspective_planar_dispatch!(u16, 4, warp_perspective_u16_p4);
371impl_warp_perspective_planar_dispatch!(i32, 3, warp_perspective_i32_p3);
372impl_warp_perspective_planar_dispatch!(i32, 4, warp_perspective_i32_p4);
373impl_warp_perspective_planar_dispatch!(f32, 3, warp_perspective_f32_p3);
374impl_warp_perspective_planar_dispatch!(f32, 4, warp_perspective_f32_p4);
375
376pub fn warp_perspective_planar<T, const PLANES: usize>(
377 stream_context: &StreamContext,
378 warp: &WarpPerspective,
379 source: &PlanarImageView<'_, T, PLANES>,
380 destination: &mut PlanarImageViewMut<'_, T, PLANES>,
381) -> Result<()>
382where
383 T: WarpPerspectivePlanar<PLANES>,
384{
385 T::warp_perspective_planar(stream_context, warp, source, destination)
386}
387
388impl_warp_perspective_quad!(
389 warp_perspective_quad_u8_c1,
390 u8,
391 C1,
392 nppiWarpPerspectiveQuad_8u_C1R_Ctx
393);
394impl_warp_perspective_quad!(
395 warp_perspective_quad_u8_c3,
396 u8,
397 C3,
398 nppiWarpPerspectiveQuad_8u_C3R_Ctx
399);
400impl_warp_perspective_quad!(
401 warp_perspective_quad_u8_c4,
402 u8,
403 C4,
404 nppiWarpPerspectiveQuad_8u_C4R_Ctx
405);
406impl_warp_perspective_quad!(
407 warp_perspective_quad_u8_ac4,
408 u8,
409 AC4,
410 nppiWarpPerspectiveQuad_8u_AC4R_Ctx
411);
412impl_warp_perspective_quad!(
413 warp_perspective_quad_u16_c1,
414 u16,
415 C1,
416 nppiWarpPerspectiveQuad_16u_C1R_Ctx
417);
418impl_warp_perspective_quad!(
419 warp_perspective_quad_u16_c3,
420 u16,
421 C3,
422 nppiWarpPerspectiveQuad_16u_C3R_Ctx
423);
424impl_warp_perspective_quad!(
425 warp_perspective_quad_u16_c4,
426 u16,
427 C4,
428 nppiWarpPerspectiveQuad_16u_C4R_Ctx
429);
430impl_warp_perspective_quad!(
431 warp_perspective_quad_u16_ac4,
432 u16,
433 AC4,
434 nppiWarpPerspectiveQuad_16u_AC4R_Ctx
435);
436impl_warp_perspective_quad!(
437 warp_perspective_quad_i32_c1,
438 i32,
439 C1,
440 nppiWarpPerspectiveQuad_32s_C1R_Ctx
441);
442impl_warp_perspective_quad!(
443 warp_perspective_quad_i32_c3,
444 i32,
445 C3,
446 nppiWarpPerspectiveQuad_32s_C3R_Ctx
447);
448impl_warp_perspective_quad!(
449 warp_perspective_quad_i32_c4,
450 i32,
451 C4,
452 nppiWarpPerspectiveQuad_32s_C4R_Ctx
453);
454impl_warp_perspective_quad!(
455 warp_perspective_quad_i32_ac4,
456 i32,
457 AC4,
458 nppiWarpPerspectiveQuad_32s_AC4R_Ctx
459);
460impl_warp_perspective_quad!(
461 warp_perspective_quad_f32_c1,
462 f32,
463 C1,
464 nppiWarpPerspectiveQuad_32f_C1R_Ctx
465);
466impl_warp_perspective_quad!(
467 warp_perspective_quad_f32_c3,
468 f32,
469 C3,
470 nppiWarpPerspectiveQuad_32f_C3R_Ctx
471);
472impl_warp_perspective_quad!(
473 warp_perspective_quad_f32_c4,
474 f32,
475 C4,
476 nppiWarpPerspectiveQuad_32f_C4R_Ctx
477);
478impl_warp_perspective_quad!(
479 warp_perspective_quad_f32_ac4,
480 f32,
481 AC4,
482 nppiWarpPerspectiveQuad_32f_AC4R_Ctx
483);
484
485pub trait WarpPerspectiveQuadOperation<L: ChannelLayout>: DataTypeLike {
486 fn warp_perspective_quad(
487 stream_context: &StreamContext,
488 warp: &WarpQuad,
489 source: &ImageView<'_, Self, L>,
490 destination: &mut ImageViewMut<'_, Self, L>,
491 ) -> Result<()>;
492}
493
494macro_rules! impl_warp_perspective_quad_operation {
495 ($ty:ty, $layout:ty, $function:ident) => {
496 impl WarpPerspectiveQuadOperation<$layout> for $ty {
497 fn warp_perspective_quad(
498 stream_context: &StreamContext,
499 warp: &WarpQuad,
500 source: &ImageView<'_, Self, $layout>,
501 destination: &mut ImageViewMut<'_, Self, $layout>,
502 ) -> Result<()> {
503 $function(stream_context, warp, source, destination)
504 }
505 }
506 };
507}
508
509impl_warp_perspective_quad_operation!(u8, C1, warp_perspective_quad_u8_c1);
510impl_warp_perspective_quad_operation!(u8, C3, warp_perspective_quad_u8_c3);
511impl_warp_perspective_quad_operation!(u8, C4, warp_perspective_quad_u8_c4);
512impl_warp_perspective_quad_operation!(u8, AC4, warp_perspective_quad_u8_ac4);
513impl_warp_perspective_quad_operation!(u16, C1, warp_perspective_quad_u16_c1);
514impl_warp_perspective_quad_operation!(u16, C3, warp_perspective_quad_u16_c3);
515impl_warp_perspective_quad_operation!(u16, C4, warp_perspective_quad_u16_c4);
516impl_warp_perspective_quad_operation!(u16, AC4, warp_perspective_quad_u16_ac4);
517impl_warp_perspective_quad_operation!(i32, C1, warp_perspective_quad_i32_c1);
518impl_warp_perspective_quad_operation!(i32, C3, warp_perspective_quad_i32_c3);
519impl_warp_perspective_quad_operation!(i32, C4, warp_perspective_quad_i32_c4);
520impl_warp_perspective_quad_operation!(i32, AC4, warp_perspective_quad_i32_ac4);
521impl_warp_perspective_quad_operation!(f32, C1, warp_perspective_quad_f32_c1);
522impl_warp_perspective_quad_operation!(f32, C3, warp_perspective_quad_f32_c3);
523impl_warp_perspective_quad_operation!(f32, C4, warp_perspective_quad_f32_c4);
524impl_warp_perspective_quad_operation!(f32, AC4, warp_perspective_quad_f32_ac4);
525
526pub fn warp_perspective_quad<T, L>(
527 stream_context: &StreamContext,
528 warp: &WarpQuad,
529 source: &ImageView<'_, T, L>,
530 destination: &mut ImageViewMut<'_, T, L>,
531) -> Result<()>
532where
533 T: WarpPerspectiveQuadOperation<L>,
534 L: ChannelLayout,
535{
536 T::warp_perspective_quad(stream_context, warp, source, destination)
537}
538
539impl_warp_perspective_quad_planar!(
540 warp_perspective_quad_u8_p3,
541 u8,
542 3,
543 nppiWarpPerspectiveQuad_8u_P3R_Ctx
544);
545impl_warp_perspective_quad_planar!(
546 warp_perspective_quad_u8_p4,
547 u8,
548 4,
549 nppiWarpPerspectiveQuad_8u_P4R_Ctx
550);
551impl_warp_perspective_quad_planar!(
552 warp_perspective_quad_u16_p3,
553 u16,
554 3,
555 nppiWarpPerspectiveQuad_16u_P3R_Ctx
556);
557impl_warp_perspective_quad_planar!(
558 warp_perspective_quad_u16_p4,
559 u16,
560 4,
561 nppiWarpPerspectiveQuad_16u_P4R_Ctx
562);
563impl_warp_perspective_quad_planar!(
564 warp_perspective_quad_i32_p3,
565 i32,
566 3,
567 nppiWarpPerspectiveQuad_32s_P3R_Ctx
568);
569impl_warp_perspective_quad_planar!(
570 warp_perspective_quad_i32_p4,
571 i32,
572 4,
573 nppiWarpPerspectiveQuad_32s_P4R_Ctx
574);
575impl_warp_perspective_quad_planar!(
576 warp_perspective_quad_f32_p3,
577 f32,
578 3,
579 nppiWarpPerspectiveQuad_32f_P3R_Ctx
580);
581impl_warp_perspective_quad_planar!(
582 warp_perspective_quad_f32_p4,
583 f32,
584 4,
585 nppiWarpPerspectiveQuad_32f_P4R_Ctx
586);
587
588pub trait WarpPerspectiveQuadPlanar<const PLANES: usize>: DataTypeLike {
589 fn warp_perspective_quad_planar(
590 stream_context: &StreamContext,
591 warp: &WarpQuad,
592 source: &PlanarImageView<'_, Self, PLANES>,
593 destination: &mut PlanarImageViewMut<'_, Self, PLANES>,
594 ) -> Result<()>;
595}
596
597macro_rules! impl_warp_perspective_quad_planar_dispatch {
598 ($ty:ty, $planes:literal, $function:ident) => {
599 impl WarpPerspectiveQuadPlanar<$planes> for $ty {
600 fn warp_perspective_quad_planar(
601 stream_context: &StreamContext,
602 warp: &WarpQuad,
603 source: &PlanarImageView<'_, Self, $planes>,
604 destination: &mut PlanarImageViewMut<'_, Self, $planes>,
605 ) -> Result<()> {
606 $function(stream_context, warp, source, destination)
607 }
608 }
609 };
610}
611
612impl_warp_perspective_quad_planar_dispatch!(u8, 3, warp_perspective_quad_u8_p3);
613impl_warp_perspective_quad_planar_dispatch!(u8, 4, warp_perspective_quad_u8_p4);
614impl_warp_perspective_quad_planar_dispatch!(u16, 3, warp_perspective_quad_u16_p3);
615impl_warp_perspective_quad_planar_dispatch!(u16, 4, warp_perspective_quad_u16_p4);
616impl_warp_perspective_quad_planar_dispatch!(i32, 3, warp_perspective_quad_i32_p3);
617impl_warp_perspective_quad_planar_dispatch!(i32, 4, warp_perspective_quad_i32_p4);
618impl_warp_perspective_quad_planar_dispatch!(f32, 3, warp_perspective_quad_f32_p3);
619impl_warp_perspective_quad_planar_dispatch!(f32, 4, warp_perspective_quad_f32_p4);
620
621pub fn warp_perspective_quad_planar<T, const PLANES: usize>(
622 stream_context: &StreamContext,
623 warp: &WarpQuad,
624 source: &PlanarImageView<'_, T, PLANES>,
625 destination: &mut PlanarImageViewMut<'_, T, PLANES>,
626) -> Result<()>
627where
628 T: WarpPerspectiveQuadPlanar<PLANES>,
629{
630 T::warp_perspective_quad_planar(stream_context, warp, source, destination)
631}