diff --git a/src/lib.rs b/src/lib.rs index d81c1d16..f8bb4125 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -159,8 +159,11 @@ pub fn optimize(filepath: &Path, opts: &Options) -> Result<(), String> { for result in results { if let Ok(ok_result) = result.join() { - if ok_result.4.len() < png.idat_data.len() || - (best.is_none() && something_changed) { + 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.force)) { best = Some(ok_result); } } @@ -242,12 +245,14 @@ pub fn optimize(filepath: &Path, opts: &Options) -> Result<(), String> { println!(" file size = {} bytes ({} bytes = {:.2}% decrease)", output_data.len(), file_original_size - output_data.len(), - (file_original_size - output_data.len()) as f64 / file_original_size as f64 * 100f64); + (file_original_size - output_data.len()) as f64 / file_original_size as f64 * + 100f64); } else { println!(" file size = {} bytes ({} bytes = {:.2}% increase)", output_data.len(), output_data.len() - file_original_size, - (output_data.len() - file_original_size) as f64 / file_original_size as f64 * 100f64); + (output_data.len() - file_original_size) as f64 / file_original_size as f64 * + 100f64); } Ok(()) diff --git a/src/png.rs b/src/png.rs index 2aace7fb..f1173e90 100644 --- a/src/png.rs +++ b/src/png.rs @@ -263,7 +263,9 @@ impl PngData { output.append(&mut ihdr_data); output.write_u32::(crc).ok(); // Ancillary headers - for (key, header) in self.aux_headers.iter().filter(|&(ref key, _)| !(**key == "bKGD" || **key == "hIST" || **key == "tRNS")) { + for (key, header) in self.aux_headers.iter().filter(|&(ref key, _)| { + !(**key == "bKGD" || **key == "hIST" || **key == "tRNS") + }) { let mut header_data = Vec::with_capacity(header.len() + 4); header_data.extend(key.as_bytes()); header_data.extend_from_slice(header); @@ -306,7 +308,9 @@ impl PngData { output.write_u32::(crc).ok(); } // Special ancillary headers that need to come after PLTE but before IDAT - for (key, header) in self.aux_headers.iter().filter(|&(ref key, _)| **key == "bKGD" || **key == "hIST" || **key == "tRNS") { + for (key, header) in self.aux_headers.iter().filter(|&(ref key, _)| { + **key == "bKGD" || **key == "hIST" || **key == "tRNS" + }) { let mut header_data = Vec::with_capacity(header.len() + 4); header_data.extend(key.as_bytes()); header_data.extend_from_slice(header); diff --git a/tests/oxipng.rs b/tests/oxipng.rs index 0e6118a7..dbc4d08a 100644 --- a/tests/oxipng.rs +++ b/tests/oxipng.rs @@ -12,7 +12,6 @@ use std::path::PathBuf; fn get_opts(input: &Path) -> oxipng::Options { let mut filter = HashSet::new(); filter.insert(0); - filter.insert(5); let mut compression = HashSet::new(); compression.insert(9); let mut memory = HashSet::new();