diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b46e357..8ead3f13 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ ### Version 0.18.2 (unreleased) - Bump `image` to 0.18 + - Fix unfiltering of scan lines in interlaced images ([#92](https://github.com/shssoichiro/oxipng/issues/92)) ### Version 0.18.1 - Bump `rayon` to 0.9 diff --git a/src/png.rs b/src/png.rs index dd35046f..a6b8a6d2 100644 --- a/src/png.rs +++ b/src/png.rs @@ -377,7 +377,14 @@ impl PngData { 8f32) .ceil() as usize; let mut last_line: Vec = Vec::new(); + let mut last_pass = 1; for line in self.scan_lines() { + if let Some(pass) = line.pass { + if pass != last_pass { + last_line = Vec::new(); + last_pass = pass; + } + } let unfiltered_line = unfilter_line(line.filter, bpp, &line.data, &last_line); unfiltered.push(0); unfiltered.extend_from_slice(&unfiltered_line); diff --git a/tests/files/issue-92.png b/tests/files/issue-92.png new file mode 100644 index 00000000..e1b5f96c Binary files /dev/null and b/tests/files/issue-92.png differ diff --git a/tests/regression.rs b/tests/regression.rs index 02b5498c..77d91496 100644 --- a/tests/regression.rs +++ b/tests/regression.rs @@ -325,3 +325,41 @@ fn issue_89() { BitDepth::Eight, ); } + +#[test] +fn issue_92_filter_0() { + let input = PathBuf::from("tests/files/issue-92.png"); + let opts = get_opts(&input); + let output = opts.out_file.clone(); + + test_it_converts( + &input, + &output, + &opts, + ColorType::Grayscale, + BitDepth::Eight, + ColorType::Grayscale, + BitDepth::Eight, + ); +} + +#[test] +fn issue_92_filter_5() { + let input = PathBuf::from("tests/files/issue-92.png"); + let mut opts = get_opts(&input); + let mut filter = HashSet::new(); + filter.insert(5); + opts.filter = filter; + opts.out_file = input.with_extension("-f5-out.png").to_owned(); + let output = opts.out_file.clone(); + + test_it_converts( + &input, + &output, + &opts, + ColorType::Grayscale, + BitDepth::Eight, + ColorType::Grayscale, + BitDepth::Eight, + ); +}