From 30f03678d2444babb2283f3bc44badd6ef144305 Mon Sep 17 00:00:00 2001 From: Joshua Holmer Date: Sun, 21 Feb 2016 23:27:19 -0500 Subject: [PATCH] Fix filtering, passes some more tests --- src/lib.rs | 3 ++- src/png.rs | 59 ++++++++++++++++++++++++++++++++---------------------- 2 files changed, 37 insertions(+), 25 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index f8bb4125..b9ba393f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -162,7 +162,8 @@ pub fn optimize(filepath: &Path, opts: &Options) -> Result<(), String> { if (best.is_some() && ok_result.4.len() < best.clone().unwrap().4.len()) || (best.is_none() && (ok_result.4.len() < png.idat_data.len() || - opts.interlace != Some(png.ihdr_data.interlaced) || + (opts.interlace.is_some() && + opts.interlace != Some(png.ihdr_data.interlaced)) || opts.force)) { best = Some(ok_result); } diff --git a/src/png.rs b/src/png.rs index f1173e90..8f763125 100644 --- a/src/png.rs +++ b/src/png.rs @@ -356,15 +356,16 @@ impl PngData { unfiltered.push(0); match line.filter { 0 => { - let mut data = line.data.clone(); - last_line = data.clone(); - unfiltered.append(&mut data); + unfiltered.extend_from_slice(&line.data); } 1 => { let mut data = Vec::with_capacity(line.data.len()); for (i, byte) in line.data.iter().enumerate() { match i.checked_sub(bpp as usize) { - Some(x) => data.push(byte.wrapping_add(line.data[x])), + Some(x) => { + let b = data[x]; + data.push(byte.wrapping_add(b)) + } None => data.push(*byte), } } @@ -387,17 +388,23 @@ impl PngData { let mut data = Vec::with_capacity(line.data.len()); for (i, byte) in line.data.iter().enumerate() { if !last_line.is_empty() { - data.push(match i.checked_sub(bpp as usize) { - Some(x) => byte.wrapping_add( - ((line.data[x] as u16 + last_line[i] as u16) >> 1) as u8 - ), - None => byte.wrapping_add(last_line[i] >> 1), - }); + match i.checked_sub(bpp as usize) { + Some(x) => { + let b = data[x]; + data.push(byte.wrapping_add( + ((b as u16 + last_line[i] as u16) >> 1) as u8 + )) + } + None => data.push(byte.wrapping_add(last_line[i] >> 1)), + }; } else { - data.push(match i.checked_sub(bpp as usize) { - Some(x) => byte.wrapping_add(line.data[x] >> 1), - None => *byte, - }); + match i.checked_sub(bpp as usize) { + Some(x) => { + let b = data[x]; + data.push(byte.wrapping_add(b >> 1)) + } + None => data.push(*byte), + }; }; } last_line = data.clone(); @@ -407,19 +414,23 @@ impl PngData { let mut data = Vec::with_capacity(line.data.len()); for (i, byte) in line.data.iter().enumerate() { if !last_line.is_empty() { - data.push(match i.checked_sub(bpp as usize) { + match i.checked_sub(bpp as usize) { Some(x) => { - byte.wrapping_add(paeth_predictor(line.data[x], - last_line[i], - last_line[x])) + let b = data[x]; + data.push(byte.wrapping_add(paeth_predictor(b, + last_line[i], + last_line[x]))) } - None => byte.wrapping_add(last_line[i]), - }); + None => data.push(byte.wrapping_add(last_line[i])), + }; } else { - data.push(match i.checked_sub(bpp as usize) { - Some(x) => byte.wrapping_add(line.data[x]), - None => *byte, - }); + match i.checked_sub(bpp as usize) { + Some(x) => { + let b = data[x]; + data.push(byte.wrapping_add(b)) + } + None => data.push(*byte), + }; }; } last_line = data.clone();