Skip to main content

singe_npp/image/
geometry_affine.rs

1use super::*;
2
3impl_warp_affine!(warp_affine_u8_c1, u8, C1, nppiWarpAffine_8u_C1R_Ctx);
4impl_warp_affine!(warp_affine_u8_c3, u8, C3, nppiWarpAffine_8u_C3R_Ctx);
5impl_warp_affine!(warp_affine_u8_c4, u8, C4, nppiWarpAffine_8u_C4R_Ctx);
6impl_warp_affine!(warp_affine_u8_ac4, u8, AC4, nppiWarpAffine_8u_AC4R_Ctx);
7impl_warp_affine!(warp_affine_u16_c1, u16, C1, nppiWarpAffine_16u_C1R_Ctx);
8impl_warp_affine!(warp_affine_u16_c3, u16, C3, nppiWarpAffine_16u_C3R_Ctx);
9impl_warp_affine!(warp_affine_u16_c4, u16, C4, nppiWarpAffine_16u_C4R_Ctx);
10impl_warp_affine!(warp_affine_u16_ac4, u16, AC4, nppiWarpAffine_16u_AC4R_Ctx);
11impl_warp_affine!(warp_affine_i32_c1, i32, C1, nppiWarpAffine_32s_C1R_Ctx);
12impl_warp_affine!(warp_affine_i32_c3, i32, C3, nppiWarpAffine_32s_C3R_Ctx);
13impl_warp_affine!(warp_affine_i32_c4, i32, C4, nppiWarpAffine_32s_C4R_Ctx);
14impl_warp_affine!(warp_affine_i32_ac4, i32, AC4, nppiWarpAffine_32s_AC4R_Ctx);
15impl_warp_affine!(warp_affine_f16_c1, f16, C1, nppiWarpAffine_16f_C1R_Ctx);
16impl_warp_affine!(warp_affine_f16_c3, f16, C3, nppiWarpAffine_16f_C3R_Ctx);
17impl_warp_affine!(warp_affine_f16_c4, f16, C4, nppiWarpAffine_16f_C4R_Ctx);
18impl_warp_affine!(warp_affine_f32_c1, f32, C1, nppiWarpAffine_32f_C1R_Ctx);
19impl_warp_affine!(warp_affine_f32_c3, f32, C3, nppiWarpAffine_32f_C3R_Ctx);
20impl_warp_affine!(warp_affine_f32_c4, f32, C4, nppiWarpAffine_32f_C4R_Ctx);
21impl_warp_affine!(warp_affine_f32_ac4, f32, AC4, nppiWarpAffine_32f_AC4R_Ctx);
22impl_warp_affine!(warp_affine_f64_c1, f64, C1, nppiWarpAffine_64f_C1R_Ctx);
23impl_warp_affine!(warp_affine_f64_c3, f64, C3, nppiWarpAffine_64f_C3R_Ctx);
24impl_warp_affine!(warp_affine_f64_c4, f64, C4, nppiWarpAffine_64f_C4R_Ctx);
25impl_warp_affine!(warp_affine_f64_ac4, f64, AC4, nppiWarpAffine_64f_AC4R_Ctx);
26
27pub trait WarpAffineOperation<L: ChannelLayout>: DataTypeLike {
28    fn warp_affine(
29        stream_context: &StreamContext,
30        warp: &WarpAffine,
31        source: &ImageView<'_, Self, L>,
32        destination: &mut ImageViewMut<'_, Self, L>,
33    ) -> Result<()>;
34}
35
36macro_rules! impl_warp_affine_operation {
37    ($ty:ty, $layout:ty, $function:ident) => {
38        impl WarpAffineOperation<$layout> for $ty {
39            fn warp_affine(
40                stream_context: &StreamContext,
41                warp: &WarpAffine,
42                source: &ImageView<'_, Self, $layout>,
43                destination: &mut ImageViewMut<'_, Self, $layout>,
44            ) -> Result<()> {
45                $function(stream_context, warp, source, destination)
46            }
47        }
48    };
49}
50
51impl_warp_affine_operation!(u8, C1, warp_affine_u8_c1);
52impl_warp_affine_operation!(u8, C3, warp_affine_u8_c3);
53impl_warp_affine_operation!(u8, C4, warp_affine_u8_c4);
54impl_warp_affine_operation!(u8, AC4, warp_affine_u8_ac4);
55impl_warp_affine_operation!(u16, C1, warp_affine_u16_c1);
56impl_warp_affine_operation!(u16, C3, warp_affine_u16_c3);
57impl_warp_affine_operation!(u16, C4, warp_affine_u16_c4);
58impl_warp_affine_operation!(u16, AC4, warp_affine_u16_ac4);
59impl_warp_affine_operation!(i32, C1, warp_affine_i32_c1);
60impl_warp_affine_operation!(i32, C3, warp_affine_i32_c3);
61impl_warp_affine_operation!(i32, C4, warp_affine_i32_c4);
62impl_warp_affine_operation!(i32, AC4, warp_affine_i32_ac4);
63impl_warp_affine_operation!(f16, C1, warp_affine_f16_c1);
64impl_warp_affine_operation!(f16, C3, warp_affine_f16_c3);
65impl_warp_affine_operation!(f16, C4, warp_affine_f16_c4);
66impl_warp_affine_operation!(f32, C1, warp_affine_f32_c1);
67impl_warp_affine_operation!(f32, C3, warp_affine_f32_c3);
68impl_warp_affine_operation!(f32, C4, warp_affine_f32_c4);
69impl_warp_affine_operation!(f32, AC4, warp_affine_f32_ac4);
70impl_warp_affine_operation!(f64, C1, warp_affine_f64_c1);
71impl_warp_affine_operation!(f64, C3, warp_affine_f64_c3);
72impl_warp_affine_operation!(f64, C4, warp_affine_f64_c4);
73impl_warp_affine_operation!(f64, AC4, warp_affine_f64_ac4);
74
75pub fn warp_affine<T, L>(
76    stream_context: &StreamContext,
77    warp: &WarpAffine,
78    source: &ImageView<'_, T, L>,
79    destination: &mut ImageViewMut<'_, T, L>,
80) -> Result<()>
81where
82    T: WarpAffineOperation<L>,
83    L: ChannelLayout,
84{
85    T::warp_affine(stream_context, warp, source, destination)
86}
87
88impl_warp_affine_batch!(
89    warp_affine_batch_u8_c1,
90    u8,
91    C1,
92    nppiWarpAffineBatch_8u_C1R_Ctx
93);
94impl_warp_affine_batch!(
95    warp_affine_batch_u8_c3,
96    u8,
97    C3,
98    nppiWarpAffineBatch_8u_C3R_Ctx
99);
100impl_warp_affine_batch!(
101    warp_affine_batch_u8_c4,
102    u8,
103    C4,
104    nppiWarpAffineBatch_8u_C4R_Ctx
105);
106impl_warp_affine_batch!(
107    warp_affine_batch_u8_ac4,
108    u8,
109    AC4,
110    nppiWarpAffineBatch_8u_AC4R_Ctx
111);
112impl_warp_affine_batch!(
113    warp_affine_batch_f16_c1,
114    f16,
115    C1,
116    nppiWarpAffineBatch_16f_C1R_Ctx
117);
118impl_warp_affine_batch!(
119    warp_affine_batch_f16_c3,
120    f16,
121    C3,
122    nppiWarpAffineBatch_16f_C3R_Ctx
123);
124impl_warp_affine_batch!(
125    warp_affine_batch_f16_c4,
126    f16,
127    C4,
128    nppiWarpAffineBatch_16f_C4R_Ctx
129);
130impl_warp_affine_batch!(
131    warp_affine_batch_f32_c1,
132    f32,
133    C1,
134    nppiWarpAffineBatch_32f_C1R_Ctx
135);
136impl_warp_affine_batch!(
137    warp_affine_batch_f32_c3,
138    f32,
139    C3,
140    nppiWarpAffineBatch_32f_C3R_Ctx
141);
142impl_warp_affine_batch!(
143    warp_affine_batch_f32_c4,
144    f32,
145    C4,
146    nppiWarpAffineBatch_32f_C4R_Ctx
147);
148impl_warp_affine_batch!(
149    warp_affine_batch_f32_ac4,
150    f32,
151    AC4,
152    nppiWarpAffineBatch_32f_AC4R_Ctx
153);
154
155pub trait WarpAffineBatchOperation<L: ChannelLayout>: DataTypeLike {
156    fn warp_affine_batch(
157        stream_context: &StreamContext,
158        warp: &WarpAffineBatch,
159        coefficients: &[AffineCoefficients],
160        sources: &[ImageView<'_, Self, L>],
161        destinations: &mut [ImageViewMut<'_, Self, L>],
162    ) -> Result<()>;
163}
164
165macro_rules! impl_warp_affine_batch_operation {
166    ($ty:ty, $layout:ty, $function:ident) => {
167        impl WarpAffineBatchOperation<$layout> for $ty {
168            fn warp_affine_batch(
169                stream_context: &StreamContext,
170                warp: &WarpAffineBatch,
171                coefficients: &[AffineCoefficients],
172                sources: &[ImageView<'_, Self, $layout>],
173                destinations: &mut [ImageViewMut<'_, Self, $layout>],
174            ) -> Result<()> {
175                $function(stream_context, warp, coefficients, sources, destinations)
176            }
177        }
178    };
179}
180
181impl_warp_affine_batch_operation!(u8, C1, warp_affine_batch_u8_c1);
182impl_warp_affine_batch_operation!(u8, C3, warp_affine_batch_u8_c3);
183impl_warp_affine_batch_operation!(u8, C4, warp_affine_batch_u8_c4);
184impl_warp_affine_batch_operation!(u8, AC4, warp_affine_batch_u8_ac4);
185impl_warp_affine_batch_operation!(f16, C1, warp_affine_batch_f16_c1);
186impl_warp_affine_batch_operation!(f16, C3, warp_affine_batch_f16_c3);
187impl_warp_affine_batch_operation!(f16, C4, warp_affine_batch_f16_c4);
188impl_warp_affine_batch_operation!(f32, C1, warp_affine_batch_f32_c1);
189impl_warp_affine_batch_operation!(f32, C3, warp_affine_batch_f32_c3);
190impl_warp_affine_batch_operation!(f32, C4, warp_affine_batch_f32_c4);
191impl_warp_affine_batch_operation!(f32, AC4, warp_affine_batch_f32_ac4);
192
193pub fn warp_affine_batch<T, L>(
194    stream_context: &StreamContext,
195    warp: &WarpAffineBatch,
196    coefficients: &[AffineCoefficients],
197    sources: &[ImageView<'_, T, L>],
198    destinations: &mut [ImageViewMut<'_, T, L>],
199) -> Result<()>
200where
201    T: WarpAffineBatchOperation<L>,
202    L: ChannelLayout,
203{
204    T::warp_affine_batch(stream_context, warp, coefficients, sources, destinations)
205}
206
207impl_warp_affine_planar!(warp_affine_u8_p3, u8, 3, nppiWarpAffine_8u_P3R_Ctx);
208impl_warp_affine_planar!(warp_affine_u8_p4, u8, 4, nppiWarpAffine_8u_P4R_Ctx);
209impl_warp_affine_planar!(warp_affine_u16_p3, u16, 3, nppiWarpAffine_16u_P3R_Ctx);
210impl_warp_affine_planar!(warp_affine_u16_p4, u16, 4, nppiWarpAffine_16u_P4R_Ctx);
211impl_warp_affine_planar!(warp_affine_i32_p3, i32, 3, nppiWarpAffine_32s_P3R_Ctx);
212impl_warp_affine_planar!(warp_affine_i32_p4, i32, 4, nppiWarpAffine_32s_P4R_Ctx);
213impl_warp_affine_planar!(warp_affine_f32_p3, f32, 3, nppiWarpAffine_32f_P3R_Ctx);
214impl_warp_affine_planar!(warp_affine_f32_p4, f32, 4, nppiWarpAffine_32f_P4R_Ctx);
215impl_warp_affine_planar!(warp_affine_f64_p3, f64, 3, nppiWarpAffine_64f_P3R_Ctx);
216impl_warp_affine_planar!(warp_affine_f64_p4, f64, 4, nppiWarpAffine_64f_P4R_Ctx);
217
218pub trait WarpAffinePlanar<const PLANES: usize>: DataTypeLike {
219    fn warp_affine_planar(
220        stream_context: &StreamContext,
221        warp: &WarpAffine,
222        source: &PlanarImageView<'_, Self, PLANES>,
223        destination: &mut PlanarImageViewMut<'_, Self, PLANES>,
224    ) -> Result<()>;
225}
226
227macro_rules! impl_warp_affine_planar_dispatch {
228    ($ty:ty, $planes:literal, $function:ident) => {
229        impl WarpAffinePlanar<$planes> for $ty {
230            fn warp_affine_planar(
231                stream_context: &StreamContext,
232                warp: &WarpAffine,
233                source: &PlanarImageView<'_, Self, $planes>,
234                destination: &mut PlanarImageViewMut<'_, Self, $planes>,
235            ) -> Result<()> {
236                $function(stream_context, warp, source, destination)
237            }
238        }
239    };
240}
241
242impl_warp_affine_planar_dispatch!(u8, 3, warp_affine_u8_p3);
243impl_warp_affine_planar_dispatch!(u8, 4, warp_affine_u8_p4);
244impl_warp_affine_planar_dispatch!(u16, 3, warp_affine_u16_p3);
245impl_warp_affine_planar_dispatch!(u16, 4, warp_affine_u16_p4);
246impl_warp_affine_planar_dispatch!(i32, 3, warp_affine_i32_p3);
247impl_warp_affine_planar_dispatch!(i32, 4, warp_affine_i32_p4);
248impl_warp_affine_planar_dispatch!(f32, 3, warp_affine_f32_p3);
249impl_warp_affine_planar_dispatch!(f32, 4, warp_affine_f32_p4);
250impl_warp_affine_planar_dispatch!(f64, 3, warp_affine_f64_p3);
251impl_warp_affine_planar_dispatch!(f64, 4, warp_affine_f64_p4);
252
253pub fn warp_affine_planar<T, const PLANES: usize>(
254    stream_context: &StreamContext,
255    warp: &WarpAffine,
256    source: &PlanarImageView<'_, T, PLANES>,
257    destination: &mut PlanarImageViewMut<'_, T, PLANES>,
258) -> Result<()>
259where
260    T: WarpAffinePlanar<PLANES>,
261{
262    T::warp_affine_planar(stream_context, warp, source, destination)
263}
264
265impl_warp_affine_quad!(
266    warp_affine_quad_u8_c1,
267    u8,
268    C1,
269    nppiWarpAffineQuad_8u_C1R_Ctx
270);
271impl_warp_affine_quad!(
272    warp_affine_quad_u8_c3,
273    u8,
274    C3,
275    nppiWarpAffineQuad_8u_C3R_Ctx
276);
277impl_warp_affine_quad!(
278    warp_affine_quad_u8_c4,
279    u8,
280    C4,
281    nppiWarpAffineQuad_8u_C4R_Ctx
282);
283impl_warp_affine_quad!(
284    warp_affine_quad_u8_ac4,
285    u8,
286    AC4,
287    nppiWarpAffineQuad_8u_AC4R_Ctx
288);
289impl_warp_affine_quad!(
290    warp_affine_quad_u16_c1,
291    u16,
292    C1,
293    nppiWarpAffineQuad_16u_C1R_Ctx
294);
295impl_warp_affine_quad!(
296    warp_affine_quad_u16_c3,
297    u16,
298    C3,
299    nppiWarpAffineQuad_16u_C3R_Ctx
300);
301impl_warp_affine_quad!(
302    warp_affine_quad_u16_c4,
303    u16,
304    C4,
305    nppiWarpAffineQuad_16u_C4R_Ctx
306);
307impl_warp_affine_quad!(
308    warp_affine_quad_u16_ac4,
309    u16,
310    AC4,
311    nppiWarpAffineQuad_16u_AC4R_Ctx
312);
313impl_warp_affine_quad!(
314    warp_affine_quad_i32_c1,
315    i32,
316    C1,
317    nppiWarpAffineQuad_32s_C1R_Ctx
318);
319impl_warp_affine_quad!(
320    warp_affine_quad_i32_c3,
321    i32,
322    C3,
323    nppiWarpAffineQuad_32s_C3R_Ctx
324);
325impl_warp_affine_quad!(
326    warp_affine_quad_i32_c4,
327    i32,
328    C4,
329    nppiWarpAffineQuad_32s_C4R_Ctx
330);
331impl_warp_affine_quad!(
332    warp_affine_quad_i32_ac4,
333    i32,
334    AC4,
335    nppiWarpAffineQuad_32s_AC4R_Ctx
336);
337impl_warp_affine_quad!(
338    warp_affine_quad_f32_c1,
339    f32,
340    C1,
341    nppiWarpAffineQuad_32f_C1R_Ctx
342);
343impl_warp_affine_quad!(
344    warp_affine_quad_f32_c3,
345    f32,
346    C3,
347    nppiWarpAffineQuad_32f_C3R_Ctx
348);
349impl_warp_affine_quad!(
350    warp_affine_quad_f32_c4,
351    f32,
352    C4,
353    nppiWarpAffineQuad_32f_C4R_Ctx
354);
355impl_warp_affine_quad!(
356    warp_affine_quad_f32_ac4,
357    f32,
358    AC4,
359    nppiWarpAffineQuad_32f_AC4R_Ctx
360);
361
362pub trait WarpAffineQuadOperation<L: ChannelLayout>: DataTypeLike {
363    fn warp_affine_quad(
364        stream_context: &StreamContext,
365        warp: &WarpQuad,
366        source: &ImageView<'_, Self, L>,
367        destination: &mut ImageViewMut<'_, Self, L>,
368    ) -> Result<()>;
369}
370
371macro_rules! impl_warp_affine_quad_operation {
372    ($ty:ty, $layout:ty, $function:ident) => {
373        impl WarpAffineQuadOperation<$layout> for $ty {
374            fn warp_affine_quad(
375                stream_context: &StreamContext,
376                warp: &WarpQuad,
377                source: &ImageView<'_, Self, $layout>,
378                destination: &mut ImageViewMut<'_, Self, $layout>,
379            ) -> Result<()> {
380                $function(stream_context, warp, source, destination)
381            }
382        }
383    };
384}
385
386impl_warp_affine_quad_operation!(u8, C1, warp_affine_quad_u8_c1);
387impl_warp_affine_quad_operation!(u8, C3, warp_affine_quad_u8_c3);
388impl_warp_affine_quad_operation!(u8, C4, warp_affine_quad_u8_c4);
389impl_warp_affine_quad_operation!(u8, AC4, warp_affine_quad_u8_ac4);
390impl_warp_affine_quad_operation!(u16, C1, warp_affine_quad_u16_c1);
391impl_warp_affine_quad_operation!(u16, C3, warp_affine_quad_u16_c3);
392impl_warp_affine_quad_operation!(u16, C4, warp_affine_quad_u16_c4);
393impl_warp_affine_quad_operation!(u16, AC4, warp_affine_quad_u16_ac4);
394impl_warp_affine_quad_operation!(i32, C1, warp_affine_quad_i32_c1);
395impl_warp_affine_quad_operation!(i32, C3, warp_affine_quad_i32_c3);
396impl_warp_affine_quad_operation!(i32, C4, warp_affine_quad_i32_c4);
397impl_warp_affine_quad_operation!(i32, AC4, warp_affine_quad_i32_ac4);
398impl_warp_affine_quad_operation!(f32, C1, warp_affine_quad_f32_c1);
399impl_warp_affine_quad_operation!(f32, C3, warp_affine_quad_f32_c3);
400impl_warp_affine_quad_operation!(f32, C4, warp_affine_quad_f32_c4);
401impl_warp_affine_quad_operation!(f32, AC4, warp_affine_quad_f32_ac4);
402
403pub fn warp_affine_quad<T, L>(
404    stream_context: &StreamContext,
405    warp: &WarpQuad,
406    source: &ImageView<'_, T, L>,
407    destination: &mut ImageViewMut<'_, T, L>,
408) -> Result<()>
409where
410    T: WarpAffineQuadOperation<L>,
411    L: ChannelLayout,
412{
413    T::warp_affine_quad(stream_context, warp, source, destination)
414}
415
416impl_warp_affine_quad_planar!(warp_affine_quad_u8_p3, u8, 3, nppiWarpAffineQuad_8u_P3R_Ctx);
417impl_warp_affine_quad_planar!(warp_affine_quad_u8_p4, u8, 4, nppiWarpAffineQuad_8u_P4R_Ctx);
418impl_warp_affine_quad_planar!(
419    warp_affine_quad_u16_p3,
420    u16,
421    3,
422    nppiWarpAffineQuad_16u_P3R_Ctx
423);
424impl_warp_affine_quad_planar!(
425    warp_affine_quad_u16_p4,
426    u16,
427    4,
428    nppiWarpAffineQuad_16u_P4R_Ctx
429);
430impl_warp_affine_quad_planar!(
431    warp_affine_quad_i32_p3,
432    i32,
433    3,
434    nppiWarpAffineQuad_32s_P3R_Ctx
435);
436impl_warp_affine_quad_planar!(
437    warp_affine_quad_i32_p4,
438    i32,
439    4,
440    nppiWarpAffineQuad_32s_P4R_Ctx
441);
442impl_warp_affine_quad_planar!(
443    warp_affine_quad_f32_p3,
444    f32,
445    3,
446    nppiWarpAffineQuad_32f_P3R_Ctx
447);
448impl_warp_affine_quad_planar!(
449    warp_affine_quad_f32_p4,
450    f32,
451    4,
452    nppiWarpAffineQuad_32f_P4R_Ctx
453);
454
455pub trait WarpAffineQuadPlanar<const PLANES: usize>: DataTypeLike {
456    fn warp_affine_quad_planar(
457        stream_context: &StreamContext,
458        warp: &WarpQuad,
459        source: &PlanarImageView<'_, Self, PLANES>,
460        destination: &mut PlanarImageViewMut<'_, Self, PLANES>,
461    ) -> Result<()>;
462}
463
464macro_rules! impl_warp_affine_quad_planar_dispatch {
465    ($ty:ty, $planes:literal, $function:ident) => {
466        impl WarpAffineQuadPlanar<$planes> for $ty {
467            fn warp_affine_quad_planar(
468                stream_context: &StreamContext,
469                warp: &WarpQuad,
470                source: &PlanarImageView<'_, Self, $planes>,
471                destination: &mut PlanarImageViewMut<'_, Self, $planes>,
472            ) -> Result<()> {
473                $function(stream_context, warp, source, destination)
474            }
475        }
476    };
477}
478
479impl_warp_affine_quad_planar_dispatch!(u8, 3, warp_affine_quad_u8_p3);
480impl_warp_affine_quad_planar_dispatch!(u8, 4, warp_affine_quad_u8_p4);
481impl_warp_affine_quad_planar_dispatch!(u16, 3, warp_affine_quad_u16_p3);
482impl_warp_affine_quad_planar_dispatch!(u16, 4, warp_affine_quad_u16_p4);
483impl_warp_affine_quad_planar_dispatch!(i32, 3, warp_affine_quad_i32_p3);
484impl_warp_affine_quad_planar_dispatch!(i32, 4, warp_affine_quad_i32_p4);
485impl_warp_affine_quad_planar_dispatch!(f32, 3, warp_affine_quad_f32_p3);
486impl_warp_affine_quad_planar_dispatch!(f32, 4, warp_affine_quad_f32_p4);
487
488pub fn warp_affine_quad_planar<T, const PLANES: usize>(
489    stream_context: &StreamContext,
490    warp: &WarpQuad,
491    source: &PlanarImageView<'_, T, PLANES>,
492    destination: &mut PlanarImageViewMut<'_, T, PLANES>,
493) -> Result<()>
494where
495    T: WarpAffineQuadPlanar<PLANES>,
496{
497    T::warp_affine_quad_planar(stream_context, warp, source, destination)
498}