From 70f911fa3e4e9d15a77766a330f1d7e6fab7ea86 Mon Sep 17 00:00:00 2001 From: Anhil <53266103+Anhil-111@users.noreply.github.com> Date: Mon, 2 Nov 2020 04:18:15 +0300 Subject: [PATCH] Make `libdeflater` and `zopfli` optional (#319) * Make `libdeflater` and `zopfli` optional --- Cargo.toml | 6 +++--- src/deflate/mod.rs | 8 +++++++- src/lib.rs | 7 +++++++ 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 7cde6ea1..a5701ccf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,11 +33,11 @@ bit-vec = "^0.6.2" byteorder = "^1.0.0" crc = "^1.2.0" itertools = "^0.9.0" -zopfli = "^0.4.0" +zopfli = { version = "^0.4.0", optional = true } miniz_oxide = "0.4" rgb = "0.8.25" indexmap = { version = "1.6.0", features = ["rayon"] } -libdeflater = "0.5.0" +libdeflater = { version = "0.5.0", optional = true } log = "0.4.11" stderrlog = { version = "0.5.0", optional = true } @@ -71,7 +71,7 @@ binary = [ "wild", "stderrlog", ] -default = ["binary", "parallel"] +default = ["binary", "parallel", "libdeflater", "zopfli"] parallel = ["rayon"] [lib] diff --git a/src/deflate/mod.rs b/src/deflate/mod.rs index d64b958b..69879901 100644 --- a/src/deflate/mod.rs +++ b/src/deflate/mod.rs @@ -3,12 +3,13 @@ use crate::error::PngError; use crate::Deadline; use crate::PngResult; use indexmap::IndexSet; -use std::cmp::max; #[doc(hidden)] pub mod miniz_stream; +#[cfg(feature = "libdeflater")] mod deflater; +#[cfg(feature = "libdeflater")] pub use deflater::deflate as libdeflater_deflate; #[cfg(any(target_arch = "x86_64", target_arch = "aarch64"))] @@ -47,7 +48,10 @@ pub fn deflate( miniz_stream::compress_to_vec_oxipng(data, zc, zw.into(), zs.into(), max_size, deadline) } +#[cfg(feature = "zopfli")] pub fn zopfli_deflate(data: &[u8]) -> PngResult> { + use std::cmp::max; + let mut output = Vec::with_capacity(max(1024, data.len() / 20)); let options = zopfli::Options::default(); match zopfli::compress(&options, &zopfli::Format::Zlib, data, &mut output) { @@ -79,8 +83,10 @@ pub enum Deflaters { /// Default: `15` window: u8, }, + #[cfg(feature = "zopfli")] /// Use the better but slower Zopfli implementation Zopfli, + #[cfg(feature = "libdeflater")] /// Use libdeflater. Libdeflater, } diff --git a/src/lib.rs b/src/lib.rs index d988e471..081d1a60 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -12,6 +12,11 @@ #![warn(clippy::path_buf_push_overwrite)] #![warn(clippy::range_plus_one)] #![allow(clippy::cognitive_complexity)] +#![cfg_attr( + not(any(feature = "libdeflater", feature = "zopfli")), + allow(irrefutable_let_patterns), + allow(unreachable_patterns) +)] #[cfg(feature = "parallel")] extern crate rayon; @@ -569,7 +574,9 @@ fn optimize_png( &best_size, &deadline, ), + #[cfg(feature = "zopfli")] Deflaters::Zopfli => deflate::zopfli_deflate(filtered), + #[cfg(feature = "libdeflater")] Deflaters::Libdeflater => deflate::libdeflater_deflate(filtered, &best_size), };