use crate::{
core::{
channel_list::Channel,
channel_list::CHANNEL_HALF,
error::Error,
refptr::{OpaquePtr, Ref, RefMut},
},
deep::{
deep_frame_buffer::DeepSlice,
deep_image_level::{DeepImageLevelRef, DeepImageLevelRefMut},
},
};
use half::f16;
use openexr_sys as sys;
type Result<T, E = Error> = std::result::Result<T, E>;
#[repr(transparent)]
pub struct DeepChannelF16(pub(crate) *mut sys::Imf_DeepHalfChannel_t);
unsafe impl OpaquePtr for DeepChannelF16 {
type SysPointee = sys::Imf_DeepHalfChannel_t;
type Pointee = DeepChannelF16;
}
pub type DeepChannelF16Ref<'a, P = DeepChannelF16> = Ref<'a, P>;
pub type DeepChannelF16RefMut<'a, P = DeepChannelF16> = RefMut<'a, P>;
#[repr(transparent)]
pub struct DeepChannelF32(pub(crate) *mut sys::Imf_DeepFloatChannel_t);
unsafe impl OpaquePtr for DeepChannelF32 {
type SysPointee = sys::Imf_DeepFloatChannel_t;
type Pointee = DeepChannelF32;
}
pub type DeepChannelF32Ref<'a, P = DeepChannelF32> = Ref<'a, P>;
pub type DeepChannelF32RefMut<'a, P = DeepChannelF32> = RefMut<'a, P>;
#[repr(transparent)]
pub struct DeepChannelU32(pub(crate) *mut sys::Imf_DeepUIntChannel_t);
unsafe impl OpaquePtr for DeepChannelU32 {
type SysPointee = sys::Imf_DeepUIntChannel_t;
type Pointee = DeepChannelU32;
}
pub type DeepChannelU32Ref<'a, P = DeepChannelU32> = Ref<'a, P>;
pub type DeepChannelU32RefMut<'a, P = DeepChannelU32> = RefMut<'a, P>;
impl DeepChannelF16 {
pub fn channel(&self) -> Channel {
let mut c = CHANNEL_HALF;
unsafe {
sys::Imf_DeepHalfChannel_channel(self.0, &mut c);
}
c
}
pub fn x_sampling(&self) -> i32 {
let mut v = 0;
unsafe {
sys::Imf_DeepHalfChannel_xSampling(self.0, &mut v);
v
}
}
pub fn y_sampling(&self) -> i32 {
let mut v = 0;
unsafe {
sys::Imf_DeepHalfChannel_ySampling(self.0, &mut v);
v
}
}
pub fn p_linear(&self) -> bool {
let mut v = false;
unsafe {
sys::Imf_DeepHalfChannel_pLinear(self.0, &mut v);
v
}
}
pub fn pixels_per_row(&self) -> i32 {
let mut v = 0;
unsafe {
sys::Imf_DeepHalfChannel_pixelsPerRow(self.0, &mut v);
v
}
}
pub fn pixels_per_column(&self) -> i32 {
let mut v = 0;
unsafe {
sys::Imf_DeepHalfChannel_pixelsPerColumn(self.0, &mut v);
v
}
}
pub fn num_pixels(&self) -> usize {
let mut v = 0;
unsafe {
sys::Imf_DeepHalfChannel_numPixels(self.0, &mut v);
v as usize
}
}
pub fn slice(&self) -> DeepSlice {
let mut s = sys::Imf_DeepSlice_t::default();
unsafe {
sys::Imf_DeepHalfChannel_slice(self.0, &mut s);
}
DeepSlice(s)
}
pub fn deep_level(&self) -> DeepImageLevelRef {
let mut ptr = std::ptr::null();
unsafe {
sys::Imf_DeepHalfChannel_deepLevel_const(self.0, &mut ptr);
}
DeepImageLevelRef::new(ptr)
}
pub fn deep_level_mut(&mut self) -> DeepImageLevelRefMut {
let mut ptr = std::ptr::null_mut();
unsafe {
sys::Imf_DeepHalfChannel_deepLevel(self.0, &mut ptr);
}
DeepImageLevelRefMut::new(ptr)
}
pub fn get(&self, x: i32, y: i32) -> Option<&f16> {
let mut ptr = std::ptr::null();
unsafe {
sys::Imf_DeepHalfChannel_at_const(self.0, &mut ptr, x, y)
.into_result()
.ok()
.map(|_| &*(ptr as *const f16))
}
}
pub fn get_mut(&self, x: i32, y: i32) -> Option<&mut f16> {
let mut ptr = std::ptr::null_mut();
unsafe {
sys::Imf_DeepHalfChannel_at(self.0, &mut ptr, x, y)
.into_result()
.ok()
.map(|_| &mut *(ptr as *mut f16))
}
}
}
impl DeepChannelF32 {
pub fn channel(&self) -> Channel {
let mut c = CHANNEL_HALF;
unsafe {
sys::Imf_DeepFloatChannel_channel(self.0, &mut c);
}
c
}
pub fn x_sampling(&self) -> i32 {
let mut v = 0;
unsafe {
sys::Imf_DeepFloatChannel_xSampling(self.0, &mut v);
v
}
}
pub fn y_sampling(&self) -> i32 {
let mut v = 0;
unsafe {
sys::Imf_DeepFloatChannel_ySampling(self.0, &mut v);
v
}
}
pub fn p_linear(&self) -> bool {
let mut v = false;
unsafe {
sys::Imf_DeepFloatChannel_pLinear(self.0, &mut v);
v
}
}
pub fn pixels_per_row(&self) -> i32 {
let mut v = 0;
unsafe {
sys::Imf_DeepFloatChannel_pixelsPerRow(self.0, &mut v);
v
}
}
pub fn pixels_per_column(&self) -> i32 {
let mut v = 0;
unsafe {
sys::Imf_DeepFloatChannel_pixelsPerColumn(self.0, &mut v);
v
}
}
pub fn num_pixels(&self) -> usize {
let mut v = 0;
unsafe {
sys::Imf_DeepFloatChannel_numPixels(self.0, &mut v);
v as usize
}
}
pub fn slice(&self) -> DeepSlice {
let mut s = sys::Imf_DeepSlice_t::default();
unsafe {
sys::Imf_DeepFloatChannel_slice(self.0, &mut s);
}
DeepSlice(s)
}
pub fn deep_level(&self) -> DeepImageLevelRef {
let mut ptr = std::ptr::null();
unsafe {
sys::Imf_DeepFloatChannel_deepLevel_const(self.0, &mut ptr);
}
DeepImageLevelRef::new(ptr)
}
pub fn deep_level_mut(&mut self) -> DeepImageLevelRefMut {
let mut ptr = std::ptr::null_mut();
unsafe {
sys::Imf_DeepFloatChannel_deepLevel(self.0, &mut ptr);
}
DeepImageLevelRefMut::new(ptr)
}
pub fn get(&self, x: i32, y: i32) -> Option<&f32> {
let mut ptr = std::ptr::null();
unsafe {
sys::Imf_DeepFloatChannel_at_const(self.0, &mut ptr, x, y)
.into_result()
.ok()
.map(|_| &*(ptr as *const f32))
}
}
pub fn get_mut(&self, x: i32, y: i32) -> Option<&mut f32> {
let mut ptr = std::ptr::null_mut();
unsafe {
sys::Imf_DeepFloatChannel_at(self.0, &mut ptr, x, y)
.into_result()
.ok()
.map(|_| &mut *(ptr as *mut f32))
}
}
}
impl DeepChannelU32 {
pub fn channel(&self) -> Channel {
let mut c = CHANNEL_HALF;
unsafe {
sys::Imf_DeepUIntChannel_channel(self.0, &mut c);
}
c
}
pub fn x_sampling(&self) -> i32 {
let mut v = 0;
unsafe {
sys::Imf_DeepUIntChannel_xSampling(self.0, &mut v);
v
}
}
pub fn y_sampling(&self) -> i32 {
let mut v = 0;
unsafe {
sys::Imf_DeepUIntChannel_ySampling(self.0, &mut v);
v
}
}
pub fn p_linear(&self) -> bool {
let mut v = false;
unsafe {
sys::Imf_DeepUIntChannel_pLinear(self.0, &mut v);
v
}
}
pub fn pixels_per_row(&self) -> i32 {
let mut v = 0;
unsafe {
sys::Imf_DeepUIntChannel_pixelsPerRow(self.0, &mut v);
v
}
}
pub fn pixels_per_column(&self) -> i32 {
let mut v = 0;
unsafe {
sys::Imf_DeepUIntChannel_pixelsPerColumn(self.0, &mut v);
v
}
}
pub fn num_pixels(&self) -> usize {
let mut v = 0;
unsafe {
sys::Imf_DeepUIntChannel_numPixels(self.0, &mut v);
v as usize
}
}
pub fn slice(&self) -> DeepSlice {
let mut s = sys::Imf_DeepSlice_t::default();
unsafe {
sys::Imf_DeepUIntChannel_slice(self.0, &mut s);
}
DeepSlice(s)
}
pub fn deep_level(&self) -> DeepImageLevelRef {
let mut ptr = std::ptr::null();
unsafe {
sys::Imf_DeepUIntChannel_deepLevel_const(self.0, &mut ptr);
}
DeepImageLevelRef::new(ptr)
}
pub fn deep_level_mut(&mut self) -> DeepImageLevelRefMut {
let mut ptr = std::ptr::null_mut();
unsafe {
sys::Imf_DeepUIntChannel_deepLevel(self.0, &mut ptr);
}
DeepImageLevelRefMut::new(ptr)
}
pub fn get(&self, x: i32, y: i32) -> Option<&u32> {
let mut ptr = std::ptr::null();
unsafe {
sys::Imf_DeepUIntChannel_at_const(self.0, &mut ptr, x, y)
.into_result()
.ok()
.map(|_| &*(ptr as *const u32))
}
}
pub fn get_mut(&self, x: i32, y: i32) -> Option<&mut u32> {
let mut ptr = std::ptr::null_mut();
unsafe {
sys::Imf_DeepUIntChannel_at(self.0, &mut ptr, x, y)
.into_result()
.ok()
.map(|_| &mut *(ptr as *mut u32))
}
}
}