From 9fcc2a3b65b0e909100099c9e48a8823669fcc16 Mon Sep 17 00:00:00 2001 From: Stephen Judkins Date: Mon, 8 Apr 2024 13:07:47 -0700 Subject: [PATCH] review changes: pass in width/height, unwrap reader bytes --- src/decoder/image.rs | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/src/decoder/image.rs b/src/decoder/image.rs index 5da841a..3dcd03a 100644 --- a/src/decoder/image.rs +++ b/src/decoder/image.rs @@ -381,7 +381,8 @@ impl Image { } fn create_reader<'r, R: 'r + Read>( - &self, + width: u32, + height: u32, reader: R, compression_method: CompressionMethod, compressed_length: u64, @@ -454,22 +455,24 @@ impl Image { Box::new(Cursor::new(data)) } CompressionMethod::Fax4 => { - let width = u16::try_from(self.width)?; - let height = u16::try_from(self.height)?; + let width = u16::try_from(width)?; + let height = u16::try_from(height)?; let mut out: Vec = Vec::with_capacity(usize::from(width) * usize::from(height)); - let mut buffer = Vec::with_capacity(usize::try_from(compressed_length)?); - reader.take(compressed_length).read_to_end(&mut buffer)?; - // all extant tiff/fax4 decoders I've found always assume that the photometric interpretation // is `WhiteIsZero`, ignoring the tag. ImageMagick appears to generate fax4-encoded tiffs // with the tag incorrectly set to `BlackIsZero`. - fax::decoder::decode_g4(buffer.into_iter(), width, Some(height), |transitions| { - out.extend(fax::decoder::pels(transitions, width).map(|c| match c { - fax::Color::Black => 255, - fax::Color::White => 0, - })) - }); + fax::decoder::decode_g4( + reader.bytes().map(|b| b.unwrap()), + width, + Some(height), + |transitions| { + out.extend(fax::decoder::pels(transitions, width).map(|c| match c { + fax::Color::Black => 255, + fax::Color::White => 0, + })) + }, + ); Box::new(Cursor::new(out)) } method => { @@ -673,7 +676,9 @@ impl Image { assert!(output_row_stride >= data_row_bytes); assert!(buf.len() >= output_row_stride * (data_dims.1 as usize - 1) + data_row_bytes); - let mut reader = self.create_reader( + let mut reader = Self::create_reader( + self.width, + self.height, reader, compression_method, *compressed_bytes,