1 //! All IO functionality needed for TIFF decoding
2 
3 use crate::bytecast;
4 use crate::error::{TiffError, TiffResult};
5 use miniz_oxide::inflate;
6 use std::io::{self, Read, Seek};
7 
8 /// Byte order of the TIFF file.
9 #[derive(Clone, Copy, Debug)]
10 pub enum ByteOrder {
11     /// little endian byte order
12     LittleEndian,
13     /// big endian byte order
14     BigEndian,
15 }
16 
17 /// Reader that is aware of the byte order.
18 pub trait EndianReader: Read {
19     /// Byte order that should be adhered to
20     fn byte_order(&self) -> ByteOrder;
21 
22     /// Reads an u16
23     #[inline(always)]
24     fn read_u16(&mut self) -> Result<u16, io::Error> {
25         let mut n = [0u8; 2];
26         self.read_exact(&mut n)?;
27         Ok(match self.byte_order() {
28             ByteOrder::LittleEndian => u16::from_le_bytes(n),
29             ByteOrder::BigEndian => u16::from_be_bytes(n),
30         })
31     }
32 
33     #[inline(always)]
34     fn read_u16_into(&mut self, buffer: &mut [u16]) -> Result<(), io::Error> {
35         self.read_exact(bytecast::u16_as_ne_mut_bytes(buffer))?;
36         match self.byte_order() {
37             ByteOrder::LittleEndian => {
new_u8(size: usize, limits: &Limits) -> TiffResult<DecodingResult>38                 for n in buffer {
39                     *n = u16::from_le(*n);
40                 }
41             }
42             ByteOrder::BigEndian => {
43                 for n in buffer {
44                     *n = u16::from_be(*n);
45                 }
new_u16(size: usize, limits: &Limits) -> TiffResult<DecodingResult>46             }
47         }
48         Ok(())
49     }
50 
51     /// Reads an i16
52     #[inline(always)]
53     fn read_i16(&mut self) -> Result<i16, io::Error> {
54         let mut n = [0u8; 2];
55         self.read_exact(&mut n)?;
56         Ok(match self.byte_order() {
57             ByteOrder::LittleEndian => i16::from_le_bytes(n),
58             ByteOrder::BigEndian => i16::from_be_bytes(n),
59         })
60     }
61 
new_u64(size: usize, limits: &Limits) -> TiffResult<DecodingResult>62     /// Reads an u32
63     #[inline(always)]
64     fn read_u32(&mut self) -> Result<u32, io::Error> {
65         let mut n = [0u8; 4];
66         self.read_exact(&mut n)?;
67         Ok(match self.byte_order() {
68             ByteOrder::LittleEndian => u32::from_le_bytes(n),
69             ByteOrder::BigEndian => u32::from_be_bytes(n),
70         })
71     }
72 
73     #[inline(always)]
74     fn read_u32_into(&mut self, buffer: &mut [u32]) -> Result<(), io::Error> {
75         self.read_exact(bytecast::u32_as_ne_mut_bytes(buffer))?;
76         match self.byte_order() {
77             ByteOrder::LittleEndian => {
new_f64(size: usize, limits: &Limits) -> TiffResult<DecodingResult>78                 for n in buffer {
79                     *n = u32::from_le(*n);
80                 }
81             }
82             ByteOrder::BigEndian => {
83                 for n in buffer {
84                     *n = u32::from_be(*n);
85                 }
as_buffer(&mut self, start: usize) -> DecodingBuffer86             }
87         }
88         Ok(())
89     }
90 
91     /// Reads an i32
92     #[inline(always)]
93     fn read_i32(&mut self) -> Result<i32, io::Error> {
94         let mut n = [0u8; 4];
95         self.read_exact(&mut n)?;
96         Ok(match self.byte_order() {
97             ByteOrder::LittleEndian => i32::from_le_bytes(n),
98             ByteOrder::BigEndian => i32::from_be_bytes(n),
99         })
100     }
101 
102     /// Reads an u64
103     #[inline(always)]
104     fn read_u64(&mut self) -> Result<u64, io::Error> {
105         let mut n = [0u8; 8];
106         self.read_exact(&mut n)?;
107         Ok(match self.byte_order() {
108             ByteOrder::LittleEndian => u64::from_le_bytes(n),
109             ByteOrder::BigEndian => u64::from_be_bytes(n),
110         })
111     }
112 
113     #[inline(always)]
114     fn read_u64_into(&mut self, buffer: &mut [u64]) -> Result<(), io::Error> {
len(&self) -> usize115         self.read_exact(bytecast::u64_as_ne_mut_bytes(buffer))?;
116         match self.byte_order() {
117             ByteOrder::LittleEndian => {
118                 for n in buffer {
119                     *n = u64::from_le(*n);
120                 }
121             }
122             ByteOrder::BigEndian => {
123                 for n in buffer {
124                     *n = u64::from_be(*n);
125                 }
byte_len(&self) -> usize126             }
127         }
128         Ok(())
129     }
130 
131     /// Reads an f32
132     #[inline(always)]
133     fn read_f32(&mut self) -> Result<f32, io::Error> {
134         let mut n = [0u8; 4];
135         self.read_exact(&mut n)?;
136         Ok(f32::from_bits(match self.byte_order() {
137             ByteOrder::LittleEndian => u32::from_le_bytes(n),
138             ByteOrder::BigEndian => u32::from_be_bytes(n),
139         }))
140     }
141 
142     #[inline(always)]
143     fn read_f32_into(&mut self, buffer: &mut [f32]) -> Result<(), io::Error> {
144         self.read_exact(bytecast::f32_as_ne_mut_bytes(buffer))?;
145         match self.byte_order() {
146             ByteOrder::LittleEndian => {
147                 for n in buffer {
148                     *n = f32::from_bits(u32::from_le(n.to_bits()));
149                 }
150             }
151             ByteOrder::BigEndian => {
152                 for n in buffer {
153                     *n = f32::from_bits(u32::from_be(n.to_bits()));
154                 }
155             }
156         }
157         Ok(())
158     }
159 
160     /// Reads an f64
161     #[inline(always)]
162     fn read_f64(&mut self) -> Result<f64, io::Error> {
163         let mut n = [0u8; 8];
164         self.read_exact(&mut n)?;
165         Ok(f64::from_bits(match self.byte_order() {
166             ByteOrder::LittleEndian => u64::from_le_bytes(n),
167             ByteOrder::BigEndian => u64::from_be_bytes(n),
168         }))
169     }
170 
171     #[inline(always)]
172     fn read_f64_into(&mut self, buffer: &mut [f64]) -> Result<(), io::Error> {
173         self.read_exact(bytecast::f64_as_ne_mut_bytes(buffer))?;
174         match self.byte_order() {
175             ByteOrder::LittleEndian => {
176                 for n in buffer {
177                     *n = f64::from_bits(u64::from_le(n.to_bits()));
178                 }
179             }
180             ByteOrder::BigEndian => {
181                 for n in buffer {
182                     *n = f64::from_bits(u64::from_be(n.to_bits()));
183                 }
184             }
185         }
186         Ok(())
unlimited() -> Limits187     }
188 }
189 
190 ///
191 /// # READERS
192 ///
193 
194 ///
195 /// ## Deflate Reader
196 ///
197 
198 /// Reader that decompresses DEFLATE streams
199 pub struct DeflateReader {
200     buffer: io::Cursor<Vec<u8>>,
201     byte_order: ByteOrder,
202 }
203 
204 impl DeflateReader {
205     pub fn new<R: Read + Seek>(
206         reader: &mut SmartReader<R>,
207         max_uncompressed_length: usize,
208     ) -> TiffResult<(usize, Self)> {
209         let byte_order = reader.byte_order;
210         let mut compressed = Vec::new();
211         reader.read_to_end(&mut compressed)?;
212 
213         // TODO: Implement streaming compression, and remove this (temporary) and somewhat
214         // misleading workaround.
215         if compressed.len() > max_uncompressed_length {
216             return Err(TiffError::LimitsExceeded);
217         }
218 
219         let uncompressed =
220             inflate::decompress_to_vec_zlib(&compressed).map_err(TiffError::from_inflate_status)?;
221 
222         Ok((
223             uncompressed.len(),
224             Self {
225                 byte_order,
226                 buffer: io::Cursor::new(uncompressed),
227             },
228         ))
229     }
230 }
231 
232 impl Read for DeflateReader {
wrapping_add(&self, other: Self) -> Self233     fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
234         self.buffer.read(buf)
235     }
236 }
wrapping_add(&self, other: Self) -> Self237 
238 impl EndianReader for DeflateReader {
239     fn byte_order(&self) -> ByteOrder {
240         self.byte_order
241     }
242 }
wrapping_add(&self, other: Self) -> Self243 
244 ///
245 /// ## LZW Reader
246 ///
247 
248 /// Reader that decompresses LZW streams
249 pub struct LZWReader {
250     buffer: io::Cursor<Vec<u8>>,
251     byte_order: ByteOrder,
252 }
253 
254 impl LZWReader {
wrapping_add(&self, other: Self) -> Self255     /// Wraps a reader
256     pub fn new<R>(
257         reader: &mut SmartReader<R>,
258         compressed_length: usize,
259         max_uncompressed_length: usize,
260     ) -> io::Result<(usize, LZWReader)>
261     where
262         R: Read + Seek,
263     {
264         let order = reader.byte_order;
265         let mut compressed = vec![0; compressed_length as usize];
266         reader.read_exact(&mut compressed[..])?;
267         let mut uncompressed = Vec::with_capacity(max_uncompressed_length);
268         let mut decoder = weezl::decode::Decoder::with_tiff_size_switch(weezl::BitOrder::Msb, 8);
269         let mut bytes_read = 0;
270 
271         while uncompressed.len() < max_uncompressed_length {
272             let bytes_written = uncompressed.len();
273             uncompressed.reserve(1 << 12);
274             let buffer_space = uncompressed.capacity().min(max_uncompressed_length);
275             uncompressed.resize(buffer_space, 0u8);
276 
277             let result = decoder.decode_bytes(
278                 &compressed[bytes_read..],
279                 &mut uncompressed[bytes_written..],
280             );
281             bytes_read += result.consumed_in;
282             uncompressed.truncate(bytes_written + result.consumed_out);
283 
284             match result.status {
285                 Ok(weezl::LzwStatus::Ok) => {}
286                 Ok(weezl::LzwStatus::Done) => break,
287                 Ok(weezl::LzwStatus::NoProgress) => {
288                     return Err(io::Error::new(
289                         io::ErrorKind::UnexpectedEof,
290                         "no lzw end code found",
291                     ))
292                 }
293                 Err(err) => return Err(io::Error::new(io::ErrorKind::InvalidData, err)),
294             }
295         }
296 
297         let bytes = uncompressed.len();
298         Ok((
299             bytes,
300             LZWReader {
301                 buffer: io::Cursor::new(uncompressed),
302                 byte_order: order,
303             },
304         ))
305     }
306 }
307 
308 impl Read for LZWReader {
309     #[inline]
310     fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
311         self.buffer.read(buf)
312     }
313 }
314 
315 impl EndianReader for LZWReader {
316     #[inline(always)]
317     fn byte_order(&self) -> ByteOrder {
318         self.byte_order
319     }
320 }
321 
322 ///
323 /// ## JPEG Reader (for "new-style" JPEG format (TIFF compression tag 7))
324 ///
325 
326 pub(crate) struct JpegReader {
327     buffer: io::Cursor<Vec<u8>>,
328     byte_order: ByteOrder,
new(r: R) -> TiffResult<Decoder<R>>329 }
330 impl JpegReader {
331     /// Constructs new JpegReader wrapping a SmartReader.
332     /// Because JPEG compression in TIFF allows to save quantization and/or huffman tables in one
333     /// central location, the constructor accepts this data as `jpeg_tables` here containing either
334     /// or both.
335     /// These `jpeg_tables` are simply prepended to the remaining jpeg image data.
336     /// Because these `jpeg_tables` start with a `SOI` (HEX: `0xFFD8`) or __start of image__ marker
337     /// which is also at the beginning of the remaining JPEG image data and would
338     /// confuse the JPEG renderer, one of these has to be taken off. In this case the first two
339     /// bytes of the remaining JPEG data is removed because it follows `jpeg_tables`.
340     /// Similary, `jpeg_tables` ends with a `EOI` (HEX: `0xFFD9`) or __end of image__ marker,
341     /// this has to be removed as well (last two bytes of `jpeg_tables`).
342 
343     pub fn new<R>(
344         reader: &mut SmartReader<R>,
345         length: u32,
346         jpeg_tables: &Option<Vec<u8>>,
347     ) -> io::Result<JpegReader>
348     where
349         R: Read + Seek,
350     {
351         let order = reader.byte_order;
352 
353         // Read jpeg image data
354         let mut segment = vec![0; length as usize];
355         reader.read_exact(&mut segment[..])?;
356 
357         match jpeg_tables {
358             Some(tables) => {
359                 let mut jpeg_data = tables.clone();
360                 let truncated_length = jpeg_data.len() - 2;
361                 jpeg_data.truncate(truncated_length);
362                 jpeg_data.extend_from_slice(&mut segment[2..]);
363 
364                 Ok(JpegReader {
365                     buffer: io::Cursor::new(jpeg_data),
366                     byte_order: order,
367                 })
368             }
369             None => Ok(JpegReader {
370                 buffer: io::Cursor::new(segment),
371                 byte_order: order,
372             }),
373         }
374     }
375 }
376 
377 impl Read for JpegReader {
378     // #[inline]
379     fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
380         self.buffer.read(buf)
381     }
382 }
383 
384 impl EndianReader for JpegReader {
385     #[inline(always)]
386     fn byte_order(&self) -> ByteOrder {
387         self.byte_order
388     }
389 }
390 
391 ///
392 /// ## PackBits Reader
393 ///
394 
395 /// Reader that unpacks Apple's `PackBits` format
396 pub struct PackBitsReader {
397     buffer: io::Cursor<Vec<u8>>,
398     byte_order: ByteOrder,
399 }
read_header(&mut self) -> TiffResult<()>400 
401 impl PackBitsReader {
402     /// Wraps a reader
403     pub fn new<R: Read + Seek>(
404         mut reader: R,
405         byte_order: ByteOrder,
406         length: usize,
407     ) -> io::Result<(usize, PackBitsReader)> {
408         let mut buffer = Vec::new();
409         let mut read: usize = 0;
410         while read < length {
411             let lread = read_packbits_run(&mut reader, &mut buffer)?;
412             if lread == 0 {
413                 return Err(io::ErrorKind::UnexpectedEof.into());
414             }
415             read += lread;
416         }
417         Ok((
418             buffer.len(),
419             PackBitsReader {
420                 buffer: io::Cursor::new(buffer),
421                 byte_order,
422             },
423         ))
424     }
425 }
426 
427 fn read_packbits_run<R: Read + Seek>(reader: &mut R, buffer: &mut Vec<u8>) -> io::Result<usize> {
428     let mut header: [u8; 1] = [0];
429 
430     let bytes = reader.read(&mut header)?;
431 
432     match bytes {
433         0 => Ok(0),
434         _ => match header[0] as i8 {
435             -128 => Ok(1),
436             h if h >= -127 && h <= -1 => {
437                 let new_len = buffer.len() + (1 - h as isize) as usize;
438                 reader.read_exact(&mut header)?;
439                 buffer.resize(new_len, header[0]);
440                 Ok(2)
441             }
442             h => {
443                 let num_vals = h as usize + 1;
444                 let start = buffer.len();
445                 buffer.resize(start + num_vals, 0);
446                 reader.read_exact(&mut buffer[start..])?;
447                 Ok(num_vals + 1)
448             }
init(mut self) -> TiffResult<Decoder<R>>449         },
450     }
451 }
452 
453 impl Read for PackBitsReader {
454     #[inline]
455     fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
456         self.buffer.read(buf)
457     }
458 }
459 
460 impl EndianReader for PackBitsReader {
461     #[inline(always)]
462     fn byte_order(&self) -> ByteOrder {
463         self.byte_order
464     }
465 }
466 
467 ///
468 /// ## SmartReader Reader
469 ///
470 
471 /// Reader that is aware of the byte order.
472 #[derive(Debug)]
473 pub struct SmartReader<R>
474 where
475     R: Read + Seek,
476 {
477     reader: R,
478     pub byte_order: ByteOrder,
479 }
480 
481 impl<R> SmartReader<R>
482 where
483     R: Read + Seek,
484 {
485     /// Wraps a reader
486     pub fn wrap(reader: R, byte_order: ByteOrder) -> SmartReader<R> {
487         SmartReader { reader, byte_order }
488     }
489 }
490 
491 impl<R> EndianReader for SmartReader<R>
492 where
493     R: Read + Seek,
494 {
495     #[inline(always)]
496     fn byte_order(&self) -> ByteOrder {
497         self.byte_order
498     }
499 }
500 
501 impl<R: Read + Seek> Read for SmartReader<R> {
502     #[inline]
more_images(&self) -> bool503     fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
504         self.reader.read(buf)
505     }
506 }
507 
byte_order(&self) -> ByteOrder508 impl<R: Read + Seek> Seek for SmartReader<R> {
509     #[inline]
510     fn seek(&mut self, pos: io::SeekFrom) -> io::Result<u64> {
511         self.reader.seek(pos)
512     }
513 }
514 
515 #[cfg(test)]
516 mod test {
517     use super::*;
518 
519     #[test]
520     fn test_packbits() {
521         let encoded = vec![
522             0xFE, 0xAA, 0x02, 0x80, 0x00, 0x2A, 0xFD, 0xAA, 0x03, 0x80, 0x00, 0x2A, 0x22, 0xF7,
read_byte(&mut self) -> Result<u8, io::Error>523             0xAA,
524         ];
525         let encoded_len = encoded.len();
526 
527         let buff = io::Cursor::new(encoded);
528         let (_, mut decoder) =
529             PackBitsReader::new(buff, ByteOrder::LittleEndian, encoded_len).unwrap();
530 
read_short(&mut self) -> Result<u16, io::Error>531         let mut decoded = Vec::new();
532         decoder.read_to_end(&mut decoded).unwrap();
533 
534         let expected = vec![
535             0xAA, 0xAA, 0xAA, 0x80, 0x00, 0x2A, 0xAA, 0xAA, 0xAA, 0xAA, 0x80, 0x00, 0x2A, 0x22,
536             0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
read_sshort(&mut self) -> Result<i16, io::Error>537         ];
538         assert_eq!(decoded, expected);
539     }
540 }
541