use crate::backends::zopfli_pure::{compress, ZopfliFormat, ZopfliOptions};
use crate::cli::GzippyArgs;
#[derive(Clone, Debug)]
pub struct ZopfliTuning {
pub iterations: u32,
pub block_splitting: bool,
pub block_splitting_max: u32,
pub thread_budget: u32,
}
impl Default for ZopfliTuning {
fn default() -> Self {
Self {
iterations: 15,
block_splitting: true,
block_splitting_max: 15,
thread_budget: 0,
}
}
}
impl ZopfliTuning {
pub fn from_args(args: &GzippyArgs) -> Self {
Self {
iterations: args.zopfli_iterations.unwrap_or(15),
block_splitting: !args.zopfli_no_split,
block_splitting_max: args.zopfli_split_max.unwrap_or(15),
thread_budget: if args.processes <= 1 { 1 } else { 0 },
}
}
}
pub fn compress_deflate(data: &[u8], tuning: &ZopfliTuning) -> Vec<u8> {
compress(&tuning_to_options(tuning), ZopfliFormat::Deflate, data)
}
fn tuning_to_options(tuning: &ZopfliTuning) -> ZopfliOptions {
ZopfliOptions {
verbose: 0,
verbose_more: 0,
numiterations: tuning.iterations as i32,
blocksplitting: if tuning.block_splitting { 1 } else { 0 },
blocksplittingmax: tuning.block_splitting_max as i32,
thread_budget: tuning.thread_budget,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_compress_deflate_basic() {
let input = b"hello world";
let tuning = ZopfliTuning::default();
let output = compress_deflate(input, &tuning);
assert!(!output.is_empty());
assert!(output.len() < input.len() * 2); }
}