Skip to main content

singe_npp/image/
geometry.rs

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}