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}