From b196d19238bd13b5e5d7594280b391aa65e01b5f Mon Sep 17 00:00:00 2001 From: Alan Race Date: Wed, 27 Apr 2022 17:50:34 +0200 Subject: [PATCH] Now using the list of offsets to know how many IFDs we have seen --- src/decoder/mod.rs | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/src/decoder/mod.rs b/src/decoder/mod.rs index 3e50fd3..abd3722 100644 --- a/src/decoder/mod.rs +++ b/src/decoder/mod.rs @@ -342,8 +342,7 @@ where limits: Limits, current_chunk: usize, next_ifd: Option, - next_ifd_index: usize, - ifds: Vec, + ifd_offsets: Vec, seen_ifds: HashSet, image: Image, } @@ -538,15 +537,14 @@ impl Decoder { let mut seen_ifds = HashSet::new(); seen_ifds.insert(*next_ifd.as_ref().unwrap()); - let ifds = vec![*next_ifd.as_ref().unwrap()]; + let ifd_offsets = vec![*next_ifd.as_ref().unwrap()]; let mut decoder = Decoder { reader, bigtiff, limits: Default::default(), next_ifd, - next_ifd_index: 1, - ifds, + ifd_offsets, seen_ifds, image: Image { ifd: None, @@ -628,7 +626,8 @@ impl Decoder { /// Loads the IFD at the specified index in the list, if one exists pub fn image_at(&mut self, ifd_index: usize) -> TiffResult<()> { - if ifd_index >= self.next_ifd_index { + // Check whether we have seen this IFD before, if so then the index will be less than the length of the list of ifd offsets + if ifd_index >= self.ifd_offsets.len() { // We possibly need to load in the next IFD if self.next_ifd.is_none() { return Err(TiffError::FormatError( @@ -637,24 +636,25 @@ impl Decoder { } loop { - // Follow the list until we find the one we want - let (ifd, next_ifd) = self.next_ifd()?; + // Follow the list until we find the one we want, or we reach the end, whichever happens first + let (_ifd, next_ifd) = self.next_ifd()?; if next_ifd.is_none() { break; } - if ifd_index < self.ifds.len() { + if ifd_index < self.ifd_offsets.len() { break; } } } - if ifd_index < self.ifds.len() { - let (ifd, next_ifd) = Self::read_ifd( + // If the index is within the list of ifds then we can load the selected image/IFD + if ifd_index < self.ifd_offsets.len() { + let (ifd, _next_ifd) = Self::read_ifd( &mut self.reader, self.bigtiff, - *self.ifds.get(ifd_index).unwrap(), + *self.ifd_offsets.get(ifd_index).unwrap(), )?; self.current_chunk = 0; @@ -693,8 +693,7 @@ impl Decoder { return Err(TiffError::FormatError(TiffFormatError::CycleInOffsets)); } self.next_ifd = Some(next); - self.next_ifd_index += 1; - self.ifds.push(next); + self.ifd_offsets.push(next); } Ok((ifd, next_ifd)) @@ -704,7 +703,7 @@ impl Decoder { /// If there is no further image in the TIFF file a format error is returned. /// To determine whether there are more images call `TIFFDecoder::more_images` instead. pub fn next_image(&mut self) -> TiffResult<()> { - let (ifd, next_ifd) = self.next_ifd()?; + let (ifd, _next_ifd) = self.next_ifd()?; self.current_chunk = 0; self.image = Image::from_reader(&mut self.reader, ifd, &self.limits, self.bigtiff)?;