diff --git a/src/decoder/image.rs b/src/decoder/image.rs index 97658f4..1a61640 100644 --- a/src/decoder/image.rs +++ b/src/decoder/image.rs @@ -687,8 +687,6 @@ impl Image { let row = &mut row[..data_row_bytes]; reader.read_exact(row)?; - println!("chunk={chunk_index}, index={i}"); - // Skip horizontal padding if chunk_row_bytes > data_row_bytes { let len = u64::try_from(chunk_row_bytes - data_row_bytes)?; diff --git a/src/decoder/mod.rs b/src/decoder/mod.rs index 09d530b..8b5ffbc 100644 --- a/src/decoder/mod.rs +++ b/src/decoder/mod.rs @@ -969,13 +969,20 @@ impl Decoder { } fn result_buffer(&self, width: usize, height: usize) -> TiffResult { - let buffer_size = match width + let bits_per_sample = self.image().bits_per_sample; + + let row_samples = if bits_per_sample >= 8 { + width + } else { + ((((width as u64) * bits_per_sample as u64) + 7) / 8) + .try_into() + .map_err(|_| TiffError::LimitsExceeded)? + }; + + let buffer_size = row_samples .checked_mul(height) .and_then(|x| x.checked_mul(self.image().samples_per_pixel())) - { - Some(s) => s, - None => return Err(TiffError::LimitsExceeded), - }; + .ok_or(TiffError::LimitsExceeded)?; let max_sample_bits = self.image().bits_per_sample; match self.image().sample_format { diff --git a/tests/decode_images.rs b/tests/decode_images.rs index 77f48e9..1c769d0 100644 --- a/tests/decode_images.rs +++ b/tests/decode_images.rs @@ -216,6 +216,11 @@ fn issue_69() { //assert!(img_res.is_ok()); //} +#[test] +fn test_tiled_gray_i1() { + test_image_sum_u8("tiled-gray-i1.tif", ColorType::Gray(1), 30531); +} + #[test] fn test_tiled_rgb_u8() { test_image_sum_u8("tiled-rgb-u8.tif", ColorType::RGB(8), 39528948); diff --git a/tests/images/tiled-gray-i1.tif b/tests/images/tiled-gray-i1.tif new file mode 100644 index 0000000..d6305d4 Binary files /dev/null and b/tests/images/tiled-gray-i1.tif differ