Skip to main content

singe_npp/image/
arithmetic_alpha.rs

1use super::*;
2
3macro_rules! impl_alpha_comp_constant {
4    ($name:ident, $ty:ty, $layout:ty, $ffi:ident) => {
5        pub fn $name(
6            stream_context: &StreamContext,
7            source1: &ImageView<'_, $ty, $layout>,
8            alpha1: $ty,
9            source2: &ImageView<'_, $ty, $layout>,
10            alpha2: $ty,
11            destination: &mut ImageViewMut<'_, $ty, $layout>,
12            operation: AlphaOperation,
13        ) -> Result<()> {
14            validate_same_size(source1.size(), source2.size())?;
15            validate_same_size(source1.size(), destination.size())?;
16
17            unsafe {
18                try_ffi!(sys::$ffi(
19                    source1.as_ptr().cast(),
20                    source1.step(),
21                    alpha1,
22                    source2.as_ptr().cast(),
23                    source2.step(),
24                    alpha2,
25                    destination.as_mut_ptr().cast(),
26                    destination.step(),
27                    source1.size().into(),
28                    operation.into(),
29                    stream_context.as_raw(),
30                ))?;
31            }
32            Ok(())
33        }
34    };
35}
36
37impl_alpha_comp_constant!(alpha_comp_constant_u8_c1, u8, C1, nppiAlphaCompC_8u_C1R_Ctx);
38impl_alpha_comp_constant!(alpha_comp_constant_u8_c3, u8, C3, nppiAlphaCompC_8u_C3R_Ctx);
39impl_alpha_comp_constant!(alpha_comp_constant_u8_c4, u8, C4, nppiAlphaCompC_8u_C4R_Ctx);
40impl_alpha_comp_constant!(
41    alpha_comp_constant_u8_ac4,
42    u8,
43    AC4,
44    nppiAlphaCompC_8u_AC4R_Ctx
45);
46impl_alpha_comp_constant!(alpha_comp_constant_i8_c1, i8, C1, nppiAlphaCompC_8s_C1R_Ctx);
47impl_alpha_comp_constant!(
48    alpha_comp_constant_u16_c1,
49    u16,
50    C1,
51    nppiAlphaCompC_16u_C1R_Ctx
52);
53impl_alpha_comp_constant!(
54    alpha_comp_constant_u16_c3,
55    u16,
56    C3,
57    nppiAlphaCompC_16u_C3R_Ctx
58);
59impl_alpha_comp_constant!(
60    alpha_comp_constant_u16_c4,
61    u16,
62    C4,
63    nppiAlphaCompC_16u_C4R_Ctx
64);
65impl_alpha_comp_constant!(
66    alpha_comp_constant_u16_ac4,
67    u16,
68    AC4,
69    nppiAlphaCompC_16u_AC4R_Ctx
70);
71impl_alpha_comp_constant!(
72    alpha_comp_constant_i16_c1,
73    i16,
74    C1,
75    nppiAlphaCompC_16s_C1R_Ctx
76);
77impl_alpha_comp_constant!(
78    alpha_comp_constant_u32_c1,
79    u32,
80    C1,
81    nppiAlphaCompC_32u_C1R_Ctx
82);
83impl_alpha_comp_constant!(
84    alpha_comp_constant_i32_c1,
85    i32,
86    C1,
87    nppiAlphaCompC_32s_C1R_Ctx
88);
89impl_alpha_comp_constant!(
90    alpha_comp_constant_f32_c1,
91    f32,
92    C1,
93    nppiAlphaCompC_32f_C1R_Ctx
94);
95
96macro_rules! impl_alpha_comp {
97    ($name:ident, $ty:ty, $layout:ty, $ffi:ident) => {
98        pub fn $name(
99            stream_context: &StreamContext,
100            source1: &ImageView<'_, $ty, $layout>,
101            source2: &ImageView<'_, $ty, $layout>,
102            destination: &mut ImageViewMut<'_, $ty, $layout>,
103            operation: AlphaOperation,
104        ) -> Result<()> {
105            validate_same_size(source1.size(), source2.size())?;
106            validate_same_size(source1.size(), destination.size())?;
107
108            unsafe {
109                try_ffi!(sys::$ffi(
110                    source1.as_ptr().cast(),
111                    source1.step(),
112                    source2.as_ptr().cast(),
113                    source2.step(),
114                    destination.as_mut_ptr().cast(),
115                    destination.step(),
116                    source1.size().into(),
117                    operation.into(),
118                    stream_context.as_raw(),
119                ))?;
120            }
121            Ok(())
122        }
123    };
124}
125
126impl_alpha_comp!(alpha_comp_u8_ac1, u8, C1, nppiAlphaComp_8u_AC1R_Ctx);
127impl_alpha_comp!(alpha_comp_u8_ac4, u8, AC4, nppiAlphaComp_8u_AC4R_Ctx);
128impl_alpha_comp!(alpha_comp_i8_ac1, i8, C1, nppiAlphaComp_8s_AC1R_Ctx);
129impl_alpha_comp!(alpha_comp_u16_ac1, u16, C1, nppiAlphaComp_16u_AC1R_Ctx);
130impl_alpha_comp!(alpha_comp_u16_ac4, u16, AC4, nppiAlphaComp_16u_AC4R_Ctx);
131impl_alpha_comp!(alpha_comp_i16_ac1, i16, C1, nppiAlphaComp_16s_AC1R_Ctx);
132impl_alpha_comp!(alpha_comp_u32_ac1, u32, C1, nppiAlphaComp_32u_AC1R_Ctx);
133impl_alpha_comp!(alpha_comp_u32_ac4, u32, AC4, nppiAlphaComp_32u_AC4R_Ctx);
134impl_alpha_comp!(alpha_comp_i32_ac1, i32, C1, nppiAlphaComp_32s_AC1R_Ctx);
135impl_alpha_comp!(alpha_comp_i32_ac4, i32, AC4, nppiAlphaComp_32s_AC4R_Ctx);
136impl_alpha_comp!(alpha_comp_f32_ac1, f32, C1, nppiAlphaComp_32f_AC1R_Ctx);
137impl_alpha_comp!(alpha_comp_f32_ac4, f32, AC4, nppiAlphaComp_32f_AC4R_Ctx);
138
139macro_rules! impl_comp_color_key_scalar {
140    ($name:ident, $ffi:ident) => {
141        pub fn $name(
142            stream_context: &StreamContext,
143            source1: &ImageView<'_, u8, C1>,
144            source2: &ImageView<'_, u8, C1>,
145            color_key: u8,
146            destination: &mut ImageViewMut<'_, u8, C1>,
147        ) -> Result<()> {
148            validate_same_size(source1.size(), source2.size())?;
149            validate_same_size(source1.size(), destination.size())?;
150
151            unsafe {
152                try_ffi!(sys::$ffi(
153                    source1.as_ptr().cast(),
154                    source1.step(),
155                    source2.as_ptr().cast(),
156                    source2.step(),
157                    destination.as_mut_ptr().cast(),
158                    destination.step(),
159                    source1.size().into(),
160                    color_key,
161                    stream_context.as_raw(),
162                ))?;
163            }
164            Ok(())
165        }
166    };
167}
168
169macro_rules! impl_comp_color_key_array {
170    ($name:ident, $layout:ty, $channels:literal, $ffi:ident) => {
171        pub fn $name(
172            stream_context: &StreamContext,
173            source1: &ImageView<'_, u8, $layout>,
174            source2: &ImageView<'_, u8, $layout>,
175            color_key: [u8; $channels],
176            destination: &mut ImageViewMut<'_, u8, $layout>,
177        ) -> Result<()> {
178            validate_same_size(source1.size(), source2.size())?;
179            validate_same_size(source1.size(), destination.size())?;
180
181            let mut color_key = color_key;
182            unsafe {
183                try_ffi!(sys::$ffi(
184                    source1.as_ptr().cast(),
185                    source1.step(),
186                    source2.as_ptr().cast(),
187                    source2.step(),
188                    destination.as_mut_ptr().cast(),
189                    destination.step(),
190                    source1.size().into(),
191                    color_key.as_mut_ptr().cast(),
192                    stream_context.as_raw(),
193                ))?;
194            }
195            Ok(())
196        }
197    };
198}
199
200macro_rules! impl_alpha_comp_color_key {
201    ($name:ident, $ffi:ident) => {
202        pub fn $name(
203            stream_context: &StreamContext,
204            source1: &ImageView<'_, u8, AC4>,
205            alpha1: u8,
206            source2: &ImageView<'_, u8, AC4>,
207            alpha2: u8,
208            color_key: [u8; 4],
209            destination: &mut ImageViewMut<'_, u8, AC4>,
210            operation: AlphaOperation,
211        ) -> Result<()> {
212            validate_same_size(source1.size(), source2.size())?;
213            validate_same_size(source1.size(), destination.size())?;
214
215            let mut color_key = color_key;
216            unsafe {
217                try_ffi!(sys::$ffi(
218                    source1.as_ptr().cast(),
219                    source1.step(),
220                    alpha1,
221                    source2.as_ptr().cast(),
222                    source2.step(),
223                    alpha2,
224                    destination.as_mut_ptr().cast(),
225                    destination.step(),
226                    source1.size().into(),
227                    color_key.as_mut_ptr().cast(),
228                    operation.into(),
229                    stream_context.as_raw(),
230                ))?;
231            }
232            Ok(())
233        }
234    };
235}
236
237impl_comp_color_key_scalar!(comp_color_key_u8_c1, nppiCompColorKey_8u_C1R_Ctx);
238impl_comp_color_key_array!(comp_color_key_u8_c3, C3, 3, nppiCompColorKey_8u_C3R_Ctx);
239impl_comp_color_key_array!(comp_color_key_u8_c4, C4, 4, nppiCompColorKey_8u_C4R_Ctx);
240impl_alpha_comp_color_key!(
241    alpha_comp_color_key_u8_ac4,
242    nppiAlphaCompColorKey_8u_AC4R_Ctx
243);
244
245macro_rules! impl_alpha_premultiply_constant {
246    ($name:ident, $ty:ty, $layout:ty, $ffi:ident) => {
247        pub fn $name(
248            stream_context: &StreamContext,
249            source: &ImageView<'_, $ty, $layout>,
250            alpha: $ty,
251            destination: &mut ImageViewMut<'_, $ty, $layout>,
252        ) -> Result<()> {
253            validate_same_size(source.size(), destination.size())?;
254
255            unsafe {
256                try_ffi!(sys::$ffi(
257                    source.as_ptr().cast(),
258                    source.step(),
259                    alpha,
260                    destination.as_mut_ptr().cast(),
261                    destination.step(),
262                    source.size().into(),
263                    stream_context.as_raw(),
264                ))?;
265            }
266            Ok(())
267        }
268    };
269}
270
271macro_rules! impl_alpha_premultiply_constant_in_place {
272    ($name:ident, $ty:ty, $layout:ty, $ffi:ident) => {
273        pub fn $name(
274            stream_context: &StreamContext,
275            alpha: $ty,
276            source_destination: &mut ImageViewMut<'_, $ty, $layout>,
277        ) -> Result<()> {
278            unsafe {
279                try_ffi!(sys::$ffi(
280                    alpha,
281                    source_destination.as_mut_ptr().cast(),
282                    source_destination.step(),
283                    source_destination.size().into(),
284                    stream_context.as_raw(),
285                ))?;
286            }
287            Ok(())
288        }
289    };
290}
291
292macro_rules! impl_alpha_premultiply {
293    ($name:ident, $ty:ty, $ffi:ident) => {
294        pub fn $name(
295            stream_context: &StreamContext,
296            source: &ImageView<'_, $ty, AC4>,
297            destination: &mut ImageViewMut<'_, $ty, AC4>,
298        ) -> Result<()> {
299            validate_same_size(source.size(), destination.size())?;
300
301            unsafe {
302                try_ffi!(sys::$ffi(
303                    source.as_ptr().cast(),
304                    source.step(),
305                    destination.as_mut_ptr().cast(),
306                    destination.step(),
307                    source.size().into(),
308                    stream_context.as_raw(),
309                ))?;
310            }
311            Ok(())
312        }
313    };
314}
315
316macro_rules! impl_alpha_premultiply_in_place {
317    ($name:ident, $ty:ty, $ffi:ident) => {
318        pub fn $name(
319            stream_context: &StreamContext,
320            source_destination: &mut ImageViewMut<'_, $ty, AC4>,
321        ) -> Result<()> {
322            unsafe {
323                try_ffi!(sys::$ffi(
324                    source_destination.as_mut_ptr().cast(),
325                    source_destination.step(),
326                    source_destination.size().into(),
327                    stream_context.as_raw(),
328                ))?;
329            }
330            Ok(())
331        }
332    };
333}
334
335impl_alpha_premultiply_constant!(
336    alpha_premultiply_constant_u8_c1,
337    u8,
338    C1,
339    nppiAlphaPremulC_8u_C1R_Ctx
340);
341impl_alpha_premultiply_constant!(
342    alpha_premultiply_constant_u8_c3,
343    u8,
344    C3,
345    nppiAlphaPremulC_8u_C3R_Ctx
346);
347impl_alpha_premultiply_constant!(
348    alpha_premultiply_constant_u8_c4,
349    u8,
350    C4,
351    nppiAlphaPremulC_8u_C4R_Ctx
352);
353impl_alpha_premultiply_constant!(
354    alpha_premultiply_constant_u8_ac4,
355    u8,
356    AC4,
357    nppiAlphaPremulC_8u_AC4R_Ctx
358);
359impl_alpha_premultiply_constant!(
360    alpha_premultiply_constant_u16_c1,
361    u16,
362    C1,
363    nppiAlphaPremulC_16u_C1R_Ctx
364);
365impl_alpha_premultiply_constant!(
366    alpha_premultiply_constant_u16_c3,
367    u16,
368    C3,
369    nppiAlphaPremulC_16u_C3R_Ctx
370);
371impl_alpha_premultiply_constant!(
372    alpha_premultiply_constant_u16_c4,
373    u16,
374    C4,
375    nppiAlphaPremulC_16u_C4R_Ctx
376);
377impl_alpha_premultiply_constant!(
378    alpha_premultiply_constant_u16_ac4,
379    u16,
380    AC4,
381    nppiAlphaPremulC_16u_AC4R_Ctx
382);
383
384impl_alpha_premultiply_constant_in_place!(
385    alpha_premultiply_constant_u8_c1_in_place,
386    u8,
387    C1,
388    nppiAlphaPremulC_8u_C1IR_Ctx
389);
390impl_alpha_premultiply_constant_in_place!(
391    alpha_premultiply_constant_u8_c3_in_place,
392    u8,
393    C3,
394    nppiAlphaPremulC_8u_C3IR_Ctx
395);
396impl_alpha_premultiply_constant_in_place!(
397    alpha_premultiply_constant_u8_c4_in_place,
398    u8,
399    C4,
400    nppiAlphaPremulC_8u_C4IR_Ctx
401);
402impl_alpha_premultiply_constant_in_place!(
403    alpha_premultiply_constant_u8_ac4_in_place,
404    u8,
405    AC4,
406    nppiAlphaPremulC_8u_AC4IR_Ctx
407);
408impl_alpha_premultiply_constant_in_place!(
409    alpha_premultiply_constant_u16_c1_in_place,
410    u16,
411    C1,
412    nppiAlphaPremulC_16u_C1IR_Ctx
413);
414impl_alpha_premultiply_constant_in_place!(
415    alpha_premultiply_constant_u16_c3_in_place,
416    u16,
417    C3,
418    nppiAlphaPremulC_16u_C3IR_Ctx
419);
420impl_alpha_premultiply_constant_in_place!(
421    alpha_premultiply_constant_u16_c4_in_place,
422    u16,
423    C4,
424    nppiAlphaPremulC_16u_C4IR_Ctx
425);
426impl_alpha_premultiply_constant_in_place!(
427    alpha_premultiply_constant_u16_ac4_in_place,
428    u16,
429    AC4,
430    nppiAlphaPremulC_16u_AC4IR_Ctx
431);
432
433impl_alpha_premultiply!(alpha_premultiply_u8_ac4, u8, nppiAlphaPremul_8u_AC4R_Ctx);
434impl_alpha_premultiply!(alpha_premultiply_u16_ac4, u16, nppiAlphaPremul_16u_AC4R_Ctx);
435impl_alpha_premultiply_in_place!(
436    alpha_premultiply_u8_ac4_in_place,
437    u8,
438    nppiAlphaPremul_8u_AC4IR_Ctx
439);
440impl_alpha_premultiply_in_place!(
441    alpha_premultiply_u16_ac4_in_place,
442    u16,
443    nppiAlphaPremul_16u_AC4IR_Ctx
444);
445
446impl_generic_alpha_comp_constant!(
447    AlphaCompConstantC1,
448    alpha_comp_constant,
449    alpha_comp_constant_c1,
450    C1,
451    [
452        u8 => alpha_comp_constant_u8_c1,
453        i8 => alpha_comp_constant_i8_c1,
454        u16 => alpha_comp_constant_u16_c1,
455        i16 => alpha_comp_constant_i16_c1,
456        u32 => alpha_comp_constant_u32_c1,
457        i32 => alpha_comp_constant_i32_c1,
458        f32 => alpha_comp_constant_f32_c1,
459    ]
460);
461impl_generic_alpha_comp_constant!(
462    AlphaCompConstantC3,
463    alpha_comp_constant,
464    alpha_comp_constant_c3,
465    C3,
466    [
467        u8 => alpha_comp_constant_u8_c3,
468        u16 => alpha_comp_constant_u16_c3,
469    ]
470);
471impl_generic_alpha_comp_constant!(
472    AlphaCompConstantC4,
473    alpha_comp_constant,
474    alpha_comp_constant_c4,
475    C4,
476    [
477        u8 => alpha_comp_constant_u8_c4,
478        u16 => alpha_comp_constant_u16_c4,
479    ]
480);
481impl_generic_alpha_comp_constant!(
482    AlphaCompConstantAc4,
483    alpha_comp_constant,
484    alpha_comp_constant_ac4,
485    AC4,
486    [
487        u8 => alpha_comp_constant_u8_ac4,
488        u16 => alpha_comp_constant_u16_ac4,
489    ]
490);
491
492impl_generic_alpha_comp!(
493    AlphaCompAc1,
494    alpha_comp,
495    alpha_comp_ac1,
496    C1,
497    [
498        u8 => alpha_comp_u8_ac1,
499        i8 => alpha_comp_i8_ac1,
500        u16 => alpha_comp_u16_ac1,
501        i16 => alpha_comp_i16_ac1,
502        u32 => alpha_comp_u32_ac1,
503        i32 => alpha_comp_i32_ac1,
504        f32 => alpha_comp_f32_ac1,
505    ]
506);
507impl_generic_alpha_comp!(
508    AlphaCompAc4,
509    alpha_comp,
510    alpha_comp_ac4,
511    AC4,
512    [
513        u8 => alpha_comp_u8_ac4,
514        u16 => alpha_comp_u16_ac4,
515        u32 => alpha_comp_u32_ac4,
516        i32 => alpha_comp_i32_ac4,
517        f32 => alpha_comp_f32_ac4,
518    ]
519);
520
521impl_generic_constant_scalar_operation!(
522    AlphaPremultiplyConstantC1,
523    alpha_premultiply_constant,
524    alpha_premultiply_constant_c1,
525    C1,
526    [
527        u8, u8 => alpha_premultiply_constant_u8_c1,
528        u16, u16 => alpha_premultiply_constant_u16_c1,
529    ]
530);
531impl_generic_constant_scalar_operation_in_place!(
532    AlphaPremultiplyConstantC1InPlace,
533    alpha_premultiply_constant_in_place,
534    alpha_premultiply_constant_c1_in_place,
535    C1,
536    [
537        u8, u8 => alpha_premultiply_constant_u8_c1_in_place,
538        u16, u16 => alpha_premultiply_constant_u16_c1_in_place,
539    ]
540);
541impl_generic_constant_scalar_operation!(
542    AlphaPremultiplyConstantC3,
543    alpha_premultiply_constant,
544    alpha_premultiply_constant_c3,
545    C3,
546    [
547        u8, u8 => alpha_premultiply_constant_u8_c3,
548        u16, u16 => alpha_premultiply_constant_u16_c3,
549    ]
550);
551impl_generic_constant_scalar_operation_in_place!(
552    AlphaPremultiplyConstantC3InPlace,
553    alpha_premultiply_constant_in_place,
554    alpha_premultiply_constant_c3_in_place,
555    C3,
556    [
557        u8, u8 => alpha_premultiply_constant_u8_c3_in_place,
558        u16, u16 => alpha_premultiply_constant_u16_c3_in_place,
559    ]
560);
561impl_generic_constant_scalar_operation!(
562    AlphaPremultiplyConstantC4,
563    alpha_premultiply_constant,
564    alpha_premultiply_constant_c4,
565    C4,
566    [
567        u8, u8 => alpha_premultiply_constant_u8_c4,
568        u16, u16 => alpha_premultiply_constant_u16_c4,
569    ]
570);
571impl_generic_constant_scalar_operation_in_place!(
572    AlphaPremultiplyConstantC4InPlace,
573    alpha_premultiply_constant_in_place,
574    alpha_premultiply_constant_c4_in_place,
575    C4,
576    [
577        u8, u8 => alpha_premultiply_constant_u8_c4_in_place,
578        u16, u16 => alpha_premultiply_constant_u16_c4_in_place,
579    ]
580);
581impl_generic_constant_scalar_operation!(
582    AlphaPremultiplyConstantAc4,
583    alpha_premultiply_constant,
584    alpha_premultiply_constant_ac4,
585    AC4,
586    [
587        u8, u8 => alpha_premultiply_constant_u8_ac4,
588        u16, u16 => alpha_premultiply_constant_u16_ac4,
589    ]
590);
591impl_generic_constant_scalar_operation_in_place!(
592    AlphaPremultiplyConstantAc4InPlace,
593    alpha_premultiply_constant_in_place,
594    alpha_premultiply_constant_ac4_in_place,
595    AC4,
596    [
597        u8, u8 => alpha_premultiply_constant_u8_ac4_in_place,
598        u16, u16 => alpha_premultiply_constant_u16_ac4_in_place,
599    ]
600);
601
602impl_generic_unary_operation!(
603    AlphaPremultiplyAc4,
604    alpha_premultiply,
605    alpha_premultiply_ac4,
606    AC4,
607    [
608        u8 => alpha_premultiply_u8_ac4,
609        u16 => alpha_premultiply_u16_ac4,
610    ]
611);
612impl_generic_unary_operation_in_place!(
613    AlphaPremultiplyAc4InPlace,
614    alpha_premultiply_in_place,
615    alpha_premultiply_ac4_in_place,
616    AC4,
617    [
618        u8 => alpha_premultiply_u8_ac4_in_place,
619        u16 => alpha_premultiply_u16_ac4_in_place,
620    ]
621);