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