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