From 56b94542a69cabe8a1795bf26da679f829e61c0e Mon Sep 17 00:00:00 2001 From: Felix Hanau Date: Thu, 27 Jun 2019 18:44:34 +0100 Subject: [PATCH] Fix decoding interlaced images with height or width <= 2 (#175) --- src/png/scan_lines.rs | 28 +++++++++++++++++++++------- tests/files/issue-175.png | Bin 0 -> 71 bytes tests/regression.rs | 12 ++++++++++++ 3 files changed, 33 insertions(+), 7 deletions(-) create mode 100644 tests/files/issue-175.png diff --git a/src/png/scan_lines.rs b/src/png/scan_lines.rs index 38f98e0f..8cd7e1b9 100644 --- a/src/png/scan_lines.rs +++ b/src/png/scan_lines.rs @@ -97,6 +97,8 @@ impl Iterator for ScanLineRanges { let (pixels_per_line, current_pass) = if let Some(ref mut pass) = self.pass { // Scanlines for interlaced PNG files // Handle edge cases for images smaller than 5 pixels in either direction + // No extra case needed for skipping pass 7 as this is already handled by the + // self.left == 0 check above if self.width < 5 && pass.0 == 2 { pass.0 = 3; pass.1 = 4; @@ -106,13 +108,25 @@ impl Iterator for ScanLineRanges { pass.0 = 4; pass.1 = 0; } - let (pixels_factor, y_steps) = match pass { - (1, _) | (2, _) => (8, 8), - (3, _) => (4, 8), - (4, _) => (4, 4), - (5, _) => (2, 4), - (6, _) => (2, 2), - (7, _) => (1, 2), + if self.width < 3 && pass.0 == 4 { + pass.0 = 5; + pass.1 = 2; + } + if self.height < 3 && pass.0 == 5 { + pass.0 = 6; + pass.1 = 0; + } + if self.width == 1 && pass.0 == 6 { + pass.0 = 7; + pass.1 = 1; + } + let (pixels_factor, y_steps) = match pass.0 { + 1 | 2 => (8, 8), + 3 => (4, 8), + 4 => (4, 4), + 5 => (2, 4), + 6 => (2, 2), + 7 => (1, 2), _ => unreachable!(), }; let mut pixels_per_line = self.width / pixels_factor as u32; diff --git a/tests/files/issue-175.png b/tests/files/issue-175.png new file mode 100644 index 0000000000000000000000000000000000000000..10d480005ddd55a1220067a84a00d73a1c5af6a6 GIT binary patch literal 71 zcmeAS@N?(olHy`uVBq!ia0vp^Od!k%Bp7v1F~|dHK2I0N5RU7~83`E)77Pq5#~2U# TTM3;3$}o7k`njxgN@xNAnO_bW literal 0 HcmV?d00001 diff --git a/tests/regression.rs b/tests/regression.rs index 1b20edee..a5d8bd39 100644 --- a/tests/regression.rs +++ b/tests/regression.rs @@ -623,3 +623,15 @@ fn issue_171() { BitDepth::Eight, ); } + +#[test] +fn issue_175() { + test_it_converts( + "tests/files/issue-175.png", + None, + ColorType::Grayscale, + BitDepth::One, + ColorType::Grayscale, + BitDepth::One, + ); +} \ No newline at end of file