From ad0f75222a80ad206f6b80f2d68d59a472da2947 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Kr=C3=A1l?= Date: Fri, 21 May 2021 18:06:05 +0200 Subject: [PATCH] remove padding_buffer --- src/decoder/mod.rs | 30 ++++++------------------------ 1 file changed, 6 insertions(+), 24 deletions(-) diff --git a/src/decoder/mod.rs b/src/decoder/mod.rs index 173c4d5..27f9dd3 100644 --- a/src/decoder/mod.rs +++ b/src/decoder/mod.rs @@ -251,7 +251,6 @@ struct TileAttributes { padding_right: usize, /// length of padding for bottommost tile in pixels padding_down: usize, - /// A simple buffer right paddding is read into tile_samples: usize, /// Sample count of one row of one tile row_samples: usize, @@ -294,8 +293,6 @@ struct TileDecodeState { current_tile: usize, tile_offsets: Vec, tile_bytes: Vec, - /// Buffer used for skipping horizontal padding - padding_buffer: Vec, /// Pixel width of one row of the decoding result (tile / whole image) result_width: usize, } @@ -1176,7 +1173,6 @@ impl Decoder { let tile_decoder = self.tile_decoder.as_mut().unwrap(); let line_samples = tile_decoder.result_width * self.bits_per_sample.len(); - let padding_buffer = &mut tile_decoder.padding_buffer; let mut reader = Self::create_reader( &mut self.reader, @@ -1205,10 +1201,11 @@ impl Decoder { let row = &mut buf[(row_start * byte_len)..(row_end * byte_len)]; reader.read_exact(row)?; + // Skip horizontal padding - // TODO: find a better way of skipping the padding if padding_right > 0 { - reader.read_exact(padding_buffer)? + let len = u64::try_from(padding_right_samples * byte_len)?; + io::copy(&mut reader.by_ref().take(len), &mut io::sink())?; } Self::fix_endianness(&mut buffer.subrange(row_start..row_end), self.byte_order); @@ -1335,27 +1332,12 @@ impl Decoder { Ok(()) } - fn update_tile_decoder( - &mut self, - result_width: usize, - buffer_byte_len: usize, - ) -> TiffResult<()> { - let samples_per_pixel = self.bits_per_sample.len(); - + fn update_tile_decoder(&mut self, result_width: usize) -> TiffResult<()> { if self.tile_decoder.is_none() { - let tile_attrs = self.tile_attributes.as_ref().unwrap(); - - let padding_buffer_size = - tile_attrs.padding_right * samples_per_pixel * buffer_byte_len; - if padding_buffer_size > self.limits.intermediate_buffer_size { - return Err(TiffError::LimitsExceeded); - } - self.tile_decoder = Some(TileDecodeState { current_tile: 0, tile_offsets: self.get_tag_u64_vec(Tag::TileOffsets)?, tile_bytes: self.get_tag_u64_vec(Tag::TileByteCounts)?, - padding_buffer: vec![0; padding_buffer_size], result_width: 0, // needs to be updated for differently padded_tiles, see below }) } @@ -1605,7 +1587,7 @@ impl Decoder { let tile_length = tile_attrs.tile_length - padding_down; let mut result = self.result_buffer(tile_width, tile_length)?; - self.update_tile_decoder(tile_width, result.as_buffer(0).byte_len())?; + self.update_tile_decoder(tile_width)?; self.read_tile_to_buffer(&mut result.as_buffer(0), tile)?; @@ -1619,7 +1601,7 @@ impl Decoder { let mut result = self.result_buffer(width, usize::try_from(self.height)?)?; self.init_tile_attributes()?; - self.update_tile_decoder(width, result.as_buffer(0).byte_len())?; + self.update_tile_decoder(width)?; let tile_attrs = self.tile_attributes.as_ref().unwrap(); let tiles_across = tile_attrs.tiles_across;