use log::debug;
use crate::io::seekable::SeekableReader;
use crate::io::byte_order::ByteOrderHandler;
use crate::tiff::errors::{TiffError, TiffResult};
use crate::tiff::ifd::IFD;
pub fn read_first_ifd_offset(
reader: &mut dyn SeekableReader,
is_big_tiff: bool,
byte_order_handler: &Box<dyn ByteOrderHandler>
) -> TiffResult<u64> {
if is_big_tiff {
debug!("Reading BigTIFF first IFD offset");
byte_order_handler.read_u64(reader).map_err(TiffError::IoError)
} else {
debug!("Reading standard TIFF first IFD offset");
byte_order_handler.read_u32(reader)
.map(|v| v as u64)
.map_err(TiffError::IoError)
}
}
pub fn read_next_ifd_offset(
reader: &mut dyn SeekableReader,
is_big_tiff: bool,
byte_order_handler: &Box<dyn ByteOrderHandler>
) -> TiffResult<u64> {
if is_big_tiff {
byte_order_handler.read_u64(reader).map_err(TiffError::IoError)
} else {
byte_order_handler.read_u32(reader)
.map(|v| v as u64)
.map_err(TiffError::IoError)
}
}
pub fn calculate_ifd_size(ifd: &IFD, is_big_tiff: bool) -> u64 {
if is_big_tiff {
8 + (20 * ifd.entries.len() as u64) + 8
} else {
2 + (12 * ifd.entries.len() as u64) + 4
}
}