Skip to main content

singe_npp/
types.rs

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::*;