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 00000000..10d48000 Binary files /dev/null and b/tests/files/issue-175.png differ 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