From 46918b395ca83004474261ddfb1032736a21a044 Mon Sep 17 00:00:00 2001 From: ruffson Date: Fri, 25 Sep 2020 18:36:49 +0200 Subject: [PATCH] Condense tile and strip reading code --- src/decoder/mod.rs | 46 ++++++++++++++++------------------------------ 1 file changed, 16 insertions(+), 30 deletions(-) diff --git a/src/decoder/mod.rs b/src/decoder/mod.rs index b0731a9..c9ac8f5 100644 --- a/src/decoder/mod.rs +++ b/src/decoder/mod.rs @@ -957,40 +957,25 @@ impl Decoder { Ok(()) } - pub fn read_jpeg_tiles(&mut self) -> TiffResult { - let tile_offsets = self.get_tag_u32_vec(Tag::TileOffsets)?; - let tile_bytes = self.get_tag_u32_vec(Tag::TileByteCounts)?; + pub fn read_jpeg(&mut self, read_strip_wise: bool) -> TiffResult { + + let offsets: Vec; + let bytes: Vec; let jpeg_tables: Vec = self.get_tag_u8_vec(Tag::JPEGTables)?; - let mut res_img = Vec::with_capacity(tile_offsets[0] as usize); - - for (idx, offset) in tile_offsets.iter().enumerate() { - self.goto_offset(*offset)?; - let jpeg_reader = JpegReader::new(&mut self.reader, tile_bytes[idx], &jpeg_tables)?; - let mut decoder = jpeg::Decoder::new(jpeg_reader); - - match decoder.decode() { - Err(e) => { - panic!("The ERror was: {}", e); - } - Ok(mut val) => res_img.append(&mut val), - } + if read_strip_wise { + offsets = self.get_tag_u32_vec(Tag::StripOffsets)?; + bytes = self.get_tag_u32_vec(Tag::StripByteCounts)?; + } else { + offsets = self.get_tag_u32_vec(Tag::TileOffsets)?; + bytes = self.get_tag_u32_vec(Tag::TileByteCounts)?; } - Ok(DecodingResult::U8(res_img)) - } + let mut res_img = Vec::with_capacity(offsets[0] as usize); - pub fn read_jpeg_strips(&mut self) -> TiffResult { - let strip_offsets = self.get_tag_u32_vec(Tag::StripOffsets)?; - let strip_bytes = self.get_tag_u32_vec(Tag::StripByteCounts)?; - let jpeg_tables: Vec = self.get_tag_u8_vec(Tag::JPEGTables)?; - - let mut res_img = Vec::with_capacity(strip_offsets[0] as usize); - - - for (idx, offset) in strip_offsets.iter().enumerate() { + for (idx, offset) in offsets.iter().enumerate() { self.goto_offset(*offset)?; - let jpeg_reader = JpegReader::new(&mut self.reader, strip_bytes[idx], &jpeg_tables)?; + let jpeg_reader = JpegReader::new(&mut self.reader, bytes[idx], &jpeg_tables)?; let mut decoder = jpeg::Decoder::new(jpeg_reader); match decoder.decode() { @@ -1126,10 +1111,11 @@ impl Decoder { /// Decodes the entire image and return it as a Vector pub fn read_image(&mut self) -> TiffResult { + if self.compression_method == CompressionMethod::ModernJPEG { match self.find_tag(Tag::TileOffsets) { - Ok(None) | Err(_) => return self.read_jpeg_strips(), - Ok(_) => return self.read_jpeg_tiles(), + Ok(None) | Err(_) => return self.read_jpeg(true), + Ok(_) => return self.read_jpeg(false), } }