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