Skip to main content

singe_npp/image/
exchange_set.rs

1use super::*;
2
3pub(crate) fn set_u8_c1(
4    stream_context: &StreamContext,
5    value: u8,
6    destination: &mut ImageViewMut<'_, u8, C1>,
7) -> Result<()> {
8    unsafe {
9        try_ffi!(sys::nppiSet_8u_C1R_Ctx(
10            value,
11            destination.as_mut_ptr().cast(),
12            destination.step(),
13            destination.size().into(),
14            stream_context.as_raw(),
15        ))?;
16    }
17    Ok(())
18}
19
20pub(crate) fn set_u8_c2(
21    stream_context: &StreamContext,
22    value: [u8; 2],
23    destination: &mut ImageViewMut<'_, u8, C2>,
24) -> Result<()> {
25    unsafe {
26        try_ffi!(sys::nppiSet_8u_C2R_Ctx(
27            value.as_ptr().cast(),
28            destination.as_mut_ptr().cast(),
29            destination.step(),
30            destination.size().into(),
31            stream_context.as_raw(),
32        ))?;
33    }
34    Ok(())
35}
36
37pub(crate) fn set_u8_c3(
38    stream_context: &StreamContext,
39    value: [u8; 3],
40    destination: &mut ImageViewMut<'_, u8, C3>,
41) -> Result<()> {
42    unsafe {
43        try_ffi!(sys::nppiSet_8u_C3R_Ctx(
44            value.as_ptr().cast(),
45            destination.as_mut_ptr().cast(),
46            destination.step(),
47            destination.size().into(),
48            stream_context.as_raw(),
49        ))?;
50    }
51    Ok(())
52}
53
54pub(crate) fn set_u8_c4(
55    stream_context: &StreamContext,
56    value: [u8; 4],
57    destination: &mut ImageViewMut<'_, u8, C4>,
58) -> Result<()> {
59    unsafe {
60        try_ffi!(sys::nppiSet_8u_C4R_Ctx(
61            value.as_ptr().cast(),
62            destination.as_mut_ptr().cast(),
63            destination.step(),
64            destination.size().into(),
65            stream_context.as_raw(),
66        ))?;
67    }
68    Ok(())
69}
70
71pub(crate) fn set_u8_ac4(
72    stream_context: &StreamContext,
73    value: [u8; 3],
74    destination: &mut ImageViewMut<'_, u8, AC4>,
75) -> Result<()> {
76    unsafe {
77        try_ffi!(sys::nppiSet_8u_AC4R_Ctx(
78            value.as_ptr().cast(),
79            destination.as_mut_ptr().cast(),
80            destination.step(),
81            destination.size().into(),
82            stream_context.as_raw(),
83        ))?;
84    }
85    Ok(())
86}
87
88pub(crate) fn set_masked_u8_c1(
89    stream_context: &StreamContext,
90    value: u8,
91    destination: &mut ImageViewMut<'_, u8, C1>,
92    mask: &MaskView<'_>,
93) -> Result<()> {
94    validate_mask_size(destination.size(), mask.size())?;
95
96    unsafe {
97        try_ffi!(sys::nppiSet_8u_C1MR_Ctx(
98            value,
99            destination.as_mut_ptr().cast(),
100            destination.step(),
101            destination.size().into(),
102            mask.as_ptr().cast(),
103            mask.step(),
104            stream_context.as_raw(),
105        ))?;
106    }
107    Ok(())
108}
109
110pub(crate) fn set_masked_u8_c3(
111    stream_context: &StreamContext,
112    value: [u8; 3],
113    destination: &mut ImageViewMut<'_, u8, C3>,
114    mask: &MaskView<'_>,
115) -> Result<()> {
116    validate_mask_size(destination.size(), mask.size())?;
117
118    unsafe {
119        try_ffi!(sys::nppiSet_8u_C3MR_Ctx(
120            value.as_ptr().cast(),
121            destination.as_mut_ptr().cast(),
122            destination.step(),
123            destination.size().into(),
124            mask.as_ptr().cast(),
125            mask.step(),
126            stream_context.as_raw(),
127        ))?;
128    }
129    Ok(())
130}
131
132pub(crate) fn set_masked_u8_c4(
133    stream_context: &StreamContext,
134    value: [u8; 4],
135    destination: &mut ImageViewMut<'_, u8, C4>,
136    mask: &MaskView<'_>,
137) -> Result<()> {
138    validate_mask_size(destination.size(), mask.size())?;
139
140    unsafe {
141        try_ffi!(sys::nppiSet_8u_C4MR_Ctx(
142            value.as_ptr().cast(),
143            destination.as_mut_ptr().cast(),
144            destination.step(),
145            destination.size().into(),
146            mask.as_ptr().cast(),
147            mask.step(),
148            stream_context.as_raw(),
149        ))?;
150    }
151    Ok(())
152}
153
154pub(crate) fn set_masked_u8_ac4(
155    stream_context: &StreamContext,
156    value: [u8; 3],
157    destination: &mut ImageViewMut<'_, u8, AC4>,
158    mask: &MaskView<'_>,
159) -> Result<()> {
160    validate_mask_size(destination.size(), mask.size())?;
161
162    unsafe {
163        try_ffi!(sys::nppiSet_8u_AC4MR_Ctx(
164            value.as_ptr().cast(),
165            destination.as_mut_ptr().cast(),
166            destination.step(),
167            destination.size().into(),
168            mask.as_ptr().cast(),
169            mask.step(),
170            stream_context.as_raw(),
171        ))?;
172    }
173    Ok(())
174}
175
176impl_set!(set_i8_c1, i8, i8, C1, nppiSet_8s_C1R_Ctx, |value: &i8| {
177    *value
178});
179impl_set!(
180    set_i8_c2,
181    i8,
182    [i8; 2],
183    C2,
184    nppiSet_8s_C2R_Ctx,
185    |value: &[i8; 2]| value.as_ptr()
186);
187impl_set!(
188    set_i8_c3,
189    i8,
190    [i8; 3],
191    C3,
192    nppiSet_8s_C3R_Ctx,
193    |value: &[i8; 3]| value.as_ptr()
194);
195impl_set!(
196    set_i8_c4,
197    i8,
198    [i8; 4],
199    C4,
200    nppiSet_8s_C4R_Ctx,
201    |value: &[i8; 4]| value.as_ptr()
202);
203impl_set!(
204    set_i8_ac4,
205    i8,
206    [i8; 3],
207    AC4,
208    nppiSet_8s_AC4R_Ctx,
209    |value: &[i8; 3]| value.as_ptr()
210);
211impl_set!(
212    set_u16_c1,
213    u16,
214    u16,
215    C1,
216    nppiSet_16u_C1R_Ctx,
217    |value: &u16| *value
218);
219impl_set!(
220    set_u16_c2,
221    u16,
222    [u16; 2],
223    C2,
224    nppiSet_16u_C2R_Ctx,
225    |value: &[u16; 2]| value.as_ptr()
226);
227impl_set!(
228    set_u16_c3,
229    u16,
230    [u16; 3],
231    C3,
232    nppiSet_16u_C3R_Ctx,
233    |value: &[u16; 3]| value.as_ptr()
234);
235impl_set!(
236    set_u16_c4,
237    u16,
238    [u16; 4],
239    C4,
240    nppiSet_16u_C4R_Ctx,
241    |value: &[u16; 4]| value.as_ptr()
242);
243impl_set!(
244    set_u16_ac4,
245    u16,
246    [u16; 3],
247    AC4,
248    nppiSet_16u_AC4R_Ctx,
249    |value: &[u16; 3]| value.as_ptr()
250);
251impl_set!(
252    set_f16_c1,
253    f16,
254    f32,
255    C1,
256    nppiSet_16f_C1R_Ctx,
257    |value: &f32| *value
258);
259impl_set!(
260    set_f16_c2,
261    f16,
262    [f32; 2],
263    C2,
264    nppiSet_16f_C2R_Ctx,
265    |value: &[f32; 2]| value.as_ptr()
266);
267impl_set!(
268    set_f16_c3,
269    f16,
270    [f32; 3],
271    C3,
272    nppiSet_16f_C3R_Ctx,
273    |value: &[f32; 3]| value.as_ptr()
274);
275impl_set!(
276    set_f16_c4,
277    f16,
278    [f32; 4],
279    C4,
280    nppiSet_16f_C4R_Ctx,
281    |value: &[f32; 4]| value.as_ptr()
282);
283impl_set!(
284    set_i16_c1,
285    i16,
286    i16,
287    C1,
288    nppiSet_16s_C1R_Ctx,
289    |value: &i16| *value
290);
291impl_set!(
292    set_i16_c2,
293    i16,
294    [i16; 2],
295    C2,
296    nppiSet_16s_C2R_Ctx,
297    |value: &[i16; 2]| value.as_ptr()
298);
299impl_set!(
300    set_i16_c3,
301    i16,
302    [i16; 3],
303    C3,
304    nppiSet_16s_C3R_Ctx,
305    |value: &[i16; 3]| value.as_ptr()
306);
307impl_set!(
308    set_i16_c4,
309    i16,
310    [i16; 4],
311    C4,
312    nppiSet_16s_C4R_Ctx,
313    |value: &[i16; 4]| value.as_ptr()
314);
315impl_set!(
316    set_i16_ac4,
317    i16,
318    [i16; 3],
319    AC4,
320    nppiSet_16s_AC4R_Ctx,
321    |value: &[i16; 3]| value.as_ptr()
322);
323impl_set!(
324    set_i32_c1,
325    i32,
326    i32,
327    C1,
328    nppiSet_32s_C1R_Ctx,
329    |value: &i32| *value
330);
331impl_set!(
332    set_i32_c2,
333    i32,
334    [i32; 2],
335    C2,
336    nppiSet_32s_C2R_Ctx,
337    |value: &[i32; 2]| value.as_ptr()
338);
339impl_set!(
340    set_i32_c3,
341    i32,
342    [i32; 3],
343    C3,
344    nppiSet_32s_C3R_Ctx,
345    |value: &[i32; 3]| value.as_ptr()
346);
347impl_set!(
348    set_i32_c4,
349    i32,
350    [i32; 4],
351    C4,
352    nppiSet_32s_C4R_Ctx,
353    |value: &[i32; 4]| value.as_ptr()
354);
355impl_set!(
356    set_i32_ac4,
357    i32,
358    [i32; 3],
359    AC4,
360    nppiSet_32s_AC4R_Ctx,
361    |value: &[i32; 3]| value.as_ptr()
362);
363impl_set!(
364    set_u32_c1,
365    u32,
366    u32,
367    C1,
368    nppiSet_32u_C1R_Ctx,
369    |value: &u32| *value
370);
371impl_set!(
372    set_u32_c2,
373    u32,
374    [u32; 2],
375    C2,
376    nppiSet_32u_C2R_Ctx,
377    |value: &[u32; 2]| value.as_ptr()
378);
379impl_set!(
380    set_u32_c3,
381    u32,
382    [u32; 3],
383    C3,
384    nppiSet_32u_C3R_Ctx,
385    |value: &[u32; 3]| value.as_ptr()
386);
387impl_set!(
388    set_u32_c4,
389    u32,
390    [u32; 4],
391    C4,
392    nppiSet_32u_C4R_Ctx,
393    |value: &[u32; 4]| value.as_ptr()
394);
395impl_set!(
396    set_u32_ac4,
397    u32,
398    [u32; 3],
399    AC4,
400    nppiSet_32u_AC4R_Ctx,
401    |value: &[u32; 3]| value.as_ptr()
402);
403impl_set!(
404    set_i16_complex_c1,
405    ComplexI16,
406    ComplexI16,
407    C1,
408    nppiSet_16sc_C1R_Ctx,
409    |value: &ComplexI16| (*value).into_npp()
410);
411impl_set!(
412    set_i16_complex_c2,
413    ComplexI16,
414    [ComplexI16; 2],
415    C2,
416    nppiSet_16sc_C2R_Ctx,
417    |value: &[ComplexI16; 2]| value.as_ptr().cast()
418);
419impl_set!(
420    set_i16_complex_c3,
421    ComplexI16,
422    [ComplexI16; 3],
423    C3,
424    nppiSet_16sc_C3R_Ctx,
425    |value: &[ComplexI16; 3]| value.as_ptr().cast()
426);
427impl_set!(
428    set_i16_complex_c4,
429    ComplexI16,
430    [ComplexI16; 4],
431    C4,
432    nppiSet_16sc_C4R_Ctx,
433    |value: &[ComplexI16; 4]| value.as_ptr().cast()
434);
435impl_set!(
436    set_i16_complex_ac4,
437    ComplexI16,
438    [ComplexI16; 3],
439    AC4,
440    nppiSet_16sc_AC4R_Ctx,
441    |value: &[ComplexI16; 3]| value.as_ptr().cast()
442);
443impl_set!(
444    set_f32_complex_c1,
445    Complex32,
446    Complex32,
447    C1,
448    nppiSet_32fc_C1R_Ctx,
449    |value: &Complex32| (*value).into_npp()
450);
451impl_set!(
452    set_f32_complex_c2,
453    Complex32,
454    [Complex32; 2],
455    C2,
456    nppiSet_32fc_C2R_Ctx,
457    |value: &[Complex32; 2]| value.as_ptr().cast()
458);
459impl_set!(
460    set_f32_complex_c3,
461    Complex32,
462    [Complex32; 3],
463    C3,
464    nppiSet_32fc_C3R_Ctx,
465    |value: &[Complex32; 3]| value.as_ptr().cast()
466);
467impl_set!(
468    set_f32_complex_c4,
469    Complex32,
470    [Complex32; 4],
471    C4,
472    nppiSet_32fc_C4R_Ctx,
473    |value: &[Complex32; 4]| value.as_ptr().cast()
474);
475impl_set!(
476    set_f32_complex_ac4,
477    Complex32,
478    [Complex32; 3],
479    AC4,
480    nppiSet_32fc_AC4R_Ctx,
481    |value: &[Complex32; 3]| value.as_ptr().cast()
482);
483impl_set!(
484    set_i32_complex_c1,
485    ComplexI32,
486    ComplexI32,
487    C1,
488    nppiSet_32sc_C1R_Ctx,
489    |value: &ComplexI32| (*value).into_npp()
490);
491impl_set!(
492    set_i32_complex_c2,
493    ComplexI32,
494    [ComplexI32; 2],
495    C2,
496    nppiSet_32sc_C2R_Ctx,
497    |value: &[ComplexI32; 2]| value.as_ptr().cast()
498);
499impl_set!(
500    set_i32_complex_c3,
501    ComplexI32,
502    [ComplexI32; 3],
503    C3,
504    nppiSet_32sc_C3R_Ctx,
505    |value: &[ComplexI32; 3]| value.as_ptr().cast()
506);
507impl_set!(
508    set_i32_complex_c4,
509    ComplexI32,
510    [ComplexI32; 4],
511    C4,
512    nppiSet_32sc_C4R_Ctx,
513    |value: &[ComplexI32; 4]| value.as_ptr().cast()
514);
515impl_set!(
516    set_i32_complex_ac4,
517    ComplexI32,
518    [ComplexI32; 3],
519    AC4,
520    nppiSet_32sc_AC4R_Ctx,
521    |value: &[ComplexI32; 3]| value.as_ptr().cast()
522);
523impl_set!(
524    set_f32_c1,
525    f32,
526    f32,
527    C1,
528    nppiSet_32f_C1R_Ctx,
529    |value: &f32| *value
530);
531impl_set!(
532    set_f32_c2,
533    f32,
534    [f32; 2],
535    C2,
536    nppiSet_32f_C2R_Ctx,
537    |value: &[f32; 2]| value.as_ptr()
538);
539impl_set!(
540    set_f32_c3,
541    f32,
542    [f32; 3],
543    C3,
544    nppiSet_32f_C3R_Ctx,
545    |value: &[f32; 3]| value.as_ptr()
546);
547impl_set!(
548    set_f32_c4,
549    f32,
550    [f32; 4],
551    C4,
552    nppiSet_32f_C4R_Ctx,
553    |value: &[f32; 4]| value.as_ptr()
554);
555impl_set!(
556    set_f32_ac4,
557    f32,
558    [f32; 3],
559    AC4,
560    nppiSet_32f_AC4R_Ctx,
561    |value: &[f32; 3]| value.as_ptr()
562);
563
564impl_set_masked!(
565    set_masked_u16_c1,
566    u16,
567    u16,
568    C1,
569    nppiSet_16u_C1MR_Ctx,
570    |value: &u16| *value
571);
572impl_set_masked!(
573    set_masked_u16_c3,
574    u16,
575    [u16; 3],
576    C3,
577    nppiSet_16u_C3MR_Ctx,
578    |value: &[u16; 3]| value.as_ptr()
579);
580impl_set_masked!(
581    set_masked_u16_c4,
582    u16,
583    [u16; 4],
584    C4,
585    nppiSet_16u_C4MR_Ctx,
586    |value: &[u16; 4]| value.as_ptr()
587);
588impl_set_masked!(
589    set_masked_u16_ac4,
590    u16,
591    [u16; 3],
592    AC4,
593    nppiSet_16u_AC4MR_Ctx,
594    |value: &[u16; 3]| value.as_ptr()
595);
596impl_set_masked!(
597    set_masked_i16_c1,
598    i16,
599    i16,
600    C1,
601    nppiSet_16s_C1MR_Ctx,
602    |value: &i16| *value
603);
604impl_set_masked!(
605    set_masked_i16_c3,
606    i16,
607    [i16; 3],
608    C3,
609    nppiSet_16s_C3MR_Ctx,
610    |value: &[i16; 3]| value.as_ptr()
611);
612impl_set_masked!(
613    set_masked_i16_c4,
614    i16,
615    [i16; 4],
616    C4,
617    nppiSet_16s_C4MR_Ctx,
618    |value: &[i16; 4]| value.as_ptr()
619);
620impl_set_masked!(
621    set_masked_i16_ac4,
622    i16,
623    [i16; 3],
624    AC4,
625    nppiSet_16s_AC4MR_Ctx,
626    |value: &[i16; 3]| value.as_ptr()
627);
628impl_set_masked!(
629    set_masked_i32_c1,
630    i32,
631    i32,
632    C1,
633    nppiSet_32s_C1MR_Ctx,
634    |value: &i32| *value
635);
636impl_set_masked!(
637    set_masked_i32_c3,
638    i32,
639    [i32; 3],
640    C3,
641    nppiSet_32s_C3MR_Ctx,
642    |value: &[i32; 3]| value.as_ptr()
643);
644impl_set_masked!(
645    set_masked_i32_c4,
646    i32,
647    [i32; 4],
648    C4,
649    nppiSet_32s_C4MR_Ctx,
650    |value: &[i32; 4]| value.as_ptr()
651);
652impl_set_masked!(
653    set_masked_i32_ac4,
654    i32,
655    [i32; 3],
656    AC4,
657    nppiSet_32s_AC4MR_Ctx,
658    |value: &[i32; 3]| value.as_ptr()
659);
660impl_set_masked!(
661    set_masked_f32_c1,
662    f32,
663    f32,
664    C1,
665    nppiSet_32f_C1MR_Ctx,
666    |value: &f32| *value
667);
668impl_set_masked!(
669    set_masked_f32_c3,
670    f32,
671    [f32; 3],
672    C3,
673    nppiSet_32f_C3MR_Ctx,
674    |value: &[f32; 3]| value.as_ptr()
675);
676impl_set_masked!(
677    set_masked_f32_c4,
678    f32,
679    [f32; 4],
680    C4,
681    nppiSet_32f_C4MR_Ctx,
682    |value: &[f32; 4]| value.as_ptr()
683);
684impl_set_masked!(
685    set_masked_f32_ac4,
686    f32,
687    [f32; 3],
688    AC4,
689    nppiSet_32f_AC4MR_Ctx,
690    |value: &[f32; 3]| value.as_ptr()
691);
692impl_generic_set_operation!(
693    SetC1,
694    set_c1,
695    C1,
696    [
697        u8 => (u8, set_u8_c1),
698        i8 => (i8, set_i8_c1),
699        u16 => (u16, set_u16_c1),
700        f16 => (f32, set_f16_c1),
701        i16 => (i16, set_i16_c1),
702        i32 => (i32, set_i32_c1),
703        u32 => (u32, set_u32_c1),
704        ComplexI16 => (ComplexI16, set_i16_complex_c1),
705        Complex32 => (Complex32, set_f32_complex_c1),
706        ComplexI32 => (ComplexI32, set_i32_complex_c1),
707        f32 => (f32, set_f32_c1),
708    ]
709);
710impl_generic_set_operation!(
711    SetC2,
712    set_c2,
713    C2,
714    [
715        u8 => ([u8; 2], set_u8_c2),
716        i8 => ([i8; 2], set_i8_c2),
717        u16 => ([u16; 2], set_u16_c2),
718        f16 => ([f32; 2], set_f16_c2),
719        i16 => ([i16; 2], set_i16_c2),
720        i32 => ([i32; 2], set_i32_c2),
721        u32 => ([u32; 2], set_u32_c2),
722        ComplexI16 => ([ComplexI16; 2], set_i16_complex_c2),
723        Complex32 => ([Complex32; 2], set_f32_complex_c2),
724        ComplexI32 => ([ComplexI32; 2], set_i32_complex_c2),
725        f32 => ([f32; 2], set_f32_c2),
726    ]
727);
728impl_generic_set_operation!(
729    SetC3,
730    set_c3,
731    C3,
732    [
733        u8 => ([u8; 3], set_u8_c3),
734        i8 => ([i8; 3], set_i8_c3),
735        u16 => ([u16; 3], set_u16_c3),
736        f16 => ([f32; 3], set_f16_c3),
737        i16 => ([i16; 3], set_i16_c3),
738        i32 => ([i32; 3], set_i32_c3),
739        u32 => ([u32; 3], set_u32_c3),
740        ComplexI16 => ([ComplexI16; 3], set_i16_complex_c3),
741        Complex32 => ([Complex32; 3], set_f32_complex_c3),
742        ComplexI32 => ([ComplexI32; 3], set_i32_complex_c3),
743        f32 => ([f32; 3], set_f32_c3),
744    ]
745);
746impl_generic_set_operation!(
747    SetC4,
748    set_c4,
749    C4,
750    [
751        u8 => ([u8; 4], set_u8_c4),
752        i8 => ([i8; 4], set_i8_c4),
753        u16 => ([u16; 4], set_u16_c4),
754        f16 => ([f32; 4], set_f16_c4),
755        i16 => ([i16; 4], set_i16_c4),
756        i32 => ([i32; 4], set_i32_c4),
757        u32 => ([u32; 4], set_u32_c4),
758        ComplexI16 => ([ComplexI16; 4], set_i16_complex_c4),
759        Complex32 => ([Complex32; 4], set_f32_complex_c4),
760        ComplexI32 => ([ComplexI32; 4], set_i32_complex_c4),
761        f32 => ([f32; 4], set_f32_c4),
762    ]
763);
764impl_generic_set_operation!(
765    SetAC4,
766    set_ac4,
767    AC4,
768    [
769        u8 => ([u8; 3], set_u8_ac4),
770        i8 => ([i8; 3], set_i8_ac4),
771        u16 => ([u16; 3], set_u16_ac4),
772        i16 => ([i16; 3], set_i16_ac4),
773        i32 => ([i32; 3], set_i32_ac4),
774        u32 => ([u32; 3], set_u32_ac4),
775        ComplexI16 => ([ComplexI16; 3], set_i16_complex_ac4),
776        Complex32 => ([Complex32; 3], set_f32_complex_ac4),
777        ComplexI32 => ([ComplexI32; 3], set_i32_complex_ac4),
778        f32 => ([f32; 3], set_f32_ac4),
779    ]
780);
781impl_generic_set_masked_operation!(
782    SetMaskedC1,
783    set_masked_c1,
784    C1,
785    [
786        u8 => (u8, set_masked_u8_c1),
787        u16 => (u16, set_masked_u16_c1),
788        i16 => (i16, set_masked_i16_c1),
789        i32 => (i32, set_masked_i32_c1),
790        f32 => (f32, set_masked_f32_c1),
791    ]
792);
793impl_generic_set_masked_operation!(
794    SetMaskedC3,
795    set_masked_c3,
796    C3,
797    [
798        u8 => ([u8; 3], set_masked_u8_c3),
799        u16 => ([u16; 3], set_masked_u16_c3),
800        i16 => ([i16; 3], set_masked_i16_c3),
801        i32 => ([i32; 3], set_masked_i32_c3),
802        f32 => ([f32; 3], set_masked_f32_c3),
803    ]
804);
805impl_generic_set_masked_operation!(
806    SetMaskedC4,
807    set_masked_c4,
808    C4,
809    [
810        u8 => ([u8; 4], set_masked_u8_c4),
811        u16 => ([u16; 4], set_masked_u16_c4),
812        i16 => ([i16; 4], set_masked_i16_c4),
813        i32 => ([i32; 4], set_masked_i32_c4),
814        f32 => ([f32; 4], set_masked_f32_c4),
815    ]
816);
817impl_generic_set_masked_operation!(
818    SetMaskedAC4,
819    set_masked_ac4,
820    AC4,
821    [
822        u8 => ([u8; 3], set_masked_u8_ac4),
823        u16 => ([u16; 3], set_masked_u16_ac4),
824        i16 => ([i16; 3], set_masked_i16_ac4),
825        i32 => ([i32; 3], set_masked_i32_ac4),
826        f32 => ([f32; 3], set_masked_f32_ac4),
827    ]
828);