Skip to main content

singe_npp/image/
exchange_swap_channels.rs

1use super::*;
2
3pub(crate) fn swap_channels_u8_c3(
4    stream_context: &StreamContext,
5    source: &ImageView<'_, u8, C3>,
6    destination: &mut ImageViewMut<'_, u8, C3>,
7    order: [i32; 3],
8) -> Result<()> {
9    validate_same_size(source.size(), destination.size())?;
10    validate_channel_order(&order, 3)?;
11
12    unsafe {
13        try_ffi!(sys::nppiSwapChannels_8u_C3R_Ctx(
14            source.as_ptr().cast(),
15            source.step(),
16            destination.as_mut_ptr().cast(),
17            destination.step(),
18            source.size().into(),
19            order.as_ptr().cast(),
20            stream_context.as_raw(),
21        ))?;
22    }
23    Ok(())
24}
25
26pub(crate) fn swap_channels_u8_c3_in_place(
27    stream_context: &StreamContext,
28    image: &mut ImageViewMut<'_, u8, C3>,
29    order: [i32; 3],
30) -> Result<()> {
31    validate_channel_order(&order, 3)?;
32
33    unsafe {
34        try_ffi!(sys::nppiSwapChannels_8u_C3IR_Ctx(
35            image.as_mut_ptr().cast(),
36            image.step(),
37            image.size().into(),
38            order.as_ptr().cast(),
39            stream_context.as_raw(),
40        ))?;
41    }
42    Ok(())
43}
44
45pub(crate) fn swap_channels_u8_c4(
46    stream_context: &StreamContext,
47    source: &ImageView<'_, u8, C4>,
48    destination: &mut ImageViewMut<'_, u8, C4>,
49    order: [i32; 4],
50) -> Result<()> {
51    validate_same_size(source.size(), destination.size())?;
52    validate_channel_order(&order, 4)?;
53
54    unsafe {
55        try_ffi!(sys::nppiSwapChannels_8u_C4R_Ctx(
56            source.as_ptr().cast(),
57            source.step(),
58            destination.as_mut_ptr().cast(),
59            destination.step(),
60            source.size().into(),
61            order.as_ptr().cast(),
62            stream_context.as_raw(),
63        ))?;
64    }
65    Ok(())
66}
67
68pub(crate) fn swap_channels_u8_c4_in_place(
69    stream_context: &StreamContext,
70    image: &mut ImageViewMut<'_, u8, C4>,
71    order: [i32; 4],
72) -> Result<()> {
73    validate_channel_order(&order, 4)?;
74
75    unsafe {
76        try_ffi!(sys::nppiSwapChannels_8u_C4IR_Ctx(
77            image.as_mut_ptr().cast(),
78            image.step(),
79            image.size().into(),
80            order.as_ptr().cast(),
81            stream_context.as_raw(),
82        ))?;
83    }
84    Ok(())
85}
86
87impl_swap_channels_c4_to_c3!(swap_channels_u8_c4_to_c3, u8, nppiSwapChannels_8u_C4C3R_Ctx);
88impl_swap_channels_c3_to_c4!(swap_channels_u8_c3_to_c4, u8, nppiSwapChannels_8u_C3C4R_Ctx);
89impl_swap_channels_ac4!(swap_channels_u8_ac4, u8, nppiSwapChannels_8u_AC4R_Ctx);
90impl_swap_channels!(
91    swap_channels_u16_c3,
92    u16,
93    C3,
94    3,
95    nppiSwapChannels_16u_C3R_Ctx
96);
97impl_swap_channels_in_place!(
98    swap_channels_u16_c3_in_place,
99    u16,
100    C3,
101    3,
102    nppiSwapChannels_16u_C3IR_Ctx
103);
104impl_swap_channels!(
105    swap_channels_u16_c4,
106    u16,
107    C4,
108    4,
109    nppiSwapChannels_16u_C4R_Ctx
110);
111impl_swap_channels_in_place!(
112    swap_channels_u16_c4_in_place,
113    u16,
114    C4,
115    4,
116    nppiSwapChannels_16u_C4IR_Ctx
117);
118impl_swap_channels!(
119    swap_channels_i16_c3,
120    i16,
121    C3,
122    3,
123    nppiSwapChannels_16s_C3R_Ctx
124);
125impl_swap_channels_in_place!(
126    swap_channels_i16_c3_in_place,
127    i16,
128    C3,
129    3,
130    nppiSwapChannels_16s_C3IR_Ctx
131);
132impl_swap_channels!(
133    swap_channels_i16_c4,
134    i16,
135    C4,
136    4,
137    nppiSwapChannels_16s_C4R_Ctx
138);
139impl_swap_channels_in_place!(
140    swap_channels_i16_c4_in_place,
141    i16,
142    C4,
143    4,
144    nppiSwapChannels_16s_C4IR_Ctx
145);
146impl_swap_channels!(
147    swap_channels_i32_c3,
148    i32,
149    C3,
150    3,
151    nppiSwapChannels_32s_C3R_Ctx
152);
153impl_swap_channels_in_place!(
154    swap_channels_i32_c3_in_place,
155    i32,
156    C3,
157    3,
158    nppiSwapChannels_32s_C3IR_Ctx
159);
160impl_swap_channels!(
161    swap_channels_i32_c4,
162    i32,
163    C4,
164    4,
165    nppiSwapChannels_32s_C4R_Ctx
166);
167impl_swap_channels_in_place!(
168    swap_channels_i32_c4_in_place,
169    i32,
170    C4,
171    4,
172    nppiSwapChannels_32s_C4IR_Ctx
173);
174impl_swap_channels!(
175    swap_channels_f32_c3,
176    f32,
177    C3,
178    3,
179    nppiSwapChannels_32f_C3R_Ctx
180);
181impl_swap_channels_in_place!(
182    swap_channels_f32_c3_in_place,
183    f32,
184    C3,
185    3,
186    nppiSwapChannels_32f_C3IR_Ctx
187);
188impl_swap_channels!(
189    swap_channels_f32_c4,
190    f32,
191    C4,
192    4,
193    nppiSwapChannels_32f_C4R_Ctx
194);
195impl_swap_channels_in_place!(
196    swap_channels_f32_c4_in_place,
197    f32,
198    C4,
199    4,
200    nppiSwapChannels_32f_C4IR_Ctx
201);
202impl_swap_channels_c4_to_c3!(
203    swap_channels_u16_c4_to_c3,
204    u16,
205    nppiSwapChannels_16u_C4C3R_Ctx
206);
207impl_swap_channels_c3_to_c4!(
208    swap_channels_u16_c3_to_c4,
209    u16,
210    nppiSwapChannels_16u_C3C4R_Ctx
211);
212impl_swap_channels_ac4!(swap_channels_u16_ac4, u16, nppiSwapChannels_16u_AC4R_Ctx);
213impl_swap_channels_c4_to_c3!(
214    swap_channels_i16_c4_to_c3,
215    i16,
216    nppiSwapChannels_16s_C4C3R_Ctx
217);
218impl_swap_channels_c3_to_c4!(
219    swap_channels_i16_c3_to_c4,
220    i16,
221    nppiSwapChannels_16s_C3C4R_Ctx
222);
223impl_swap_channels_ac4!(swap_channels_i16_ac4, i16, nppiSwapChannels_16s_AC4R_Ctx);
224impl_swap_channels_c4_to_c3!(
225    swap_channels_i32_c4_to_c3,
226    i32,
227    nppiSwapChannels_32s_C4C3R_Ctx
228);
229impl_swap_channels_c3_to_c4!(
230    swap_channels_i32_c3_to_c4,
231    i32,
232    nppiSwapChannels_32s_C3C4R_Ctx
233);
234impl_swap_channels_ac4!(swap_channels_i32_ac4, i32, nppiSwapChannels_32s_AC4R_Ctx);
235impl_swap_channels_c4_to_c3!(
236    swap_channels_f32_c4_to_c3,
237    f32,
238    nppiSwapChannels_32f_C4C3R_Ctx
239);
240impl_swap_channels_c3_to_c4!(
241    swap_channels_f32_c3_to_c4,
242    f32,
243    nppiSwapChannels_32f_C3C4R_Ctx
244);
245impl_swap_channels_ac4!(swap_channels_f32_ac4, f32, nppiSwapChannels_32f_AC4R_Ctx);
246impl_generic_swap_channels_operation!(
247    SwapChannelsC3,
248    swap_channels_c3,
249    C3,
250    3,
251    [
252        u8 => swap_channels_u8_c3,
253        u16 => swap_channels_u16_c3,
254        i16 => swap_channels_i16_c3,
255        i32 => swap_channels_i32_c3,
256        f32 => swap_channels_f32_c3,
257    ]
258);
259impl_generic_swap_channels_in_place_operation!(
260    SwapChannelsC3InPlace,
261    swap_channels_c3_in_place,
262    C3,
263    3,
264    [
265        u8 => swap_channels_u8_c3_in_place,
266        u16 => swap_channels_u16_c3_in_place,
267        i16 => swap_channels_i16_c3_in_place,
268        i32 => swap_channels_i32_c3_in_place,
269        f32 => swap_channels_f32_c3_in_place,
270    ]
271);
272impl_generic_swap_channels_operation!(
273    SwapChannelsC4,
274    swap_channels_c4,
275    C4,
276    4,
277    [
278        u8 => swap_channels_u8_c4,
279        u16 => swap_channels_u16_c4,
280        i16 => swap_channels_i16_c4,
281        i32 => swap_channels_i32_c4,
282        f32 => swap_channels_f32_c4,
283    ]
284);
285impl_generic_swap_channels_in_place_operation!(
286    SwapChannelsC4InPlace,
287    swap_channels_c4_in_place,
288    C4,
289    4,
290    [
291        u8 => swap_channels_u8_c4_in_place,
292        u16 => swap_channels_u16_c4_in_place,
293        i16 => swap_channels_i16_c4_in_place,
294        i32 => swap_channels_i32_c4_in_place,
295        f32 => swap_channels_f32_c4_in_place,
296    ]
297);
298impl_generic_swap_channels_c4_to_c3_operation!(
299    SwapChannelsC4ToC3,
300    swap_channels_c4_to_c3,
301    [
302        u8 => swap_channels_u8_c4_to_c3,
303        u16 => swap_channels_u16_c4_to_c3,
304        i16 => swap_channels_i16_c4_to_c3,
305        i32 => swap_channels_i32_c4_to_c3,
306        f32 => swap_channels_f32_c4_to_c3,
307    ]
308);
309impl_generic_swap_channels_c3_to_c4_operation!(
310    SwapChannelsC3ToC4,
311    swap_channels_c3_to_c4,
312    [
313        u8 => swap_channels_u8_c3_to_c4,
314        u16 => swap_channels_u16_c3_to_c4,
315        i16 => swap_channels_i16_c3_to_c4,
316        i32 => swap_channels_i32_c3_to_c4,
317        f32 => swap_channels_f32_c3_to_c4,
318    ]
319);
320impl_generic_swap_channels_operation!(
321    SwapChannelsAC4,
322    swap_channels_ac4,
323    AC4,
324    3,
325    [
326        u8 => swap_channels_u8_ac4,
327        u16 => swap_channels_u16_ac4,
328        i16 => swap_channels_i16_ac4,
329        i32 => swap_channels_i32_ac4,
330        f32 => swap_channels_f32_ac4,
331    ]
332);