use std::os::raw::{c_char, c_void}; use std::ffi::CString; /// # TIFF Internal Structure /// An opaque type #[repr(C)] pub struct TIFF { _unused: [u8; 0], } /// # TIFF Warning Handler Definition type TIFFWarningHandler = Option; /// # TIFF Ignore Warnings Handle unsafe extern "C" fn tiff_ignore_warning_handle(_module: *const c_char, _fmt: *const c_char, _ap: *mut std::ffi::c_void) { // Do nothing } #[link(name = "tiff")] unsafe extern "C" { fn TIFFSetWarningHandler(handler: TIFFWarningHandler) -> TIFFWarningHandler; fn TIFFOpen(filename: *const c_char, mode: *const c_char) -> *mut TIFF; fn TIFFClose(tiff_ptr: *mut TIFF); } /// # Ignore TIFF Warnings pub fn ignore_warnings() { unsafe { let _ = TIFFSetWarningHandler(Some(tiff_ignore_warning_handle)); } } /// # Open TIFF File pub fn open(filename: &str) -> Option<*mut TIFF> { let c_filename = CString::new(filename).expect("Cast error"); let c_mode = CString::new("r").expect("Cast error"); unsafe { let result = TIFFOpen(c_filename.as_ptr(), c_mode.as_ptr()); if result.is_null() { return None; } else { return Some(result); } } } /// # Close TIFF File pub fn close(tiff_ptr: *mut TIFF) { unsafe { TIFFClose(tiff_ptr); } }