Correctly save best run

Fixes #10
This commit is contained in:
Joshua Holmer 2016-02-20 14:49:33 -05:00
parent 9d48ae911e
commit 675a28ee32
3 changed files with 15 additions and 7 deletions

View file

@ -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(())

View file

@ -263,7 +263,9 @@ impl PngData {
output.append(&mut ihdr_data);
output.write_u32::<BigEndian>(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::<BigEndian>(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);

View file

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