use std::ffi::c_void;
use nvtiff_sys::{
nvtiffImageInfo, nvtiffImageType, nvtiffPhotometricInt, nvtiffPlanarConfig, nvtiffSampleFormat,
nvtiffStatus, nvtiffStream, nvtiffStreamCreate, nvtiffStreamGetImageInfo,
nvtiffStreamGetNumImages, nvtiffStreamGetTagValue, nvtiffStreamParse,
nvtiffStreamParseFromFile, nvtiffTag,
};
#[test]
fn nvtiff_parse_from_bytes() {
let mut stream = std::mem::MaybeUninit::uninit();
let mut tiff_stream: *mut nvtiffStream = stream.as_mut_ptr();
let status_create: nvtiffStatus::Type = unsafe { nvtiffStreamCreate(&raw mut tiff_stream) };
dbg!(status_create); assert_eq!(status_create, nvtiffStatus::NVTIFF_STATUS_SUCCESS);
let tif_url: &str =
"https://download.osgeo.org/geotiff/samples/GeogToWGS84GeoKey/GeogToWGS84GeoKey5.tif";
let response = minreq::get(tif_url)
.send()
.expect("GET request for {tif_url} failed");
let bytes = response.as_bytes();
let status_parse: u32 = unsafe { nvtiffStreamParse(bytes.as_ptr(), 32 * 1024, tiff_stream) };
dbg!(status_parse); assert_eq!(status_parse, nvtiffStatus::NVTIFF_STATUS_SUCCESS);
let mut num_images: u32 = 0;
let status_numimages: u32 =
unsafe { nvtiffStreamGetNumImages(tiff_stream, &raw mut num_images) };
dbg!(status_numimages); assert_eq!(status_numimages, nvtiffStatus::NVTIFF_STATUS_SUCCESS);
dbg!(num_images);
assert_eq!(num_images, 1);
let mut image_info = nvtiffImageInfo::default();
let status_imageinfo: u32 =
unsafe { nvtiffStreamGetImageInfo(tiff_stream, 0, &raw mut image_info) };
assert_eq!(status_imageinfo, nvtiffStatus::NVTIFF_STATUS_SUCCESS);
dbg!(image_info);
assert_eq!(
image_info,
nvtiffImageInfo {
image_type: nvtiffImageType::NVTIFF_IMAGETYPE_PAGE, image_width: 101,
image_height: 101,
compression: 32773, photometric_int: nvtiffPhotometricInt::NVTIFF_PHOTOMETRIC_PALETTE, planar_config: nvtiffPlanarConfig::NVTIFF_PLANARCONFIG_CONTIG, samples_per_pixel: 1,
bits_per_pixel: 8,
bits_per_sample: [8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
sample_format: [
nvtiffSampleFormat::NVTIFF_SAMPLEFORMAT_UINT, 0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
],
}
);
}
#[test]
fn nvtiff_get_tag_info() {
let mut stream = std::mem::MaybeUninit::uninit();
let mut tiff_stream: *mut nvtiffStream = stream.as_mut_ptr();
let status_create: nvtiffStatus::Type = unsafe { nvtiffStreamCreate(&raw mut tiff_stream) };
dbg!(status_create); assert_eq!(status_create, nvtiffStatus::NVTIFF_STATUS_SUCCESS);
let tiff_cstr = std::ffi::CString::new("images/cog_dateline.tif").unwrap();
let tiff_path: *const std::os::raw::c_char = tiff_cstr.as_ptr();
let status_parse: u32 = unsafe { nvtiffStreamParseFromFile(tiff_path, tiff_stream) };
dbg!(status_parse); assert_eq!(status_parse, nvtiffStatus::NVTIFF_STATUS_SUCCESS);
let mut pixel_scale: Vec<f64> = vec![f64::NAN; 3];
let status_pixelscaleinfo: u32 = unsafe {
nvtiffStreamGetTagValue(
tiff_stream,
0,
nvtiffTag::NVTIFF_TAG_MODEL_PIXEL_SCALE,
pixel_scale.as_mut_ptr().cast::<c_void>(),
3,
)
};
dbg!(status_pixelscaleinfo); assert_eq!(status_pixelscaleinfo, nvtiffStatus::NVTIFF_STATUS_SUCCESS);
dbg!(&pixel_scale);
assert_eq!(
pixel_scale,
[100.012_903_225_806_45, 100.012_738_853_503_18, 0.0] );
let mut tie_points: Vec<f64> = vec![f64::NAN; 6];
let status_tiepointsinfo: u32 = unsafe {
nvtiffStreamGetTagValue(
tiff_stream,
0,
nvtiffTag::NVTIFF_TAG_MODEL_TIE_POINT,
tie_points.as_mut_ptr().cast::<c_void>(),
6,
)
};
dbg!(status_tiepointsinfo); assert_eq!(status_tiepointsinfo, nvtiffStatus::NVTIFF_STATUS_SUCCESS);
dbg!(&tie_points);
assert_eq!(
tie_points,
[
0.0, 0.0, 0.0, 570_635.006_451_612_9, 5_847_564.993_630_573, 0.0 ]
);
let mut model_transformation: Vec<f64> = vec![f64::NAN; 16];
let status_modeltransformationinfo: u32 = unsafe {
nvtiffStreamGetTagValue(
tiff_stream,
0,
nvtiffTag::NVTIFF_TAG_MODEL_TRANSFORMATION,
model_transformation.as_mut_ptr().cast::<c_void>(),
16,
)
};
dbg!(status_modeltransformationinfo); assert_eq!(
status_modeltransformationinfo,
nvtiffStatus::NVTIFF_STATUS_TAG_NOT_FOUND
);
}