Fix decoding interlaced images with height or width <= 2 (#175)

This commit is contained in:
Felix Hanau 2019-06-27 18:44:34 +01:00 committed by Josh Holmer
parent c09e8f6d12
commit 56b94542a6
3 changed files with 33 additions and 7 deletions

View file

@ -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;

BIN
tests/files/issue-175.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 B

View file

@ -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,
);
}