1use std::{
2 fmt::Debug,
3 fmt::{self, Display, Formatter},
4 mem::{align_of, offset_of, size_of},
5};
6
7use num_enum::{IntoPrimitive, TryFromPrimitive};
8use singe_core::{impl_enum_conversion, impl_enum_display};
9use singe_cuda::types::{Complex, Complex32, Complex64, f16};
10use singe_npp_sys as sys;
11
12use crate::error::{Error, Result};
13
14#[non_exhaustive]
15#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
16#[repr(u32)]
17pub enum DataType {
18 U8 = sys::NppDataType::NPP_8U as _,
19 I8 = sys::NppDataType::NPP_8S as _,
20 U16 = sys::NppDataType::NPP_16U as _,
21 I16 = sys::NppDataType::NPP_16S as _,
22 U32 = sys::NppDataType::NPP_32U as _,
23 I32 = sys::NppDataType::NPP_32S as _,
24 U64 = sys::NppDataType::NPP_64U as _,
25 I64 = sys::NppDataType::NPP_64S as _,
26 F16 = sys::NppDataType::NPP_16F as _,
27 F32 = sys::NppDataType::NPP_32F as _,
28 F64 = sys::NppDataType::NPP_64F as _,
29}
30
31impl_enum_conversion!(sys::NppDataType, DataType);
32
33impl_enum_display!(DataType, {
34 DataType::U8 => "NPP_8U",
35 DataType::I8 => "NPP_8S",
36 DataType::U16 => "NPP_16U",
37 DataType::I16 => "NPP_16S",
38 DataType::U32 => "NPP_32U",
39 DataType::I32 => "NPP_32S",
40 DataType::U64 => "NPP_64U",
41 DataType::I64 => "NPP_64S",
42 DataType::F16 => "NPP_16F",
43 DataType::F32 => "NPP_32F",
44 DataType::F64 => "NPP_64F",
45});
46
47pub trait DataTypeLike: Clone + Copy + Debug + 'static {
48 fn data_type() -> DataType;
49
50 fn is_complex() -> bool;
51
52 fn rust_type_name() -> &'static str;
53}
54
55macro_rules! impl_data_type {
56 ($ty:ty, $data_type:ident, $is_complex:expr) => {
57 impl DataTypeLike for $ty {
58 fn data_type() -> DataType {
59 DataType::$data_type
60 }
61
62 fn is_complex() -> bool {
63 $is_complex
64 }
65
66 fn rust_type_name() -> &'static str {
67 stringify!($ty)
68 }
69 }
70 };
71}
72
73#[non_exhaustive]
74#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
75#[repr(u32)]
76pub enum ImageChannels {
77 C1 = sys::NppiChannels::NPP_CH_1 as _,
78 C2 = sys::NppiChannels::NPP_CH_2 as _,
79 C3 = sys::NppiChannels::NPP_CH_3 as _,
80 C4 = sys::NppiChannels::NPP_CH_4 as _,
81 AC4 = sys::NppiChannels::NPP_CH_A4 as _,
82 P2 = sys::NppiChannels::NPP_CH_P2 as _,
83 P3 = sys::NppiChannels::NPP_CH_P3 as _,
84 P4 = sys::NppiChannels::NPP_CH_P4 as _,
85}
86
87impl_enum_conversion!(sys::NppiChannels, ImageChannels);
88
89impl_enum_display!(ImageChannels, {
90 ImageChannels::C1 => "NPP_CH_1",
91 ImageChannels::C2 => "NPP_CH_2",
92 ImageChannels::C3 => "NPP_CH_3",
93 ImageChannels::C4 => "NPP_CH_4",
94 ImageChannels::AC4 => "NPP_CH_A4",
95 ImageChannels::P2 => "NPP_CH_P2",
96 ImageChannels::P3 => "NPP_CH_P3",
97 ImageChannels::P4 => "NPP_CH_P4",
98});
99
100#[non_exhaustive]
101#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
102#[repr(u32)]
103pub enum ColorSpace {
104 TranscodeOnly = sys::NppiColorSpace::NPP_TRANSCODE_ONLY as _,
105 Bt601Jpeg = sys::NppiColorSpace::NPP_BT601JPEG as _,
106 Bt709Hdtv = sys::NppiColorSpace::NPP_BT709HDTV as _,
107 Bt2020Hdtv = sys::NppiColorSpace::NPP_BT2020HDTV as _,
108}
109
110impl_enum_conversion!(sys::NppiColorSpace, ColorSpace);
111
112impl_enum_display!(ColorSpace, {
113 ColorSpace::TranscodeOnly => "NPP_TRANSCODE_ONLY",
114 ColorSpace::Bt601Jpeg => "NPP_BT601JPEG",
115 ColorSpace::Bt709Hdtv => "NPP_BT709HDTV",
116 ColorSpace::Bt2020Hdtv => "NPP_BT2020HDTV",
117});
118
119pub type ComplexI16 = Complex<i16>;
120pub type ComplexU32 = Complex<u32>;
121pub type ComplexI32 = Complex<i32>;
122pub type ComplexI64 = Complex<i64>;
123
124impl_data_type!(u8, U8, false);
125impl_data_type!(i8, I8, false);
126impl_data_type!(u16, U16, false);
127impl_data_type!(i16, I16, false);
128impl_data_type!(u32, U32, false);
129impl_data_type!(i32, I32, false);
130impl_data_type!(u64, U64, false);
131impl_data_type!(i64, I64, false);
132impl_data_type!(f16, F16, false);
133impl_data_type!(f32, F32, false);
134impl_data_type!(f64, F64, false);
135impl_data_type!(ComplexI16, I16, true);
136impl_data_type!(ComplexU32, U32, true);
137impl_data_type!(ComplexI32, I32, true);
138impl_data_type!(ComplexI64, I64, true);
139impl_data_type!(Complex32, F32, true);
140impl_data_type!(Complex64, F64, true);
141
142pub trait IntoNpp {
143 type Npp;
144
145 fn into_npp(self) -> Self::Npp;
146}
147
148macro_rules! impl_into_npp_identity {
149 ($($ty:ty),* $(,)?) => {
150 $(
151 impl IntoNpp for $ty {
152 type Npp = Self;
153
154 fn into_npp(self) -> Self::Npp {
155 self
156 }
157 }
158 )*
159 };
160}
161
162impl_into_npp_identity!(u8, i8, u16, i16, u32, i32, u64, i64, f32, f64,);
163
164impl IntoNpp for ComplexI16 {
165 type Npp = sys::Npp16sc;
166
167 fn into_npp(self) -> Self::Npp {
168 sys::Npp16sc {
169 re: self.re,
170 im: self.im,
171 }
172 }
173}
174
175impl IntoNpp for ComplexU32 {
176 type Npp = sys::Npp32uc;
177
178 fn into_npp(self) -> Self::Npp {
179 sys::Npp32uc {
180 re: self.re,
181 im: self.im,
182 }
183 }
184}
185
186impl IntoNpp for ComplexI32 {
187 type Npp = sys::Npp32sc;
188
189 fn into_npp(self) -> Self::Npp {
190 sys::Npp32sc {
191 re: self.re,
192 im: self.im,
193 }
194 }
195}
196
197impl IntoNpp for ComplexI64 {
198 type Npp = sys::Npp64sc;
199
200 fn into_npp(self) -> Self::Npp {
201 sys::Npp64sc {
202 re: self.re,
203 im: self.im,
204 }
205 }
206}
207
208impl IntoNpp for Complex32 {
209 type Npp = sys::Npp32fc;
210
211 fn into_npp(self) -> Self::Npp {
212 sys::Npp32fc {
213 re: self.re,
214 im: self.im,
215 }
216 }
217}
218
219impl IntoNpp for Complex64 {
220 type Npp = sys::Npp64fc;
221
222 fn into_npp(self) -> Self::Npp {
223 sys::Npp64fc {
224 re: self.re,
225 im: self.im,
226 }
227 }
228}
229
230bitflags::bitflags! {
231 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
232 pub struct ContourDirection: u8 {
233 const SOUTH_EAST = sys::NPP_CONTOUR_DIRECTION_SOUTH_EAST as u8;
234 const SOUTH = sys::NPP_CONTOUR_DIRECTION_SOUTH as u8;
235 const SOUTH_WEST = sys::NPP_CONTOUR_DIRECTION_SOUTH_WEST as u8;
236 const WEST = sys::NPP_CONTOUR_DIRECTION_WEST as u8;
237 const EAST = sys::NPP_CONTOUR_DIRECTION_EAST as u8;
238 const NORTH_EAST = sys::NPP_CONTOUR_DIRECTION_NORTH_EAST as u8;
239 const NORTH = sys::NPP_CONTOUR_DIRECTION_NORTH as u8;
240 const NORTH_WEST = sys::NPP_CONTOUR_DIRECTION_NORTH_WEST as u8;
241 const ANY_NORTH = sys::NPP_CONTOUR_DIRECTION_ANY_NORTH as u8;
242 const ANY_WEST = sys::NPP_CONTOUR_DIRECTION_ANY_WEST as u8;
243 const ANY_SOUTH = sys::NPP_CONTOUR_DIRECTION_ANY_SOUTH as u8;
244 const ANY_EAST = sys::NPP_CONTOUR_DIRECTION_ANY_EAST as u8;
245 }
246}
247
248const _: () = {
249 ["Npp16f size"][size_of::<sys::Npp16f>() - size_of::<f16>()];
250 ["Npp16f alignment"][align_of::<sys::Npp16f>() - align_of::<f16>()];
251
252 ["Npp16sc size"][size_of::<sys::Npp16sc>() - size_of::<ComplexI16>()];
253 ["Npp16sc alignment"][align_of::<sys::Npp16sc>() - align_of::<ComplexI16>()];
254 ["Npp16sc re field"][offset_of!(ComplexI16, re) - offset_of!(sys::Npp16sc, re)];
255 ["Npp16sc im field"][offset_of!(ComplexI16, im) - offset_of!(sys::Npp16sc, im)];
256
257 ["Npp32uc size"][size_of::<sys::Npp32uc>() - size_of::<ComplexU32>()];
258 ["Npp32uc alignment"][align_of::<sys::Npp32uc>() - align_of::<ComplexU32>()];
259 ["Npp32uc re field"][offset_of!(ComplexU32, re) - offset_of!(sys::Npp32uc, re)];
260 ["Npp32uc im field"][offset_of!(ComplexU32, im) - offset_of!(sys::Npp32uc, im)];
261
262 ["Npp32sc size"][size_of::<sys::Npp32sc>() - size_of::<ComplexI32>()];
263 ["Npp32sc alignment"][align_of::<sys::Npp32sc>() - align_of::<ComplexI32>()];
264 ["Npp32sc re field"][offset_of!(ComplexI32, re) - offset_of!(sys::Npp32sc, re)];
265 ["Npp32sc im field"][offset_of!(ComplexI32, im) - offset_of!(sys::Npp32sc, im)];
266
267 ["Npp64sc size"][size_of::<sys::Npp64sc>() - size_of::<ComplexI64>()];
268 ["Npp64sc alignment"][align_of::<sys::Npp64sc>() - align_of::<ComplexI64>()];
269 ["Npp64sc re field"][offset_of!(ComplexI64, re) - offset_of!(sys::Npp64sc, re)];
270 ["Npp64sc im field"][offset_of!(ComplexI64, im) - offset_of!(sys::Npp64sc, im)];
271
272 ["Npp32fc size"][size_of::<sys::Npp32fc>() - size_of::<Complex32>()];
273 ["Npp32fc alignment"][align_of::<sys::Npp32fc>() - align_of::<Complex32>()];
274 ["Npp32fc re field"][offset_of!(Complex32, re) - offset_of!(sys::Npp32fc, re)];
275 ["Npp32fc im field"][offset_of!(Complex32, im) - offset_of!(sys::Npp32fc, im)];
276
277 ["Npp64fc size"][size_of::<sys::Npp64fc>() - size_of::<Complex64>()];
278 ["Npp64fc alignment"][align_of::<sys::Npp64fc>() - align_of::<Complex64>()];
279 ["Npp64fc re field"][offset_of!(Complex64, re) - offset_of!(sys::Npp64fc, re)];
280 ["Npp64fc im field"][offset_of!(Complex64, im) - offset_of!(sys::Npp64fc, im)];
281};
282
283#[path = "types_geometry.rs"]
284mod types_geometry;
285pub use types_geometry::*;
286
287#[path = "types_descriptors.rs"]
288mod types_descriptors;
289pub use types_descriptors::*;
290
291#[path = "types_enums.rs"]
292mod types_enums;
293pub use types_enums::*;