diff --git a/Cargo.toml b/Cargo.toml index 3db3078..3afb300 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,7 +21,7 @@ byteorder = "1.2" lzw = "0.10" num-derive = "0.3" num-traits = "0.2" -libflate = "0.1" # TODO: Put behind a feature? +miniz_oxide = "0.3" # TODO: Put behind a feature? [dev-dependencies] tempfile = "3.0" diff --git a/src/decoder/mod.rs b/src/decoder/mod.rs index 0aab11f..c67df27 100644 --- a/src/decoder/mod.rs +++ b/src/decoder/mod.rs @@ -580,9 +580,7 @@ impl Decoder { (bytes, Box::new(reader)) } CompressionMethod::OldDeflate => { - let (bytes, reader) = DeflateReader::new( - &mut self.reader, - max_uncompressed_length)?; + let (bytes, reader) = DeflateReader::new(&mut self.reader)?; (bytes, Box::new(reader)) } method => { diff --git a/src/decoder/stream.rs b/src/decoder/stream.rs index f1d3c31..c5c0a44 100644 --- a/src/decoder/stream.rs +++ b/src/decoder/stream.rs @@ -3,7 +3,7 @@ use byteorder::{BigEndian, LittleEndian, ReadBytesExt}; use lzw; use std::io::{self, Read, Seek}; -use libflate::zlib; +use miniz_oxide::inflate; /// Byte order of the TIFF file. #[derive(Clone, Copy, Debug)] @@ -77,16 +77,20 @@ pub struct DeflateReader { impl DeflateReader { pub fn new( reader: &mut SmartReader, - max_uncompressed_length: usize, ) -> io::Result<(usize, Self)> { let byte_order = reader.byte_order; - let mut decoder = zlib::Decoder::new(reader)?; - let mut uncompressed = Vec::with_capacity(max_uncompressed_length); - let bytes_read = decoder.read_to_end(&mut uncompressed)?; - Ok((bytes_read, Self { - byte_order, - buffer: io::Cursor::new(uncompressed), - })) + let mut compressed = Vec::new(); + reader.read_to_end(&mut compressed)?; + let uncompressed = inflate::decompress_to_vec_zlib(&compressed).map_err(|error| { + std::io::Error::new(std::io::ErrorKind::InvalidData, format!("DEFLATE error: {:?}", error)) + })?; + Ok(( + uncompressed.len(), + Self { + byte_order, + buffer: io::Cursor::new(uncompressed), + }, + )) } } diff --git a/src/error.rs b/src/error.rs index 4e9f127..69402b0 100644 --- a/src/error.rs +++ b/src/error.rs @@ -138,7 +138,7 @@ impl Error for TiffError { } } - fn cause(&self) -> Option<&Error> { + fn cause(&self) -> Option<& dyn Error> { match *self { TiffError::IoError(ref e) => Some(e), _ => None, diff --git a/src/lib.rs b/src/lib.rs index 64a31cd..fe194e0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -8,7 +8,7 @@ extern crate byteorder; extern crate lzw; -extern crate libflate; +extern crate miniz_oxide; #[macro_use] extern crate num_derive; extern crate num_traits;