Skip to main content

singe_npp/image/
exchange_copy_constant_border.rs

1use super::*;
2
3pub(crate) fn copy_constant_border_u8_c1(
4    stream_context: &StreamContext,
5    source: &ImageView<'_, u8, C1>,
6    destination: &mut ImageViewMut<'_, u8, C1>,
7    top: usize,
8    left: usize,
9    value: u8,
10) -> Result<()> {
11    let (top, left) = validate_border_placement(source.size(), destination.size(), top, left)?;
12
13    unsafe {
14        try_ffi!(sys::nppiCopyConstBorder_8u_C1R_Ctx(
15            source.as_ptr().cast(),
16            source.step(),
17            source.size().into(),
18            destination.as_mut_ptr().cast(),
19            destination.step(),
20            destination.size().into(),
21            top,
22            left,
23            value,
24            stream_context.as_raw(),
25        ))?;
26    }
27    Ok(())
28}
29
30pub(crate) fn copy_constant_border_u8_c3(
31    stream_context: &StreamContext,
32    source: &ImageView<'_, u8, C3>,
33    destination: &mut ImageViewMut<'_, u8, C3>,
34    top: usize,
35    left: usize,
36    value: [u8; 3],
37) -> Result<()> {
38    let (top, left) = validate_border_placement(source.size(), destination.size(), top, left)?;
39
40    unsafe {
41        try_ffi!(sys::nppiCopyConstBorder_8u_C3R_Ctx(
42            source.as_ptr().cast(),
43            source.step(),
44            source.size().into(),
45            destination.as_mut_ptr().cast(),
46            destination.step(),
47            destination.size().into(),
48            top,
49            left,
50            value.as_ptr().cast(),
51            stream_context.as_raw(),
52        ))?;
53    }
54    Ok(())
55}
56
57pub(crate) fn copy_constant_border_u8_c4(
58    stream_context: &StreamContext,
59    source: &ImageView<'_, u8, C4>,
60    destination: &mut ImageViewMut<'_, u8, C4>,
61    top: usize,
62    left: usize,
63    value: [u8; 4],
64) -> Result<()> {
65    let (top, left) = validate_border_placement(source.size(), destination.size(), top, left)?;
66
67    unsafe {
68        try_ffi!(sys::nppiCopyConstBorder_8u_C4R_Ctx(
69            source.as_ptr().cast(),
70            source.step(),
71            source.size().into(),
72            destination.as_mut_ptr().cast(),
73            destination.step(),
74            destination.size().into(),
75            top,
76            left,
77            value.as_ptr().cast(),
78            stream_context.as_raw(),
79        ))?;
80    }
81    Ok(())
82}
83
84pub(crate) fn copy_constant_border_u8_ac4(
85    stream_context: &StreamContext,
86    source: &ImageView<'_, u8, AC4>,
87    destination: &mut ImageViewMut<'_, u8, AC4>,
88    top: usize,
89    left: usize,
90    value: [u8; 3],
91) -> Result<()> {
92    let (top, left) = validate_border_placement(source.size(), destination.size(), top, left)?;
93
94    unsafe {
95        try_ffi!(sys::nppiCopyConstBorder_8u_AC4R_Ctx(
96            source.as_ptr().cast(),
97            source.step(),
98            source.size().into(),
99            destination.as_mut_ptr().cast(),
100            destination.step(),
101            destination.size().into(),
102            top,
103            left,
104            value.as_ptr().cast(),
105            stream_context.as_raw(),
106        ))?;
107    }
108    Ok(())
109}
110
111impl_copy_constant_border_scalar!(
112    copy_constant_border_u16_c1,
113    u16,
114    nppiCopyConstBorder_16u_C1R_Ctx
115);
116impl_copy_constant_border_packed!(
117    copy_constant_border_u16_c3,
118    u16,
119    C3,
120    [u16; 3],
121    nppiCopyConstBorder_16u_C3R_Ctx
122);
123impl_copy_constant_border_packed!(
124    copy_constant_border_u16_c4,
125    u16,
126    C4,
127    [u16; 4],
128    nppiCopyConstBorder_16u_C4R_Ctx
129);
130impl_copy_constant_border_packed!(
131    copy_constant_border_u16_ac4,
132    u16,
133    AC4,
134    [u16; 3],
135    nppiCopyConstBorder_16u_AC4R_Ctx
136);
137impl_copy_constant_border_scalar!(
138    copy_constant_border_i16_c1,
139    i16,
140    nppiCopyConstBorder_16s_C1R_Ctx
141);
142impl_copy_constant_border_packed!(
143    copy_constant_border_i16_c3,
144    i16,
145    C3,
146    [i16; 3],
147    nppiCopyConstBorder_16s_C3R_Ctx
148);
149impl_copy_constant_border_packed!(
150    copy_constant_border_i16_c4,
151    i16,
152    C4,
153    [i16; 4],
154    nppiCopyConstBorder_16s_C4R_Ctx
155);
156impl_copy_constant_border_packed!(
157    copy_constant_border_i16_ac4,
158    i16,
159    AC4,
160    [i16; 3],
161    nppiCopyConstBorder_16s_AC4R_Ctx
162);
163impl_copy_constant_border_scalar!(
164    copy_constant_border_i32_c1,
165    i32,
166    nppiCopyConstBorder_32s_C1R_Ctx
167);
168impl_copy_constant_border_packed!(
169    copy_constant_border_i32_c3,
170    i32,
171    C3,
172    [i32; 3],
173    nppiCopyConstBorder_32s_C3R_Ctx
174);
175impl_copy_constant_border_packed!(
176    copy_constant_border_i32_c4,
177    i32,
178    C4,
179    [i32; 4],
180    nppiCopyConstBorder_32s_C4R_Ctx
181);
182impl_copy_constant_border_packed!(
183    copy_constant_border_i32_ac4,
184    i32,
185    AC4,
186    [i32; 3],
187    nppiCopyConstBorder_32s_AC4R_Ctx
188);
189impl_copy_constant_border_scalar!(
190    copy_constant_border_f32_c1,
191    f32,
192    nppiCopyConstBorder_32f_C1R_Ctx
193);
194impl_copy_constant_border_packed!(
195    copy_constant_border_f32_c3,
196    f32,
197    C3,
198    [f32; 3],
199    nppiCopyConstBorder_32f_C3R_Ctx
200);
201impl_copy_constant_border_packed!(
202    copy_constant_border_f32_c4,
203    f32,
204    C4,
205    [f32; 4],
206    nppiCopyConstBorder_32f_C4R_Ctx
207);
208impl_copy_constant_border_packed!(
209    copy_constant_border_f32_ac4,
210    f32,
211    AC4,
212    [f32; 3],
213    nppiCopyConstBorder_32f_AC4R_Ctx
214);
215impl_generic_copy_constant_border_operation!(
216    CopyConstantBorderC1,
217    copy_constant_border_c1,
218    C1,
219    [
220        u8 => (u8, copy_constant_border_u8_c1),
221        u16 => (u16, copy_constant_border_u16_c1),
222        i16 => (i16, copy_constant_border_i16_c1),
223        i32 => (i32, copy_constant_border_i32_c1),
224        f32 => (f32, copy_constant_border_f32_c1),
225    ]
226);
227impl_generic_copy_constant_border_operation!(
228    CopyConstantBorderC3,
229    copy_constant_border_c3,
230    C3,
231    [
232        u8 => ([u8; 3], copy_constant_border_u8_c3),
233        u16 => ([u16; 3], copy_constant_border_u16_c3),
234        i16 => ([i16; 3], copy_constant_border_i16_c3),
235        i32 => ([i32; 3], copy_constant_border_i32_c3),
236        f32 => ([f32; 3], copy_constant_border_f32_c3),
237    ]
238);
239impl_generic_copy_constant_border_operation!(
240    CopyConstantBorderC4,
241    copy_constant_border_c4,
242    C4,
243    [
244        u8 => ([u8; 4], copy_constant_border_u8_c4),
245        u16 => ([u16; 4], copy_constant_border_u16_c4),
246        i16 => ([i16; 4], copy_constant_border_i16_c4),
247        i32 => ([i32; 4], copy_constant_border_i32_c4),
248        f32 => ([f32; 4], copy_constant_border_f32_c4),
249    ]
250);
251impl_generic_copy_constant_border_operation!(
252    CopyConstantBorderAC4,
253    copy_constant_border_ac4,
254    AC4,
255    [
256        u8 => ([u8; 3], copy_constant_border_u8_ac4),
257        u16 => ([u16; 3], copy_constant_border_u16_ac4),
258        i16 => ([i16; 3], copy_constant_border_i16_ac4),
259        i32 => ([i32; 3], copy_constant_border_i32_ac4),
260        f32 => ([f32; 3], copy_constant_border_f32_ac4),
261    ]
262);