diff --git a/CHANGELOG.md b/CHANGELOG.md index 5bfa9774..866a1b3e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +**Version 0.8.1 (unreleased)** + - Minor optimizations + **Version 0.8.0** - [SEMVER_MINOR] Add support for optimizing PNGs already loaded into memory via library function diff --git a/Cargo.lock b/Cargo.lock index 51d076b8..c189d88f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,13 +4,13 @@ version = "0.8.0" dependencies = [ "bit-vec 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "clap 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "clap 2.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "crc 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "image 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "image 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "libz-sys 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "miniz-sys 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", "regex 0.1.69 (registry+https://github.com/rust-lang/crates.io-index)", "scoped-pool 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -33,19 +33,14 @@ name = "bit-vec" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "bitflags" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "bitflags" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] -name = "byteorder" -version = "0.4.2" +name = "bitflags" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -55,7 +50,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "clap" -version = "2.4.0" +version = "2.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "ansi_term 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -66,11 +61,6 @@ dependencies = [ "vec_map 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "color_quant" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "crc" version = "1.2.0" @@ -84,14 +74,6 @@ name = "crossbeam" version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "deque" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "enum_primitive" version = "0.1.0" @@ -100,19 +82,9 @@ dependencies = [ "num 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "euclid" -version = "0.6.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "flate2" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "libc 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", @@ -124,15 +96,6 @@ name = "gcc" version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "gif" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "color_quant 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "lzw 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "glob" version = "0.2.11" @@ -140,16 +103,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "image" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "enum_primitive 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "gif 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "jpeg-decoder 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "num 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", - "png 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "num-iter 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", + "num-rational 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", + "png 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -157,23 +120,12 @@ name = "inflate" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "jpeg-decoder" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byteorder 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "euclid 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", - "num-rational 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", - "rayon 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "kernel32-sys" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "winapi 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -197,16 +149,6 @@ dependencies = [ "pkg-config 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "log" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "lzw" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "memchr" version = "0.1.11" @@ -229,11 +171,8 @@ name = "num" version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "num-bigint 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", - "num-complex 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", "num-integer 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", "num-iter 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", - "num-rational 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -248,15 +187,6 @@ dependencies = [ "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "num-complex" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "num-traits 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "num-integer" version = "0.1.32" @@ -292,7 +222,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "num_cpus" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "libc 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", @@ -305,11 +235,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "png" -version = "0.4.3" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bitflags 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "flate2 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "flate2 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", "inflate 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "num-iter 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", @@ -323,16 +253,6 @@ dependencies = [ "libc 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "rayon" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "deque 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "regex" version = "0.1.69" @@ -414,7 +334,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "winapi" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] diff --git a/Cargo.toml b/Cargo.toml index 2eaeb58d..1dfcf8af 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,5 +33,7 @@ num_cpus = "^0.2.11" regex = "^0.1.63" scoped-pool = "^0.1.8" -[dev-dependencies] -image = "^0.8.0" +[dev-dependencies.image] +version = "^0.10.0" +default-features = false +features = ["png_codec"] diff --git a/src/lib.rs b/src/lib.rs index 3d36930b..ed8454ea 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -163,7 +163,7 @@ pub fn optimize(filepath: &Path, opts: &Options) -> Result<(), String> { let in_file = Path::new(filepath); let original_size = in_file.metadata().unwrap().len() as usize; - let mut png = match png::PngData::new(&in_file, opts.fix_errors) { + let mut png = match png::PngData::new(in_file, opts.fix_errors) { Ok(x) => x, Err(x) => return Err(x), }; @@ -278,7 +278,7 @@ pub fn optimize_from_memory(data: &[u8], opts: &Options) -> Result, Stri writeln!(&mut stderr(), "Processing from memory").ok(); } let original_size = data.len() as usize; - let mut png = match png::PngData::from_slice(&data, opts.fix_errors) { + let mut png = match png::PngData::from_slice(data, opts.fix_errors) { Ok(x) => x, Err(x) => return Err(x), }; @@ -355,7 +355,7 @@ fn optimize_png(mut png: &mut png::PngData, file_original_size: usize, opts: &Op } } - let something_changed = perform_reductions(&mut png, &opts); + let something_changed = perform_reductions(&mut png, opts); if opts.idat_recoding || something_changed { let thread_count = opts.threads; @@ -434,7 +434,7 @@ fn optimize_png(mut png: &mut png::PngData, file_original_size: usize, opts: &Op } } - perform_strip(&mut png, &opts); + perform_strip(&mut png, opts); let output = png.output(); @@ -483,7 +483,7 @@ fn perform_reductions(png: &mut png::PngData, opts: &Options) -> bool { if png.reduce_palette() { something_changed = true; if opts.verbosity == Some(1) { - report_reduction(&png); + report_reduction(png); } }; } @@ -492,7 +492,7 @@ fn perform_reductions(png: &mut png::PngData, opts: &Options) -> bool { if png.reduce_bit_depth() { something_changed = true; if opts.verbosity == Some(1) { - report_reduction(&png); + report_reduction(png); } }; } @@ -501,13 +501,13 @@ fn perform_reductions(png: &mut png::PngData, opts: &Options) -> bool { if png.reduce_color_type() { something_changed = true; if opts.verbosity == Some(1) { - report_reduction(&png); + report_reduction(png); } }; } if something_changed && opts.verbosity.is_some() { - report_reduction(&png); + report_reduction(png); } if let Some(interlacing) = opts.interlace { diff --git a/src/png.rs b/src/png.rs index c3f0046a..752d7bf2 100644 --- a/src/png.rs +++ b/src/png.rs @@ -4,7 +4,7 @@ use crc::crc32; use std::collections::{HashMap, HashSet}; use std::fmt; use std::fs::File; -use std::io::{Cursor, Read, Write}; +use std::io::{Cursor, Read}; use std::iter::Iterator; use std::path::Path; @@ -408,7 +408,7 @@ impl PngData { for (key, header) in self.aux_headers.iter().filter(|&(ref key, _)| { !(**key == "bKGD" || **key == "hIST" || **key == "tRNS") }) { - write_png_block(&key.as_bytes(), &header, &mut output); + write_png_block(key.as_bytes(), header, &mut output); } // Palette if let Some(palette) = self.palette.clone() { @@ -425,7 +425,7 @@ impl PngData { for (key, header) in self.aux_headers.iter().filter(|&(ref key, _)| { **key == "bKGD" || **key == "hIST" || **key == "tRNS" }) { - write_png_block(&key.as_bytes(), &header, &mut output); + write_png_block(key.as_bytes(), header, &mut output); } // IDAT data write_png_block(b"IDAT", &self.idat_data, &mut output); @@ -437,7 +437,7 @@ impl PngData { /// Return an iterator over the scanlines of the image pub fn scan_lines(&self) -> ScanLines { ScanLines { - png: &self, + png: self, start: 0, end: 0, pass: None, @@ -711,14 +711,14 @@ impl PngData { let lower = *byte & 0b00001111; let mut new_byte = 0u8; if let Some(new_idx) = index_map.get(&upper) { - new_byte = new_byte & (*new_idx << 4); + new_byte &= *new_idx << 4; } else { - new_byte = new_byte & (upper << 4); + new_byte &= upper << 4; } if let Some(new_idx) = index_map.get(&lower) { - new_byte = new_byte & *new_idx; + new_byte &= *new_idx; } else { - new_byte = new_byte & lower; + new_byte &= lower; } new_data.push(new_byte); } @@ -731,24 +731,24 @@ impl PngData { let four = *byte & 0b00000011; let mut new_byte = 0u8; if let Some(new_idx) = index_map.get(&one) { - new_byte = new_byte & (*new_idx << 6); + new_byte &= *new_idx << 6; } else { - new_byte = new_byte & (one << 6); + new_byte &= one << 6; } if let Some(new_idx) = index_map.get(&two) { - new_byte = new_byte & (*new_idx << 4); + new_byte &= *new_idx << 4; } else { - new_byte = new_byte & (two << 4); + new_byte &= two << 4; } if let Some(new_idx) = index_map.get(&three) { - new_byte = new_byte & (*new_idx << 2); + new_byte &= *new_idx << 2; } else { - new_byte = new_byte & (three << 2); + new_byte &= three << 2; } if let Some(new_idx) = index_map.get(&four) { - new_byte = new_byte & *new_idx; + new_byte &= *new_idx; } else { - new_byte = new_byte & four; + new_byte &= four; } new_data.push(new_byte); } @@ -1401,7 +1401,7 @@ fn reduce_rgb_to_palette(png: &PngData) -> Option<(Vec, Vec)> { let mut color_palette = Vec::with_capacity(palette.len() * 3); for color in &palette { - color_palette.extend_from_slice(&color); + color_palette.extend_from_slice(color); } Some((reduced, color_palette)) @@ -1453,7 +1453,7 @@ fn reduce_grayscale_to_palette(png: &PngData) -> Option<(Vec, Vec)> { let mut color_palette = Vec::with_capacity(palette.len() * 3); for color in &palette { - color_palette.extend_from_slice(&color); + color_palette.extend_from_slice(color); } Some((reduced.to_bytes(), color_palette))