Skip to main content

singe_npp/image/
geometry_back.rs

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}