Skip to main content

singe_npp/image/
geometry_perspective.rs

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}