Skip to main content

singe_npp/image/
color_lookup_palette.rs

1use super::*;
2
3macro_rules! impl_lookup_table_palette_c1 {
4    ($name:ident, $ty:ty, $max_bits:literal, $ffi:ident) => {
5        pub(crate) fn $name(
6            stream_context: &StreamContext,
7            source: &ImageView<'_, $ty, C1>,
8            destination: &mut ImageViewMut<'_, $ty, C1>,
9            table: &DeviceMemory<$ty>,
10            bit_size: i32,
11        ) -> Result<()> {
12            validate_same_size(source.size(), destination.size())?;
13            let bit_size = validate_lookup_table_palette(table.len(), bit_size, $max_bits)?;
14
15            unsafe {
16                try_ffi!(sys::$ffi(
17                    source.as_ptr().cast(),
18                    source.step(),
19                    destination.as_mut_ptr().cast(),
20                    destination.step(),
21                    source.size().into(),
22                    table.as_ptr().cast(),
23                    bit_size,
24                    stream_context.as_raw(),
25                ))?;
26            }
27            Ok(())
28        }
29    };
30}
31
32macro_rules! impl_lookup_table_palette_packed {
33    ($name:ident, $ty:ty, $layout:ty, $channels:literal, $max_bits:literal, $ffi:ident) => {
34        pub(crate) fn $name(
35            stream_context: &StreamContext,
36            source: &ImageView<'_, $ty, $layout>,
37            destination: &mut ImageViewMut<'_, $ty, $layout>,
38            tables: &[&DeviceMemory<$ty>; $channels],
39            bit_size: i32,
40        ) -> Result<()> {
41            validate_same_size(source.size(), destination.size())?;
42            let bit_size = validate_lookup_table_palette_channels(tables, bit_size, $max_bits)?;
43            let mut table_pointers = tables.map(DeviceMemory::as_ptr);
44
45            unsafe {
46                try_ffi!(sys::$ffi(
47                    source.as_ptr().cast(),
48                    source.step(),
49                    destination.as_mut_ptr().cast(),
50                    destination.step(),
51                    source.size().into(),
52                    table_pointers.as_mut_ptr().cast(),
53                    bit_size,
54                    stream_context.as_raw(),
55                ))?;
56            }
57            Ok(())
58        }
59    };
60}
61
62macro_rules! impl_lookup_table_palette_swap {
63    ($name:ident, $ty:ty, $max_bits:literal, $ffi:ident) => {
64        pub(crate) fn $name(
65            stream_context: &StreamContext,
66            source: &ImageView<'_, $ty, C3>,
67            destination: &mut ImageViewMut<'_, $ty, C4>,
68            alpha: i32,
69            tables: &[&DeviceMemory<$ty>; 3],
70            bit_size: i32,
71        ) -> Result<()> {
72            validate_same_size(source.size(), destination.size())?;
73            let bit_size = validate_lookup_table_palette_channels(tables, bit_size, $max_bits)?;
74            let mut table_pointers = tables.map(DeviceMemory::as_ptr);
75
76            unsafe {
77                try_ffi!(sys::$ffi(
78                    source.as_ptr().cast(),
79                    source.step(),
80                    alpha,
81                    destination.as_mut_ptr().cast(),
82                    destination.step(),
83                    source.size().into(),
84                    table_pointers.as_mut_ptr().cast(),
85                    bit_size,
86                    stream_context.as_raw(),
87                ))?;
88            }
89            Ok(())
90        }
91    };
92}
93
94macro_rules! impl_lookup_table_palette_c1_to {
95    (
96        $name:ident,
97        $source_ty:ty,
98        $destination_ty:ty,
99        $destination_layout:ty,
100        $table_ty:ty,
101        $max_bits:literal,
102        $values_per_index:literal,
103        $ffi:ident
104    ) => {
105        pub fn $name(
106            stream_context: &StreamContext,
107            source: &ImageView<'_, $source_ty, C1>,
108            destination: &mut ImageViewMut<'_, $destination_ty, $destination_layout>,
109            table: &DeviceMemory<$table_ty>,
110            bit_size: i32,
111        ) -> Result<()> {
112            validate_same_size(source.size(), destination.size())?;
113            let bit_size = validate_lookup_table_palette_entries(
114                table.len(),
115                bit_size,
116                $max_bits,
117                $values_per_index,
118            )?;
119
120            unsafe {
121                try_ffi!(sys::$ffi(
122                    source.as_ptr().cast(),
123                    source.step(),
124                    destination.as_mut_ptr().cast(),
125                    destination.step(),
126                    source.size().into(),
127                    table.as_ptr().cast(),
128                    bit_size,
129                    stream_context.as_raw(),
130                ))?;
131            }
132            Ok(())
133        }
134    };
135}
136
137macro_rules! impl_generic_lookup_table_palette_c1 {
138    ($trait:ident, $method:ident, $function:ident, [$($ty:ty => $direct:ident),* $(,)?]) => {
139        pub trait $trait: DataTypeLike + Sized {
140            fn $method(
141                stream_context: &StreamContext,
142                source: &ImageView<'_, Self, C1>,
143                destination: &mut ImageViewMut<'_, Self, C1>,
144                table: &DeviceMemory<Self>,
145                bit_size: i32,
146            ) -> Result<()>;
147        }
148
149        pub fn $function<T>(
150            stream_context: &StreamContext,
151            source: &ImageView<'_, T, C1>,
152            destination: &mut ImageViewMut<'_, T, C1>,
153            table: &DeviceMemory<T>,
154            bit_size: i32,
155        ) -> Result<()>
156        where
157            T: $trait,
158        {
159            T::$method(stream_context, source, destination, table, bit_size)
160        }
161
162        $(
163            impl $trait for $ty {
164                fn $method(
165                    stream_context: &StreamContext,
166                    source: &ImageView<'_, Self, C1>,
167                    destination: &mut ImageViewMut<'_, Self, C1>,
168                    table: &DeviceMemory<Self>,
169                    bit_size: i32,
170                ) -> Result<()> {
171                    $direct(stream_context, source, destination, table, bit_size)
172                }
173            }
174        )*
175    };
176}
177
178macro_rules! impl_generic_lookup_table_palette_packed {
179    ($trait:ident, $method:ident, $function:ident, $layout:ty, $channels:literal, [$($ty:ty => $direct:ident),* $(,)?]) => {
180        pub trait $trait<Layout>: DataTypeLike + Sized {
181            fn $method(
182                stream_context: &StreamContext,
183                source: &ImageView<'_, Self, Layout>,
184                destination: &mut ImageViewMut<'_, Self, Layout>,
185                tables: &[&DeviceMemory<Self>; $channels],
186                bit_size: i32,
187            ) -> Result<()>;
188        }
189
190        pub fn $function<T>(
191            stream_context: &StreamContext,
192            source: &ImageView<'_, T, $layout>,
193            destination: &mut ImageViewMut<'_, T, $layout>,
194            tables: &[&DeviceMemory<T>; $channels],
195            bit_size: i32,
196        ) -> Result<()>
197        where
198            T: $trait<$layout>,
199        {
200            T::$method(stream_context, source, destination, tables, bit_size)
201        }
202
203        $(
204            impl $trait<$layout> for $ty {
205                fn $method(
206                    stream_context: &StreamContext,
207                    source: &ImageView<'_, Self, $layout>,
208                    destination: &mut ImageViewMut<'_, Self, $layout>,
209                    tables: &[&DeviceMemory<Self>; $channels],
210                    bit_size: i32,
211                ) -> Result<()> {
212                    $direct(stream_context, source, destination, tables, bit_size)
213                }
214            }
215        )*
216    };
217}
218
219macro_rules! impl_generic_lookup_table_palette_swap {
220    ($trait:ident, $method:ident, $function:ident, [$($ty:ty => $direct:ident),* $(,)?]) => {
221        pub trait $trait: DataTypeLike + Sized {
222            fn $method(
223                stream_context: &StreamContext,
224                source: &ImageView<'_, Self, C3>,
225                destination: &mut ImageViewMut<'_, Self, C4>,
226                alpha: i32,
227                tables: &[&DeviceMemory<Self>; 3],
228                bit_size: i32,
229            ) -> Result<()>;
230        }
231
232        pub fn $function<T>(
233            stream_context: &StreamContext,
234            source: &ImageView<'_, T, C3>,
235            destination: &mut ImageViewMut<'_, T, C4>,
236            alpha: i32,
237            tables: &[&DeviceMemory<T>; 3],
238            bit_size: i32,
239        ) -> Result<()>
240        where
241            T: $trait,
242        {
243            T::$method(stream_context, source, destination, alpha, tables, bit_size)
244        }
245
246        $(
247            impl $trait for $ty {
248                fn $method(
249                    stream_context: &StreamContext,
250                    source: &ImageView<'_, Self, C3>,
251                    destination: &mut ImageViewMut<'_, Self, C4>,
252                    alpha: i32,
253                    tables: &[&DeviceMemory<Self>; 3],
254                    bit_size: i32,
255                ) -> Result<()> {
256                    $direct(stream_context, source, destination, alpha, tables, bit_size)
257                }
258            }
259        )*
260    };
261}
262
263impl_lookup_table_palette_c1!(lookup_table_palette_u8_c1, u8, 8, nppiLUTPalette_8u_C1R_Ctx);
264impl_lookup_table_palette_c1_to!(
265    lookup_table_palette_u8_to_u8_c3,
266    u8,
267    u8,
268    C3,
269    u8,
270    8,
271    3,
272    nppiLUTPalette_8u24u_C1R_Ctx
273);
274impl_lookup_table_palette_c1_to!(
275    lookup_table_palette_u8_to_u32_c1,
276    u8,
277    u32,
278    C1,
279    u32,
280    8,
281    1,
282    nppiLUTPalette_8u32u_C1R_Ctx
283);
284impl_lookup_table_palette_packed!(
285    lookup_table_palette_u8_c3,
286    u8,
287    C3,
288    3,
289    8,
290    nppiLUTPalette_8u_C3R_Ctx
291);
292impl_lookup_table_palette_packed!(
293    lookup_table_palette_u8_c4,
294    u8,
295    C4,
296    4,
297    8,
298    nppiLUTPalette_8u_C4R_Ctx
299);
300impl_lookup_table_palette_packed!(
301    lookup_table_palette_u8_ac4,
302    u8,
303    AC4,
304    3,
305    8,
306    nppiLUTPalette_8u_AC4R_Ctx
307);
308impl_lookup_table_palette_swap!(
309    lookup_table_palette_swap_u8_c3_to_c4,
310    u8,
311    8,
312    nppiLUTPaletteSwap_8u_C3A0C4R_Ctx
313);
314impl_lookup_table_palette_c1!(
315    lookup_table_palette_u16_c1,
316    u16,
317    16,
318    nppiLUTPalette_16u_C1R_Ctx
319);
320impl_lookup_table_palette_c1_to!(
321    lookup_table_palette_u16_to_u8_c1,
322    u16,
323    u8,
324    C1,
325    u8,
326    16,
327    1,
328    nppiLUTPalette_16u8u_C1R_Ctx
329);
330impl_lookup_table_palette_c1_to!(
331    lookup_table_palette_u16_to_u8_c3,
332    u16,
333    u8,
334    C3,
335    u8,
336    16,
337    3,
338    nppiLUTPalette_16u24u_C1R_Ctx
339);
340impl_lookup_table_palette_c1_to!(
341    lookup_table_palette_u16_to_u32_c1,
342    u16,
343    u32,
344    C1,
345    u32,
346    16,
347    1,
348    nppiLUTPalette_16u32u_C1R_Ctx
349);
350impl_lookup_table_palette_packed!(
351    lookup_table_palette_u16_c3,
352    u16,
353    C3,
354    3,
355    16,
356    nppiLUTPalette_16u_C3R_Ctx
357);
358impl_lookup_table_palette_packed!(
359    lookup_table_palette_u16_c4,
360    u16,
361    C4,
362    4,
363    16,
364    nppiLUTPalette_16u_C4R_Ctx
365);
366impl_lookup_table_palette_packed!(
367    lookup_table_palette_u16_ac4,
368    u16,
369    AC4,
370    3,
371    16,
372    nppiLUTPalette_16u_AC4R_Ctx
373);
374impl_lookup_table_palette_swap!(
375    lookup_table_palette_swap_u16_c3_to_c4,
376    u16,
377    16,
378    nppiLUTPaletteSwap_16u_C3A0C4R_Ctx
379);
380impl_generic_lookup_table_palette_c1!(
381    LookupTablePaletteC1,
382    lookup_table_palette,
383    lookup_table_palette_c1,
384    [
385        u8 => lookup_table_palette_u8_c1,
386        u16 => lookup_table_palette_u16_c1,
387    ]
388);
389impl_generic_lookup_table_palette_packed!(
390    LookupTablePaletteC3,
391    lookup_table_palette,
392    lookup_table_palette_c3,
393    C3,
394    3,
395    [
396        u8 => lookup_table_palette_u8_c3,
397        u16 => lookup_table_palette_u16_c3,
398    ]
399);
400impl_generic_lookup_table_palette_packed!(
401    LookupTablePaletteC4,
402    lookup_table_palette,
403    lookup_table_palette_c4,
404    C4,
405    4,
406    [
407        u8 => lookup_table_palette_u8_c4,
408        u16 => lookup_table_palette_u16_c4,
409    ]
410);
411impl_generic_lookup_table_palette_packed!(
412    LookupTablePaletteAC4,
413    lookup_table_palette,
414    lookup_table_palette_ac4,
415    AC4,
416    3,
417    [
418        u8 => lookup_table_palette_u8_ac4,
419        u16 => lookup_table_palette_u16_ac4,
420    ]
421);
422impl_generic_lookup_table_palette_swap!(
423    LookupTablePaletteSwapC3ToC4,
424    lookup_table_palette_swap,
425    lookup_table_palette_swap_c3_to_c4,
426    [
427        u8 => lookup_table_palette_swap_u8_c3_to_c4,
428        u16 => lookup_table_palette_swap_u16_c3_to_c4,
429    ]
430);