1use singe_cuda::types::f16;
2use singe_npp_sys as sys;
3
4use crate::{
5 context::StreamContext,
6 error::{Error, Result},
7 image::geometry_helpers::*,
8 image::view::{
9 AC4, C1, C3, C4, ChannelLayout, ImageView, ImageViewMut, PlanarImageView,
10 PlanarImageViewMut,
11 },
12 try_ffi,
13 types::{
14 AffineCoefficients, Axis, BoundF64, DataTypeLike, InterpolationMode,
15 PerspectiveCoefficients, Point, QuadrangleF64, Rectangle,
16 },
17 utility::to_usize,
18 workspace::ScratchBuffer,
19};
20
21#[macro_use]
22#[path = "geometry_macros.rs"]
23mod macros;
24
25#[path = "geometry_mirror.rs"]
26mod mirror;
27pub use mirror::*;
28
29#[path = "geometry_resize.rs"]
30mod resize;
31pub use resize::*;
32
33#[path = "geometry_transform.rs"]
34mod transform;
35pub use transform::*;
36
37#[path = "geometry_affine.rs"]
38mod affine;
39pub use affine::*;
40
41#[path = "geometry_perspective.rs"]
42mod perspective;
43pub use perspective::*;
44
45#[path = "geometry_back.rs"]
46mod back;
47pub use back::*;
48
49#[path = "geometry_resize_advanced.rs"]
50mod resize_advanced;
51pub use resize_advanced::*;
52
53#[derive(Debug, Clone, Copy)]
54pub struct WarpAffine {
55 pub source_roi: Rectangle,
56 pub destination_roi: Rectangle,
57 pub coefficients: AffineCoefficients,
58 pub interpolation: InterpolationMode,
59}
60
61#[derive(Debug, Clone, Copy)]
62pub struct WarpAffineBatch {
63 pub source_roi: Rectangle,
64 pub destination_roi: Rectangle,
65 pub interpolation: InterpolationMode,
66}
67
68#[derive(Debug, Clone, Copy)]
69pub struct WarpQuad {
70 pub source_roi: Rectangle,
71 pub source_quadrangle: QuadrangleF64,
72 pub destination_roi: Rectangle,
73 pub destination_quadrangle: QuadrangleF64,
74 pub interpolation: InterpolationMode,
75}
76
77#[derive(Debug, Clone, Copy)]
78pub struct WarpPerspective {
79 pub source_roi: Rectangle,
80 pub destination_roi: Rectangle,
81 pub coefficients: PerspectiveCoefficients,
82 pub interpolation: InterpolationMode,
83}
84
85#[derive(Debug, Clone, Copy)]
86pub struct WarpPerspectiveBatch {
87 pub source_roi: Rectangle,
88 pub destination_roi: Rectangle,
89 pub interpolation: InterpolationMode,
90}
91
92#[derive(Debug, Clone, Copy)]
93pub struct Remap {
94 pub source_roi: Rectangle,
95 pub interpolation: InterpolationMode,
96}
97
98#[derive(Debug, Clone, Copy)]
99pub struct Rotate {
100 pub source_roi: Rectangle,
101 pub destination_roi: Rectangle,
102 pub angle: f64,
103 pub x_shift: f64,
104 pub y_shift: f64,
105 pub interpolation: InterpolationMode,
106}
107
108#[derive(Debug, Clone, Copy)]
109pub struct Resize {
110 pub source_roi: Rectangle,
111 pub destination_roi: Rectangle,
112 pub interpolation: InterpolationMode,
113}
114
115#[derive(Debug, Clone, Copy)]
116pub struct ResizeBatchAdvanced {
117 pub source_roi: Rectangle,
118 pub destination_roi: Rectangle,
119}
120
121#[derive(Debug, Clone, Copy)]
122pub struct ResizeSqrPixel {
123 pub source_roi: Rectangle,
124 pub destination_roi: Rectangle,
125 pub x_factor: f64,
126 pub y_factor: f64,
127 pub x_shift: f64,
128 pub y_shift: f64,
129 pub interpolation: InterpolationMode,
130}
131
132#[derive(Debug, Clone, Copy)]
133pub struct ResizeSqrPixelAdvanced {
134 pub source_roi: Rectangle,
135 pub destination_roi: Rectangle,
136 pub x_factor: f64,
137 pub y_factor: f64,
138 pub interpolation: InterpolationMode,
139}
140
141pub fn resize_rect(
142 source_roi: Rectangle,
143 x_factor: f64,
144 y_factor: f64,
145 x_shift: f64,
146 y_shift: f64,
147 interpolation: InterpolationMode,
148) -> Result<Rectangle> {
149 let mut destination = sys::NppiRect::default();
150 unsafe {
151 try_ffi!(sys::nppiGetResizeRect(
152 source_roi.into(),
153 &raw mut destination,
154 x_factor,
155 y_factor,
156 x_shift,
157 y_shift,
158 i32::from(interpolation),
159 ))?;
160 }
161 Ok(destination.into())
162}
163
164pub fn resize_tiled_source_offset(
165 source_roi: Rectangle,
166 destination_roi: Rectangle,
167) -> Result<Point> {
168 let mut offset = sys::NppiPoint::default();
169 unsafe {
170 try_ffi!(sys::nppiGetResizeTiledSourceOffset(
171 source_roi.into(),
172 destination_roi.into(),
173 &raw mut offset,
174 ))?;
175 }
176 Ok(offset.into())
177}
178
179pub fn rotate_quad(
180 source_roi: Rectangle,
181 angle: f64,
182 shift_x: f64,
183 shift_y: f64,
184) -> Result<QuadrangleF64> {
185 let mut quadrangle = [[0.0; 2]; 4];
186 unsafe {
187 try_ffi!(sys::nppiGetRotateQuad(
188 source_roi.into(),
189 quadrangle.as_mut_ptr().cast(),
190 angle,
191 shift_x,
192 shift_y,
193 ))?;
194 }
195 Ok(quadrangle.into())
196}
197
198pub fn rotate_bound(
199 source_roi: Rectangle,
200 angle: f64,
201 shift_x: f64,
202 shift_y: f64,
203) -> Result<BoundF64> {
204 let mut bound = [[0.0; 2]; 2];
205 unsafe {
206 try_ffi!(sys::nppiGetRotateBound(
207 source_roi.into(),
208 bound.as_mut_ptr().cast(),
209 angle,
210 shift_x,
211 shift_y,
212 ))?;
213 }
214 Ok(bound.into())
215}
216
217pub fn affine_transform(
218 source_roi: Rectangle,
219 destination_quadrangle: QuadrangleF64,
220) -> Result<AffineCoefficients> {
221 let mut coefficients = [[0.0; 3]; 2];
222 unsafe {
223 try_ffi!(sys::nppiGetAffineTransform(
224 source_roi.into(),
225 destination_quadrangle.as_ptr().cast(),
226 coefficients.as_mut_ptr().cast(),
227 ))?;
228 }
229 Ok(coefficients.into())
230}
231
232pub fn affine_quad(
233 source_roi: Rectangle,
234 coefficients: AffineCoefficients,
235) -> Result<QuadrangleF64> {
236 let mut quadrangle = [[0.0; 2]; 4];
237 unsafe {
238 try_ffi!(sys::nppiGetAffineQuad(
239 source_roi.into(),
240 quadrangle.as_mut_ptr().cast(),
241 coefficients.as_ptr().cast(),
242 ))?;
243 }
244 Ok(quadrangle.into())
245}
246
247pub fn affine_bound(source_roi: Rectangle, coefficients: AffineCoefficients) -> Result<BoundF64> {
248 let mut bound = [[0.0; 2]; 2];
249 unsafe {
250 try_ffi!(sys::nppiGetAffineBound(
251 source_roi.into(),
252 bound.as_mut_ptr().cast(),
253 coefficients.as_ptr().cast(),
254 ))?;
255 }
256 Ok(bound.into())
257}
258
259pub fn perspective_transform(
260 source_roi: Rectangle,
261 destination_quadrangle: QuadrangleF64,
262) -> Result<PerspectiveCoefficients> {
263 let mut coefficients = [[0.0; 3]; 3];
264 unsafe {
265 try_ffi!(sys::nppiGetPerspectiveTransform(
266 source_roi.into(),
267 destination_quadrangle.as_ptr().cast(),
268 coefficients.as_mut_ptr().cast(),
269 ))?;
270 }
271 Ok(coefficients.into())
272}
273
274pub fn perspective_quad(
275 source_roi: Rectangle,
276 coefficients: PerspectiveCoefficients,
277) -> Result<QuadrangleF64> {
278 let mut quadrangle = [[0.0; 2]; 4];
279 unsafe {
280 try_ffi!(sys::nppiGetPerspectiveQuad(
281 source_roi.into(),
282 quadrangle.as_mut_ptr().cast(),
283 coefficients.as_ptr().cast(),
284 ))?;
285 }
286 Ok(quadrangle.into())
287}
288
289pub fn perspective_bound(
290 source_roi: Rectangle,
291 coefficients: PerspectiveCoefficients,
292) -> Result<BoundF64> {
293 let mut bound = [[0.0; 2]; 2];
294 unsafe {
295 try_ffi!(sys::nppiGetPerspectiveBound(
296 source_roi.into(),
297 bound.as_mut_ptr().cast(),
298 coefficients.as_ptr().cast(),
299 ))?;
300 }
301 Ok(bound.into())
302}
303
304#[derive(Debug, Clone, Copy)]
305pub struct ResizeU8C1 {
306 pub source_roi: Rectangle,
307 pub destination_roi: Rectangle,
308 pub interpolation: InterpolationMode,
309}
310
311impl ResizeU8C1 {
312 pub fn execute(
313 &self,
314 stream_context: &StreamContext,
315 source: &ImageView<'_, u8, C1>,
316 destination: &mut ImageViewMut<'_, u8, C1>,
317 ) -> Result<()> {
318 unsafe {
319 try_ffi!(sys::nppiResize_8u_C1R_Ctx(
320 source.as_ptr().cast(),
321 source.step(),
322 source.size().into(),
323 self.source_roi.into(),
324 destination.as_mut_ptr().cast(),
325 destination.step(),
326 destination.size().into(),
327 self.destination_roi.into(),
328 i32::from(self.interpolation),
329 stream_context.as_raw(),
330 ))?;
331 }
332 Ok(())
333 }
334}