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