diff --git a/Cargo.toml b/Cargo.toml index bfe59a7..105fa34 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,10 +20,7 @@ edition = "2018" [dependencies] weezl = "0.1.0" jpeg = { package = "jpeg-decoder", version = "0.1.17", default-features = false } - -[dependencies.miniz_oxide] -version = "0.4.1" -features = ["no_extern_crate_alloc"] +flate2 = "1.0.20" [dev-dependencies] criterion = "0.3.1" diff --git a/src/decoder/mod.rs b/src/decoder/mod.rs index ac8694c..18f7b5e 100644 --- a/src/decoder/mod.rs +++ b/src/decoder/mod.rs @@ -1084,7 +1084,7 @@ impl Decoder { // Construct necessary reader to perform decompression. self.goto_offset_u64(offset)?; let byte_order = self.reader.byte_order; - let mut reader: Box = match self.compression_method { + let reader: Box = match self.compression_method { CompressionMethod::None => Box::new(&mut self.reader), CompressionMethod::LZW => Box::new( LZWReader::new( @@ -1097,8 +1097,8 @@ impl Decoder { CompressionMethod::PackBits => { Box::new(PackBitsReader::new(&mut self.reader, usize::try_from(length)?)?.1) } - CompressionMethod::OldDeflate => { - Box::new(DeflateReader::new(&mut self.reader, buffer.len() * buffer.byte_len())?.1) + CompressionMethod::Deflate | CompressionMethod::OldDeflate => { + Box::new(DeflateReader::new(&mut self.reader)) } method => { return Err(TiffError::UnsupportedError( @@ -1109,7 +1109,7 @@ impl Decoder { // Read into output buffer. { - let buffer = match &mut buffer { + let mut buffer = match &mut buffer { DecodingBuffer::U8(buf) => &mut *buf, DecodingBuffer::I8(buf) => bytecast::i8_as_ne_mut_bytes(buf), DecodingBuffer::U16(buf) => bytecast::u16_as_ne_mut_bytes(buf), @@ -1122,16 +1122,8 @@ impl Decoder { DecodingBuffer::F64(buf) => bytecast::f64_as_ne_mut_bytes(buf), }; - let mut bytes_written = 0; - while bytes_written < buffer.len() { - match reader.read(&mut buffer[bytes_written..]) { - Ok(0) => break, - Ok(n) => bytes_written += n, - Err(ref e) if e.kind() == io::ErrorKind::Interrupted => {} - Err(e) => Err(e)?, - } - } - for b in &mut buffer[bytes_written..] { + std::io::copy(&mut reader.take(buffer.len() as u64), &mut buffer)?; + for b in buffer { *b = 0; } } @@ -1383,8 +1375,8 @@ impl Decoder { CompressionMethod::PackBits => { Box::new(PackBitsReader::new(reader, usize::try_from(compressed_length)?)?.1) } - CompressionMethod::OldDeflate => { - Box::new(DeflateReader::new(reader, samples * byte_len)?.1) + CompressionMethod::Deflate | CompressionMethod::OldDeflate => { + Box::new(DeflateReader::new(reader)) } method => { return Err(TiffError::UnsupportedError( diff --git a/src/decoder/stream.rs b/src/decoder/stream.rs index 61fa5df..294a1c8 100644 --- a/src/decoder/stream.rs +++ b/src/decoder/stream.rs @@ -1,7 +1,5 @@ //! All IO functionality needed for TIFF decoding -use crate::error::{TiffError, TiffResult}; -use miniz_oxide::inflate; use std::io::{self, Read, Seek}; /// Byte order of the TIFF file. @@ -126,42 +124,7 @@ pub trait EndianReader: Read { /// ## Deflate Reader /// -/// Reader that decompresses DEFLATE streams -pub struct DeflateReader { - buffer: io::Cursor>, -} - -impl DeflateReader { - pub fn new( - reader: &mut SmartReader, - max_uncompressed_length: usize, - ) -> TiffResult<(usize, Self)> { - let mut compressed = Vec::new(); - reader.read_to_end(&mut compressed)?; - - // TODO: Implement streaming compression, and remove this (temporary) and somewhat - // misleading workaround. - if compressed.len() > max_uncompressed_length { - return Err(TiffError::LimitsExceeded); - } - - let uncompressed = - inflate::decompress_to_vec_zlib(&compressed).map_err(TiffError::from_inflate_status)?; - - Ok(( - uncompressed.len(), - Self { - buffer: io::Cursor::new(uncompressed), - }, - )) - } -} - -impl Read for DeflateReader { - fn read(&mut self, buf: &mut [u8]) -> io::Result { - self.buffer.read(buf) - } -} +pub type DeflateReader<'r, R> = flate2::read::ZlibDecoder<&'r mut SmartReader>; /// /// ## LZW Reader diff --git a/src/error.rs b/src/error.rs index c809307..8c51fbf 100644 --- a/src/error.rs +++ b/src/error.rs @@ -9,7 +9,6 @@ use crate::tags::{ CompressionMethod, PhotometricInterpretation, PlanarConfiguration, SampleFormat, Tag, }; use crate::ColorType; -use miniz_oxide::inflate::TINFLStatus; /// Tiff error kinds. #[derive(Debug)] @@ -62,6 +61,7 @@ pub enum TiffFormatError { ByteExpected(Value), UnsignedIntegerExpected(Value), SignedIntegerExpected(Value), + #[allow(deprecated)] InflateError(InflateError), Format(String), RequiredTagEmpty(Tag), @@ -123,21 +123,9 @@ impl fmt::Display for TiffFormatError { /// Decompression failed due to faulty compressed data. #[derive(Debug, Clone, PartialEq, Eq, Hash)] -pub struct InflateError { - status: TINFLStatus, -} - -impl InflateError { - pub(crate) fn new(status: TINFLStatus) -> Self { - Self { status } - } -} - -impl TiffError { - pub(crate) fn from_inflate_status(status: TINFLStatus) -> Self { - TiffError::FormatError(TiffFormatError::InflateError(InflateError::new(status))) - } -} +#[allow(deprecated)] +#[deprecated = "This type is not used anymore: deflate errors are now propagated as regular `io::Error`s"] +pub struct InflateError(()); /// The Decoder does not support features required by the image. /// diff --git a/src/lib.rs b/src/lib.rs index 1a5a84b..f736f20 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -7,7 +7,6 @@ //! * - The TIFF specification extern crate jpeg; -extern crate miniz_oxide; extern crate weezl; mod bytecast; @@ -16,9 +15,10 @@ pub mod encoder; mod error; pub mod tags; -pub use self::error::{ - InflateError, TiffError, TiffFormatError, TiffResult, TiffUnsupportedError, UsageError, -}; +pub use self::error::{TiffError, TiffFormatError, TiffResult, TiffUnsupportedError, UsageError}; + +#[allow(deprecated)] +pub use self::error::InflateError; /// An enumeration over supported color types and their bit depths #[derive(Copy, PartialEq, Eq, Debug, Clone, Hash)]