Skip to main content

singe_npp/image/
geometry_resize.rs

1use super::*;
2
3impl_resize_sqr_pixel!(
4    resize_sqr_pixel_u8_c1,
5    u8,
6    C1,
7    nppiResizeSqrPixel_8u_C1R_Ctx
8);
9impl_resize_sqr_pixel!(
10    resize_sqr_pixel_u8_c3,
11    u8,
12    C3,
13    nppiResizeSqrPixel_8u_C3R_Ctx
14);
15impl_resize_sqr_pixel!(
16    resize_sqr_pixel_u8_c4,
17    u8,
18    C4,
19    nppiResizeSqrPixel_8u_C4R_Ctx
20);
21impl_resize_sqr_pixel!(
22    resize_sqr_pixel_u8_ac4,
23    u8,
24    AC4,
25    nppiResizeSqrPixel_8u_AC4R_Ctx
26);
27impl_resize_sqr_pixel!(
28    resize_sqr_pixel_u16_c1,
29    u16,
30    C1,
31    nppiResizeSqrPixel_16u_C1R_Ctx
32);
33impl_resize_sqr_pixel!(
34    resize_sqr_pixel_u16_c3,
35    u16,
36    C3,
37    nppiResizeSqrPixel_16u_C3R_Ctx
38);
39impl_resize_sqr_pixel!(
40    resize_sqr_pixel_u16_c4,
41    u16,
42    C4,
43    nppiResizeSqrPixel_16u_C4R_Ctx
44);
45impl_resize_sqr_pixel!(
46    resize_sqr_pixel_u16_ac4,
47    u16,
48    AC4,
49    nppiResizeSqrPixel_16u_AC4R_Ctx
50);
51impl_resize_sqr_pixel!(
52    resize_sqr_pixel_i16_c1,
53    i16,
54    C1,
55    nppiResizeSqrPixel_16s_C1R_Ctx
56);
57impl_resize_sqr_pixel!(
58    resize_sqr_pixel_i16_c3,
59    i16,
60    C3,
61    nppiResizeSqrPixel_16s_C3R_Ctx
62);
63impl_resize_sqr_pixel!(
64    resize_sqr_pixel_i16_c4,
65    i16,
66    C4,
67    nppiResizeSqrPixel_16s_C4R_Ctx
68);
69impl_resize_sqr_pixel!(
70    resize_sqr_pixel_i16_ac4,
71    i16,
72    AC4,
73    nppiResizeSqrPixel_16s_AC4R_Ctx
74);
75impl_resize_sqr_pixel!(
76    resize_sqr_pixel_f32_c1,
77    f32,
78    C1,
79    nppiResizeSqrPixel_32f_C1R_Ctx
80);
81impl_resize_sqr_pixel!(
82    resize_sqr_pixel_f32_c3,
83    f32,
84    C3,
85    nppiResizeSqrPixel_32f_C3R_Ctx
86);
87impl_resize_sqr_pixel!(
88    resize_sqr_pixel_f32_c4,
89    f32,
90    C4,
91    nppiResizeSqrPixel_32f_C4R_Ctx
92);
93impl_resize_sqr_pixel!(
94    resize_sqr_pixel_f32_ac4,
95    f32,
96    AC4,
97    nppiResizeSqrPixel_32f_AC4R_Ctx
98);
99impl_resize_sqr_pixel!(
100    resize_sqr_pixel_f64_c1,
101    f64,
102    C1,
103    nppiResizeSqrPixel_64f_C1R_Ctx
104);
105impl_resize_sqr_pixel!(
106    resize_sqr_pixel_f64_c3,
107    f64,
108    C3,
109    nppiResizeSqrPixel_64f_C3R_Ctx
110);
111impl_resize_sqr_pixel!(
112    resize_sqr_pixel_f64_c4,
113    f64,
114    C4,
115    nppiResizeSqrPixel_64f_C4R_Ctx
116);
117impl_resize_sqr_pixel!(
118    resize_sqr_pixel_f64_ac4,
119    f64,
120    AC4,
121    nppiResizeSqrPixel_64f_AC4R_Ctx
122);
123
124impl_generic_resize_sqr_pixel_operation!(
125    ResizeSqrPixelC1,
126    resize_sqr_pixel,
127    resize_sqr_pixel_c1,
128    C1,
129    [
130        u8 => resize_sqr_pixel_u8_c1,
131        u16 => resize_sqr_pixel_u16_c1,
132        i16 => resize_sqr_pixel_i16_c1,
133        f32 => resize_sqr_pixel_f32_c1,
134        f64 => resize_sqr_pixel_f64_c1,
135    ]
136);
137impl_generic_resize_sqr_pixel_operation!(
138    ResizeSqrPixelC3,
139    resize_sqr_pixel,
140    resize_sqr_pixel_c3,
141    C3,
142    [
143        u8 => resize_sqr_pixel_u8_c3,
144        u16 => resize_sqr_pixel_u16_c3,
145        i16 => resize_sqr_pixel_i16_c3,
146        f32 => resize_sqr_pixel_f32_c3,
147        f64 => resize_sqr_pixel_f64_c3,
148    ]
149);
150impl_generic_resize_sqr_pixel_operation!(
151    ResizeSqrPixelC4,
152    resize_sqr_pixel,
153    resize_sqr_pixel_c4,
154    C4,
155    [
156        u8 => resize_sqr_pixel_u8_c4,
157        u16 => resize_sqr_pixel_u16_c4,
158        i16 => resize_sqr_pixel_i16_c4,
159        f32 => resize_sqr_pixel_f32_c4,
160        f64 => resize_sqr_pixel_f64_c4,
161    ]
162);
163impl_generic_resize_sqr_pixel_operation!(
164    ResizeSqrPixelAc4,
165    resize_sqr_pixel,
166    resize_sqr_pixel_ac4,
167    AC4,
168    [
169        u8 => resize_sqr_pixel_u8_ac4,
170        u16 => resize_sqr_pixel_u16_ac4,
171        i16 => resize_sqr_pixel_i16_ac4,
172        f32 => resize_sqr_pixel_f32_ac4,
173        f64 => resize_sqr_pixel_f64_ac4,
174    ]
175);
176
177impl_resize_sqr_pixel_planar!(resize_sqr_pixel_u8_p3, u8, 3, nppiResizeSqrPixel_8u_P3R_Ctx);
178impl_resize_sqr_pixel_planar!(resize_sqr_pixel_u8_p4, u8, 4, nppiResizeSqrPixel_8u_P4R_Ctx);
179impl_resize_sqr_pixel_planar!(
180    resize_sqr_pixel_u16_p3,
181    u16,
182    3,
183    nppiResizeSqrPixel_16u_P3R_Ctx
184);
185impl_resize_sqr_pixel_planar!(
186    resize_sqr_pixel_u16_p4,
187    u16,
188    4,
189    nppiResizeSqrPixel_16u_P4R_Ctx
190);
191impl_resize_sqr_pixel_planar!(
192    resize_sqr_pixel_i16_p3,
193    i16,
194    3,
195    nppiResizeSqrPixel_16s_P3R_Ctx
196);
197impl_resize_sqr_pixel_planar!(
198    resize_sqr_pixel_i16_p4,
199    i16,
200    4,
201    nppiResizeSqrPixel_16s_P4R_Ctx
202);
203impl_resize_sqr_pixel_planar!(
204    resize_sqr_pixel_f32_p3,
205    f32,
206    3,
207    nppiResizeSqrPixel_32f_P3R_Ctx
208);
209impl_resize_sqr_pixel_planar!(
210    resize_sqr_pixel_f32_p4,
211    f32,
212    4,
213    nppiResizeSqrPixel_32f_P4R_Ctx
214);
215impl_resize_sqr_pixel_planar!(
216    resize_sqr_pixel_f64_p3,
217    f64,
218    3,
219    nppiResizeSqrPixel_64f_P3R_Ctx
220);
221impl_resize_sqr_pixel_planar!(
222    resize_sqr_pixel_f64_p4,
223    f64,
224    4,
225    nppiResizeSqrPixel_64f_P4R_Ctx
226);
227
228pub trait ResizeSqrPixelPlanar<const PLANES: usize>: DataTypeLike {
229    fn resize_sqr_pixel_planar(
230        stream_context: &StreamContext,
231        resize: &ResizeSqrPixel,
232        source: &PlanarImageView<'_, Self, PLANES>,
233        destination: &mut PlanarImageViewMut<'_, Self, PLANES>,
234    ) -> Result<()>;
235}
236
237macro_rules! impl_resize_sqr_pixel_planar_dispatch {
238    ($ty:ty, $planes:literal, $function:ident) => {
239        impl ResizeSqrPixelPlanar<$planes> for $ty {
240            fn resize_sqr_pixel_planar(
241                stream_context: &StreamContext,
242                resize: &ResizeSqrPixel,
243                source: &PlanarImageView<'_, Self, $planes>,
244                destination: &mut PlanarImageViewMut<'_, Self, $planes>,
245            ) -> Result<()> {
246                $function(stream_context, resize, source, destination)
247            }
248        }
249    };
250}
251
252impl_resize_sqr_pixel_planar_dispatch!(u8, 3, resize_sqr_pixel_u8_p3);
253impl_resize_sqr_pixel_planar_dispatch!(u8, 4, resize_sqr_pixel_u8_p4);
254impl_resize_sqr_pixel_planar_dispatch!(u16, 3, resize_sqr_pixel_u16_p3);
255impl_resize_sqr_pixel_planar_dispatch!(u16, 4, resize_sqr_pixel_u16_p4);
256impl_resize_sqr_pixel_planar_dispatch!(i16, 3, resize_sqr_pixel_i16_p3);
257impl_resize_sqr_pixel_planar_dispatch!(i16, 4, resize_sqr_pixel_i16_p4);
258impl_resize_sqr_pixel_planar_dispatch!(f32, 3, resize_sqr_pixel_f32_p3);
259impl_resize_sqr_pixel_planar_dispatch!(f32, 4, resize_sqr_pixel_f32_p4);
260impl_resize_sqr_pixel_planar_dispatch!(f64, 3, resize_sqr_pixel_f64_p3);
261impl_resize_sqr_pixel_planar_dispatch!(f64, 4, resize_sqr_pixel_f64_p4);
262
263pub fn resize_sqr_pixel_planar<T, const PLANES: usize>(
264    stream_context: &StreamContext,
265    resize: &ResizeSqrPixel,
266    source: &PlanarImageView<'_, T, PLANES>,
267    destination: &mut PlanarImageViewMut<'_, T, PLANES>,
268) -> Result<()>
269where
270    T: ResizeSqrPixelPlanar<PLANES>,
271{
272    T::resize_sqr_pixel_planar(stream_context, resize, source, destination)
273}
274
275impl_resize!(resize_u8_c1, u8, C1, nppiResize_8u_C1R_Ctx);
276impl_resize!(resize_u8_c3, u8, C3, nppiResize_8u_C3R_Ctx);
277impl_resize!(resize_u8_c4, u8, C4, nppiResize_8u_C4R_Ctx);
278impl_resize!(resize_u8_ac4, u8, AC4, nppiResize_8u_AC4R_Ctx);
279impl_resize!(resize_u16_c1, u16, C1, nppiResize_16u_C1R_Ctx);
280impl_resize!(resize_u16_c3, u16, C3, nppiResize_16u_C3R_Ctx);
281impl_resize!(resize_u16_c4, u16, C4, nppiResize_16u_C4R_Ctx);
282impl_resize!(resize_u16_ac4, u16, AC4, nppiResize_16u_AC4R_Ctx);
283impl_resize!(resize_i16_c1, i16, C1, nppiResize_16s_C1R_Ctx);
284impl_resize!(resize_i16_c3, i16, C3, nppiResize_16s_C3R_Ctx);
285impl_resize!(resize_i16_c4, i16, C4, nppiResize_16s_C4R_Ctx);
286impl_resize!(resize_i16_ac4, i16, AC4, nppiResize_16s_AC4R_Ctx);
287impl_resize!(resize_f16_c1, f16, C1, nppiResize_16f_C1R_Ctx);
288impl_resize!(resize_f16_c3, f16, C3, nppiResize_16f_C3R_Ctx);
289impl_resize!(resize_f16_c4, f16, C4, nppiResize_16f_C4R_Ctx);
290impl_resize!(resize_f32_c1, f32, C1, nppiResize_32f_C1R_Ctx);
291impl_resize!(resize_f32_c3, f32, C3, nppiResize_32f_C3R_Ctx);
292impl_resize!(resize_f32_c4, f32, C4, nppiResize_32f_C4R_Ctx);
293impl_resize!(resize_f32_ac4, f32, AC4, nppiResize_32f_AC4R_Ctx);
294
295impl_generic_resize_operation!(ResizeC1, resize, resize_c1, C1, [
296    u8 => resize_u8_c1,
297    u16 => resize_u16_c1,
298    i16 => resize_i16_c1,
299    f16 => resize_f16_c1,
300    f32 => resize_f32_c1,
301]);
302impl_generic_resize_operation!(ResizeC3, resize, resize_c3, C3, [
303    u8 => resize_u8_c3,
304    u16 => resize_u16_c3,
305    i16 => resize_i16_c3,
306    f16 => resize_f16_c3,
307    f32 => resize_f32_c3,
308]);
309impl_generic_resize_operation!(ResizeC4, resize, resize_c4, C4, [
310    u8 => resize_u8_c4,
311    u16 => resize_u16_c4,
312    i16 => resize_i16_c4,
313    f16 => resize_f16_c4,
314    f32 => resize_f32_c4,
315]);
316impl_generic_resize_operation!(ResizeAc4, resize, resize_ac4, AC4, [
317    u8 => resize_u8_ac4,
318    u16 => resize_u16_ac4,
319    i16 => resize_i16_ac4,
320    f32 => resize_f32_ac4,
321]);
322
323impl_resize_planar!(resize_u8_p3, u8, 3, nppiResize_8u_P3R_Ctx);
324impl_resize_planar!(resize_u8_p4, u8, 4, nppiResize_8u_P4R_Ctx);
325impl_resize_planar!(resize_u16_p3, u16, 3, nppiResize_16u_P3R_Ctx);
326impl_resize_planar!(resize_u16_p4, u16, 4, nppiResize_16u_P4R_Ctx);
327impl_resize_planar!(resize_i16_p3, i16, 3, nppiResize_16s_P3R_Ctx);
328impl_resize_planar!(resize_i16_p4, i16, 4, nppiResize_16s_P4R_Ctx);
329impl_resize_planar!(resize_f32_p3, f32, 3, nppiResize_32f_P3R_Ctx);
330impl_resize_planar!(resize_f32_p4, f32, 4, nppiResize_32f_P4R_Ctx);
331
332pub trait ResizePlanar<const PLANES: usize>: DataTypeLike {
333    fn resize_planar(
334        stream_context: &StreamContext,
335        resize: &Resize,
336        source: &PlanarImageView<'_, Self, PLANES>,
337        destination: &mut PlanarImageViewMut<'_, Self, PLANES>,
338    ) -> Result<()>;
339}
340
341macro_rules! impl_resize_planar_dispatch {
342    ($ty:ty, $planes:literal, $function:ident) => {
343        impl ResizePlanar<$planes> for $ty {
344            fn resize_planar(
345                stream_context: &StreamContext,
346                resize: &Resize,
347                source: &PlanarImageView<'_, Self, $planes>,
348                destination: &mut PlanarImageViewMut<'_, Self, $planes>,
349            ) -> Result<()> {
350                $function(stream_context, resize, source, destination)
351            }
352        }
353    };
354}
355
356impl_resize_planar_dispatch!(u8, 3, resize_u8_p3);
357impl_resize_planar_dispatch!(u8, 4, resize_u8_p4);
358impl_resize_planar_dispatch!(u16, 3, resize_u16_p3);
359impl_resize_planar_dispatch!(u16, 4, resize_u16_p4);
360impl_resize_planar_dispatch!(i16, 3, resize_i16_p3);
361impl_resize_planar_dispatch!(i16, 4, resize_i16_p4);
362impl_resize_planar_dispatch!(f32, 3, resize_f32_p3);
363impl_resize_planar_dispatch!(f32, 4, resize_f32_p4);
364
365pub fn resize_planar<T, const PLANES: usize>(
366    stream_context: &StreamContext,
367    resize: &Resize,
368    source: &PlanarImageView<'_, T, PLANES>,
369    destination: &mut PlanarImageViewMut<'_, T, PLANES>,
370) -> Result<()>
371where
372    T: ResizePlanar<PLANES>,
373{
374    T::resize_planar(stream_context, resize, source, destination)
375}
376
377impl_resize_batch!(resize_batch_u8_c1, u8, C1, nppiResizeBatch_8u_C1R_Ctx);
378impl_resize_batch!(resize_batch_u8_c3, u8, C3, nppiResizeBatch_8u_C3R_Ctx);
379impl_resize_batch!(resize_batch_u8_c4, u8, C4, nppiResizeBatch_8u_C4R_Ctx);
380impl_resize_batch!(resize_batch_u8_ac4, u8, AC4, nppiResizeBatch_8u_AC4R_Ctx);
381impl_resize_batch!(resize_batch_f32_c1, f32, C1, nppiResizeBatch_32f_C1R_Ctx);
382impl_resize_batch!(resize_batch_f32_c3, f32, C3, nppiResizeBatch_32f_C3R_Ctx);
383impl_resize_batch!(resize_batch_f32_c4, f32, C4, nppiResizeBatch_32f_C4R_Ctx);
384impl_resize_batch!(resize_batch_f32_ac4, f32, AC4, nppiResizeBatch_32f_AC4R_Ctx);
385
386pub trait ResizeBatchOperation<L: ChannelLayout>: DataTypeLike {
387    fn resize_batch(
388        stream_context: &StreamContext,
389        resize: &Resize,
390        sources: &[ImageView<'_, Self, L>],
391        destinations: &mut [ImageViewMut<'_, Self, L>],
392    ) -> Result<()>;
393}
394
395macro_rules! impl_resize_batch_operation {
396    ($ty:ty, $layout:ty, $function:ident) => {
397        impl ResizeBatchOperation<$layout> for $ty {
398            fn resize_batch(
399                stream_context: &StreamContext,
400                resize: &Resize,
401                sources: &[ImageView<'_, Self, $layout>],
402                destinations: &mut [ImageViewMut<'_, Self, $layout>],
403            ) -> Result<()> {
404                $function(stream_context, resize, sources, destinations)
405            }
406        }
407    };
408}
409
410impl_resize_batch_operation!(u8, C1, resize_batch_u8_c1);
411impl_resize_batch_operation!(u8, C3, resize_batch_u8_c3);
412impl_resize_batch_operation!(u8, C4, resize_batch_u8_c4);
413impl_resize_batch_operation!(u8, AC4, resize_batch_u8_ac4);
414impl_resize_batch_operation!(f32, C1, resize_batch_f32_c1);
415impl_resize_batch_operation!(f32, C3, resize_batch_f32_c3);
416impl_resize_batch_operation!(f32, C4, resize_batch_f32_c4);
417impl_resize_batch_operation!(f32, AC4, resize_batch_f32_ac4);
418
419pub fn resize_batch<T, L>(
420    stream_context: &StreamContext,
421    resize: &Resize,
422    sources: &[ImageView<'_, T, L>],
423    destinations: &mut [ImageViewMut<'_, T, L>],
424) -> Result<()>
425where
426    T: ResizeBatchOperation<L>,
427    L: ChannelLayout,
428{
429    T::resize_batch(stream_context, resize, sources, destinations)
430}
431
432impl_resize_batch_advanced!(
433    resize_batch_u8_c1_advanced,
434    u8,
435    C1,
436    nppiResizeBatch_8u_C1R_Advanced_Ctx
437);
438impl_resize_batch_advanced!(
439    resize_batch_u8_c3_advanced,
440    u8,
441    C3,
442    nppiResizeBatch_8u_C3R_Advanced_Ctx
443);
444impl_resize_batch_advanced!(
445    resize_batch_u8_c4_advanced,
446    u8,
447    C4,
448    nppiResizeBatch_8u_C4R_Advanced_Ctx
449);
450impl_resize_batch_advanced!(
451    resize_batch_u8_ac4_advanced,
452    u8,
453    AC4,
454    nppiResizeBatch_8u_AC4R_Advanced_Ctx
455);
456impl_resize_batch_advanced!(
457    resize_batch_f16_c1_advanced,
458    f16,
459    C1,
460    nppiResizeBatch_16f_C1R_Advanced_Ctx
461);
462impl_resize_batch_advanced!(
463    resize_batch_f16_c3_advanced,
464    f16,
465    C3,
466    nppiResizeBatch_16f_C3R_Advanced_Ctx
467);
468impl_resize_batch_advanced!(
469    resize_batch_f16_c4_advanced,
470    f16,
471    C4,
472    nppiResizeBatch_16f_C4R_Advanced_Ctx
473);
474impl_resize_batch_advanced!(
475    resize_batch_f32_c1_advanced,
476    f32,
477    C1,
478    nppiResizeBatch_32f_C1R_Advanced_Ctx
479);
480impl_resize_batch_advanced!(
481    resize_batch_f32_c3_advanced,
482    f32,
483    C3,
484    nppiResizeBatch_32f_C3R_Advanced_Ctx
485);
486impl_resize_batch_advanced!(
487    resize_batch_f32_c4_advanced,
488    f32,
489    C4,
490    nppiResizeBatch_32f_C4R_Advanced_Ctx
491);
492impl_resize_batch_advanced!(
493    resize_batch_f32_ac4_advanced,
494    f32,
495    AC4,
496    nppiResizeBatch_32f_AC4R_Advanced_Ctx
497);
498
499pub trait ResizeBatchAdvancedOperation<L: ChannelLayout>: DataTypeLike {
500    fn resize_batch_advanced(
501        stream_context: &StreamContext,
502        rois: &[ResizeBatchAdvanced],
503        interpolation: InterpolationMode,
504        sources: &[ImageView<'_, Self, L>],
505        destinations: &mut [ImageViewMut<'_, Self, L>],
506    ) -> Result<()>;
507}
508
509macro_rules! impl_resize_batch_advanced_operation {
510    ($ty:ty, $layout:ty, $function:ident) => {
511        impl ResizeBatchAdvancedOperation<$layout> for $ty {
512            fn resize_batch_advanced(
513                stream_context: &StreamContext,
514                rois: &[ResizeBatchAdvanced],
515                interpolation: InterpolationMode,
516                sources: &[ImageView<'_, Self, $layout>],
517                destinations: &mut [ImageViewMut<'_, Self, $layout>],
518            ) -> Result<()> {
519                $function(stream_context, rois, interpolation, sources, destinations)
520            }
521        }
522    };
523}
524
525impl_resize_batch_advanced_operation!(u8, C1, resize_batch_u8_c1_advanced);
526impl_resize_batch_advanced_operation!(u8, C3, resize_batch_u8_c3_advanced);
527impl_resize_batch_advanced_operation!(u8, C4, resize_batch_u8_c4_advanced);
528impl_resize_batch_advanced_operation!(u8, AC4, resize_batch_u8_ac4_advanced);
529impl_resize_batch_advanced_operation!(f16, C1, resize_batch_f16_c1_advanced);
530impl_resize_batch_advanced_operation!(f16, C3, resize_batch_f16_c3_advanced);
531impl_resize_batch_advanced_operation!(f16, C4, resize_batch_f16_c4_advanced);
532impl_resize_batch_advanced_operation!(f32, C1, resize_batch_f32_c1_advanced);
533impl_resize_batch_advanced_operation!(f32, C3, resize_batch_f32_c3_advanced);
534impl_resize_batch_advanced_operation!(f32, C4, resize_batch_f32_c4_advanced);
535impl_resize_batch_advanced_operation!(f32, AC4, resize_batch_f32_ac4_advanced);
536
537pub fn resize_batch_advanced<T, L>(
538    stream_context: &StreamContext,
539    rois: &[ResizeBatchAdvanced],
540    interpolation: InterpolationMode,
541    sources: &[ImageView<'_, T, L>],
542    destinations: &mut [ImageViewMut<'_, T, L>],
543) -> Result<()>
544where
545    T: ResizeBatchAdvancedOperation<L>,
546    L: ChannelLayout,
547{
548    T::resize_batch_advanced(stream_context, rois, interpolation, sources, destinations)
549}