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);