Skip to main content

singe_npp/image/
exchange_copy.rs

1use super::*;
2
3pub(crate) fn copy_u8_c1(
4    stream_context: &StreamContext,
5    source: &ImageView<'_, u8, C1>,
6    destination: &mut ImageViewMut<'_, u8, C1>,
7) -> Result<()> {
8    validate_same_size(source.size(), destination.size())?;
9
10    unsafe {
11        try_ffi!(sys::nppiCopy_8u_C1R_Ctx(
12            source.as_ptr().cast(),
13            source.step(),
14            destination.as_mut_ptr().cast(),
15            destination.step(),
16            source.size().into(),
17            stream_context.as_raw(),
18        ))?;
19    }
20    Ok(())
21}
22
23pub(crate) fn copy_u8_c3(
24    stream_context: &StreamContext,
25    source: &ImageView<'_, u8, C3>,
26    destination: &mut ImageViewMut<'_, u8, C3>,
27) -> Result<()> {
28    validate_same_size(source.size(), destination.size())?;
29
30    unsafe {
31        try_ffi!(sys::nppiCopy_8u_C3R_Ctx(
32            source.as_ptr().cast(),
33            source.step(),
34            destination.as_mut_ptr().cast(),
35            destination.step(),
36            source.size().into(),
37            stream_context.as_raw(),
38        ))?;
39    }
40    Ok(())
41}
42
43pub(crate) fn copy_u8_c4(
44    stream_context: &StreamContext,
45    source: &ImageView<'_, u8, C4>,
46    destination: &mut ImageViewMut<'_, u8, C4>,
47) -> Result<()> {
48    validate_same_size(source.size(), destination.size())?;
49
50    unsafe {
51        try_ffi!(sys::nppiCopy_8u_C4R_Ctx(
52            source.as_ptr().cast(),
53            source.step(),
54            destination.as_mut_ptr().cast(),
55            destination.step(),
56            source.size().into(),
57            stream_context.as_raw(),
58        ))?;
59    }
60    Ok(())
61}
62
63pub(crate) fn copy_u8_ac4(
64    stream_context: &StreamContext,
65    source: &ImageView<'_, u8, AC4>,
66    destination: &mut ImageViewMut<'_, u8, AC4>,
67) -> Result<()> {
68    validate_same_size(source.size(), destination.size())?;
69
70    unsafe {
71        try_ffi!(sys::nppiCopy_8u_AC4R_Ctx(
72            source.as_ptr().cast(),
73            source.step(),
74            destination.as_mut_ptr().cast(),
75            destination.step(),
76            source.size().into(),
77            stream_context.as_raw(),
78        ))?;
79    }
80    Ok(())
81}
82
83impl_copy!(copy_i8_c1, i8, C1, nppiCopy_8s_C1R_Ctx);
84impl_copy!(copy_i8_c2, i8, C2, nppiCopy_8s_C2R_Ctx);
85impl_copy!(copy_i8_c3, i8, C3, nppiCopy_8s_C3R_Ctx);
86impl_copy!(copy_i8_c4, i8, C4, nppiCopy_8s_C4R_Ctx);
87impl_copy!(copy_i8_ac4, i8, AC4, nppiCopy_8s_AC4R_Ctx);
88impl_copy!(copy_u16_c1, u16, C1, nppiCopy_16u_C1R_Ctx);
89impl_copy!(copy_u16_c3, u16, C3, nppiCopy_16u_C3R_Ctx);
90impl_copy!(copy_u16_c4, u16, C4, nppiCopy_16u_C4R_Ctx);
91impl_copy!(copy_u16_ac4, u16, AC4, nppiCopy_16u_AC4R_Ctx);
92impl_copy!(copy_i16_c1, i16, C1, nppiCopy_16s_C1R_Ctx);
93impl_copy!(copy_i16_c3, i16, C3, nppiCopy_16s_C3R_Ctx);
94impl_copy!(copy_i16_c4, i16, C4, nppiCopy_16s_C4R_Ctx);
95impl_copy!(copy_i16_ac4, i16, AC4, nppiCopy_16s_AC4R_Ctx);
96impl_copy!(copy_u32_c1, u32, C1, nppiCopy_32s_C1R_Ctx);
97impl_copy!(copy_u32_ac4, u32, AC4, nppiCopy_32s_AC4R_Ctx);
98impl_copy!(copy_i32_c1, i32, C1, nppiCopy_32s_C1R_Ctx);
99impl_copy!(copy_i32_c3, i32, C3, nppiCopy_32s_C3R_Ctx);
100impl_copy!(copy_i32_c4, i32, C4, nppiCopy_32s_C4R_Ctx);
101impl_copy!(copy_i32_ac4, i32, AC4, nppiCopy_32s_AC4R_Ctx);
102impl_copy!(copy_f16_c1, f16, C1, nppiCopy_16f_C1R_Ctx);
103impl_copy!(copy_f16_c3, f16, C3, nppiCopy_16f_C3R_Ctx);
104impl_copy!(copy_f16_c4, f16, C4, nppiCopy_16f_C4R_Ctx);
105impl_copy!(copy_f32_c1, f32, C1, nppiCopy_32f_C1R_Ctx);
106impl_copy!(copy_f32_c3, f32, C3, nppiCopy_32f_C3R_Ctx);
107impl_copy!(copy_f32_c4, f32, C4, nppiCopy_32f_C4R_Ctx);
108impl_copy!(copy_f32_ac4, f32, AC4, nppiCopy_32f_AC4R_Ctx);
109impl_copy!(copy_i16_complex_c1, ComplexI16, C1, nppiCopy_16sc_C1R_Ctx);
110impl_copy!(copy_i16_complex_c2, ComplexI16, C2, nppiCopy_16sc_C2R_Ctx);
111impl_copy!(copy_i16_complex_c3, ComplexI16, C3, nppiCopy_16sc_C3R_Ctx);
112impl_copy!(copy_i16_complex_c4, ComplexI16, C4, nppiCopy_16sc_C4R_Ctx);
113impl_copy!(
114    copy_i16_complex_ac4,
115    ComplexI16,
116    AC4,
117    nppiCopy_16sc_AC4R_Ctx
118);
119impl_copy!(copy_f32_complex_c1, Complex32, C1, nppiCopy_32fc_C1R_Ctx);
120impl_copy!(copy_f32_complex_c2, Complex32, C2, nppiCopy_32fc_C2R_Ctx);
121impl_copy!(copy_f32_complex_c3, Complex32, C3, nppiCopy_32fc_C3R_Ctx);
122impl_copy!(copy_f32_complex_c4, Complex32, C4, nppiCopy_32fc_C4R_Ctx);
123impl_copy!(copy_f32_complex_ac4, Complex32, AC4, nppiCopy_32fc_AC4R_Ctx);
124impl_copy!(copy_i32_complex_c1, ComplexI32, C1, nppiCopy_32sc_C1R_Ctx);
125impl_copy!(copy_i32_complex_c2, ComplexI32, C2, nppiCopy_32sc_C2R_Ctx);
126impl_copy!(copy_i32_complex_c3, ComplexI32, C3, nppiCopy_32sc_C3R_Ctx);
127impl_copy!(copy_i32_complex_c4, ComplexI32, C4, nppiCopy_32sc_C4R_Ctx);
128impl_copy!(
129    copy_i32_complex_ac4,
130    ComplexI32,
131    AC4,
132    nppiCopy_32sc_AC4R_Ctx
133);
134
135impl_generic_copy_operation!(CopyC1, copy, copy_c1, C1, [
136    u8 => copy_u8_c1,
137    i8 => copy_i8_c1,
138    u16 => copy_u16_c1,
139    i16 => copy_i16_c1,
140    u32 => copy_u32_c1,
141    i32 => copy_i32_c1,
142    f16 => copy_f16_c1,
143    f32 => copy_f32_c1,
144    ComplexI16 => copy_i16_complex_c1,
145    Complex32 => copy_f32_complex_c1,
146    ComplexI32 => copy_i32_complex_c1,
147]);
148impl_generic_copy_operation!(CopyC2, copy, copy_c2, C2, [
149    i8 => copy_i8_c2,
150    ComplexI16 => copy_i16_complex_c2,
151    Complex32 => copy_f32_complex_c2,
152    ComplexI32 => copy_i32_complex_c2,
153]);
154impl_generic_copy_operation!(CopyC3, copy, copy_c3, C3, [
155    u8 => copy_u8_c3,
156    i8 => copy_i8_c3,
157    u16 => copy_u16_c3,
158    i16 => copy_i16_c3,
159    i32 => copy_i32_c3,
160    f16 => copy_f16_c3,
161    f32 => copy_f32_c3,
162    ComplexI16 => copy_i16_complex_c3,
163    Complex32 => copy_f32_complex_c3,
164    ComplexI32 => copy_i32_complex_c3,
165]);
166impl_generic_copy_operation!(CopyC4, copy, copy_c4, C4, [
167    u8 => copy_u8_c4,
168    i8 => copy_i8_c4,
169    u16 => copy_u16_c4,
170    i16 => copy_i16_c4,
171    i32 => copy_i32_c4,
172    f16 => copy_f16_c4,
173    f32 => copy_f32_c4,
174    ComplexI16 => copy_i16_complex_c4,
175    Complex32 => copy_f32_complex_c4,
176    ComplexI32 => copy_i32_complex_c4,
177]);
178impl_generic_copy_operation!(CopyAc4, copy, copy_ac4, AC4, [
179    u8 => copy_u8_ac4,
180    i8 => copy_i8_ac4,
181    u16 => copy_u16_ac4,
182    i16 => copy_i16_ac4,
183    u32 => copy_u32_ac4,
184    i32 => copy_i32_ac4,
185    f32 => copy_f32_ac4,
186    ComplexI16 => copy_i16_complex_ac4,
187    Complex32 => copy_f32_complex_ac4,
188    ComplexI32 => copy_i32_complex_ac4,
189]);
190
191pub(crate) fn copy_masked_u8_c1(
192    stream_context: &StreamContext,
193    source: &ImageView<'_, u8, C1>,
194    destination: &mut ImageViewMut<'_, u8, C1>,
195    mask: &MaskView<'_>,
196) -> Result<()> {
197    validate_same_size(source.size(), destination.size())?;
198    validate_mask_size(source.size(), mask.size())?;
199
200    unsafe {
201        try_ffi!(sys::nppiCopy_8u_C1MR_Ctx(
202            source.as_ptr().cast(),
203            source.step(),
204            destination.as_mut_ptr().cast(),
205            destination.step(),
206            source.size().into(),
207            mask.as_ptr().cast(),
208            mask.step(),
209            stream_context.as_raw(),
210        ))?;
211    }
212    Ok(())
213}
214
215pub(crate) fn copy_masked_u8_c3(
216    stream_context: &StreamContext,
217    source: &ImageView<'_, u8, C3>,
218    destination: &mut ImageViewMut<'_, u8, C3>,
219    mask: &MaskView<'_>,
220) -> Result<()> {
221    validate_same_size(source.size(), destination.size())?;
222    validate_mask_size(source.size(), mask.size())?;
223
224    unsafe {
225        try_ffi!(sys::nppiCopy_8u_C3MR_Ctx(
226            source.as_ptr().cast(),
227            source.step(),
228            destination.as_mut_ptr().cast(),
229            destination.step(),
230            source.size().into(),
231            mask.as_ptr().cast(),
232            mask.step(),
233            stream_context.as_raw(),
234        ))?;
235    }
236    Ok(())
237}
238
239pub(crate) fn copy_masked_u8_c4(
240    stream_context: &StreamContext,
241    source: &ImageView<'_, u8, C4>,
242    destination: &mut ImageViewMut<'_, u8, C4>,
243    mask: &MaskView<'_>,
244) -> Result<()> {
245    validate_same_size(source.size(), destination.size())?;
246    validate_mask_size(source.size(), mask.size())?;
247
248    unsafe {
249        try_ffi!(sys::nppiCopy_8u_C4MR_Ctx(
250            source.as_ptr().cast(),
251            source.step(),
252            destination.as_mut_ptr().cast(),
253            destination.step(),
254            source.size().into(),
255            mask.as_ptr().cast(),
256            mask.step(),
257            stream_context.as_raw(),
258        ))?;
259    }
260    Ok(())
261}
262
263pub(crate) fn copy_masked_u8_ac4(
264    stream_context: &StreamContext,
265    source: &ImageView<'_, u8, AC4>,
266    destination: &mut ImageViewMut<'_, u8, AC4>,
267    mask: &MaskView<'_>,
268) -> Result<()> {
269    validate_same_size(source.size(), destination.size())?;
270    validate_mask_size(source.size(), mask.size())?;
271
272    unsafe {
273        try_ffi!(sys::nppiCopy_8u_AC4MR_Ctx(
274            source.as_ptr().cast(),
275            source.step(),
276            destination.as_mut_ptr().cast(),
277            destination.step(),
278            source.size().into(),
279            mask.as_ptr().cast(),
280            mask.step(),
281            stream_context.as_raw(),
282        ))?;
283    }
284    Ok(())
285}
286
287impl_copy_masked!(copy_masked_u16_c1, u16, C1, nppiCopy_16u_C1MR_Ctx);
288impl_copy_masked!(copy_masked_u16_c3, u16, C3, nppiCopy_16u_C3MR_Ctx);
289impl_copy_masked!(copy_masked_u16_c4, u16, C4, nppiCopy_16u_C4MR_Ctx);
290impl_copy_masked!(copy_masked_u16_ac4, u16, AC4, nppiCopy_16u_AC4MR_Ctx);
291impl_copy_masked!(copy_masked_i16_c1, i16, C1, nppiCopy_16s_C1MR_Ctx);
292impl_copy_masked!(copy_masked_i16_c3, i16, C3, nppiCopy_16s_C3MR_Ctx);
293impl_copy_masked!(copy_masked_i16_c4, i16, C4, nppiCopy_16s_C4MR_Ctx);
294impl_copy_masked!(copy_masked_i16_ac4, i16, AC4, nppiCopy_16s_AC4MR_Ctx);
295impl_copy_masked!(copy_masked_i32_c1, i32, C1, nppiCopy_32s_C1MR_Ctx);
296impl_copy_masked!(copy_masked_i32_c3, i32, C3, nppiCopy_32s_C3MR_Ctx);
297impl_copy_masked!(copy_masked_i32_c4, i32, C4, nppiCopy_32s_C4MR_Ctx);
298impl_copy_masked!(copy_masked_i32_ac4, i32, AC4, nppiCopy_32s_AC4MR_Ctx);
299impl_copy_masked!(copy_masked_f32_c1, f32, C1, nppiCopy_32f_C1MR_Ctx);
300impl_copy_masked!(copy_masked_f32_c3, f32, C3, nppiCopy_32f_C3MR_Ctx);
301impl_copy_masked!(copy_masked_f32_c4, f32, C4, nppiCopy_32f_C4MR_Ctx);
302impl_copy_masked!(copy_masked_f32_ac4, f32, AC4, nppiCopy_32f_AC4MR_Ctx);
303
304impl_generic_copy_masked_operation!(CopyMaskedC1, copy_masked, copy_masked_c1, C1, [
305    u8 => copy_masked_u8_c1,
306    u16 => copy_masked_u16_c1,
307    i16 => copy_masked_i16_c1,
308    i32 => copy_masked_i32_c1,
309    f32 => copy_masked_f32_c1,
310]);
311impl_generic_copy_masked_operation!(CopyMaskedC3, copy_masked, copy_masked_c3, C3, [
312    u8 => copy_masked_u8_c3,
313    u16 => copy_masked_u16_c3,
314    i16 => copy_masked_i16_c3,
315    i32 => copy_masked_i32_c3,
316    f32 => copy_masked_f32_c3,
317]);
318impl_generic_copy_masked_operation!(CopyMaskedC4, copy_masked, copy_masked_c4, C4, [
319    u8 => copy_masked_u8_c4,
320    u16 => copy_masked_u16_c4,
321    i16 => copy_masked_i16_c4,
322    i32 => copy_masked_i32_c4,
323    f32 => copy_masked_f32_c4,
324]);
325impl_generic_copy_masked_operation!(CopyMaskedAc4, copy_masked, copy_masked_ac4, AC4, [
326    u8 => copy_masked_u8_ac4,
327    u16 => copy_masked_u16_ac4,
328    i16 => copy_masked_i16_ac4,
329    i32 => copy_masked_i32_ac4,
330    f32 => copy_masked_f32_ac4,
331]);