use openexr_sys as sys;
use crate::{
core::{cppstd::CppString, error::Error, header::Header, DataWindowSource},
deep::deep_image::DeepImage,
};
use std::path::Path;
type Result<T, E = Error> = std::result::Result<T, E>;
pub fn save_deep_image<P: AsRef<Path>>(
filename: P,
image: &DeepImage,
) -> Result<()> {
unsafe {
let s = CppString::new(
filename
.as_ref()
.to_str()
.expect("Invalid bytes in filename"),
);
sys::Imf_saveDeepImage(s.0, image.0).into_result()?;
}
Ok(())
}
pub fn save_deep_image_with_header<P: AsRef<Path>>(
filename: P,
header: &Header,
image: &DeepImage,
data_window_source: DataWindowSource,
) -> Result<()> {
unsafe {
let s = CppString::new(
filename
.as_ref()
.to_str()
.expect("Invalid bytes in filename"),
);
sys::Imf_saveDeepImage_with_header(
s.0,
header.0.as_ref() as *const sys::Imf_Header_t,
image.0,
data_window_source.into(),
)
.into_result()?;
}
Ok(())
}
pub fn load_deep_image<P: AsRef<Path>>(filename: P) -> Result<DeepImage> {
unsafe {
let s = CppString::new(
filename
.as_ref()
.to_str()
.expect("Invalid bytes in filename"),
);
#[allow(unused_mut)]
let mut img = DeepImage::default();
sys::Imf_loadDeepImage(s.0, img.0).into_result()?;
Ok(img)
}
}
#[cfg(test)]
#[test]
fn test_deep_image_io() -> Result<(), Box<dyn std::error::Error>> {
use std::path::PathBuf;
let path = PathBuf::from(
std::env::var("CARGO_MANIFEST_DIR")
.expect("CARGO_MANIFEST_DIR not set"),
)
.join("images")
.join("deep_cyl.exr");
let im = load_deep_image(&path)?;
save_deep_image("test_deep_image_io.exr", &im)?;
Ok(())
}