Enum for stdout writing flag (#110)

This commit is contained in:
Kornel 2018-07-10 23:41:06 +01:00 committed by Josh Holmer
parent ae65e4be8d
commit 55a095d536
11 changed files with 386 additions and 599 deletions

View file

@ -11,7 +11,7 @@ matrix:
env: TARGET=x86_64-apple-darwin
cache: cargo
- os: linux
rust: 1.21.0
rust: 1.24.0
env: TARGET=x86_64-unknown-linux-gnu
cache: cargo
- os: linux

View file

@ -26,7 +26,7 @@ cargo build --release
cp target/release/oxipng /usr/local/bin
```
The current minimum supported Rust version is **1.20.0**. Oxipng may compile on earlier versions of Rust,
The current minimum supported Rust version is **1.24.0**. Oxipng may compile on earlier versions of Rust,
but there is no guarantee.
Oxipng follows Semantic Versioning.

View file

@ -26,7 +26,7 @@ cargo build --release
cp target/release/oxipng /usr/local/bin
```
The current minimum supported Rust version is **1.20.0**. Oxipng may compile on earlier versions of Rust,
The current minimum supported Rust version is **1.24.0**. Oxipng may compile on earlier versions of Rust,
but there is no guarantee.
Oxipng follows Semantic Versioning.

View file

@ -44,6 +44,22 @@ pub mod png;
mod reduction;
mod atomicmin;
#[derive(Clone, Debug)]
pub enum OutFile {
/// Path(None) means same as input
Path(Option<PathBuf>),
StdOut,
}
impl OutFile {
pub fn path(&self) -> Option<&Path> {
match *self {
OutFile::Path(Some(ref p)) => Some(p.as_path()),
_ => None,
}
}
}
#[derive(Clone, Debug)]
/// Options controlling the output of the `optimize` function
pub struct Options {
@ -51,16 +67,6 @@ pub struct Options {
///
/// Default: `false`
pub backup: bool,
/// Path to write the output file to. If not set, the application will default to
/// overwriting the input file.
pub out_file: Option<PathBuf>,
/// Used only in CLI interface
#[doc(hidden)]
pub out_dir: Option<PathBuf>,
/// Write to stdout instead of a file.
///
/// Default: `false`
pub stdout: bool,
/// Attempt to fix errors when decoding the input file rather than returning an `Err`.
///
/// Default: `false`
@ -247,9 +253,6 @@ impl Default for Options {
Options {
backup: false,
out_file: None,
out_dir: None,
stdout: false,
pretend: false,
recursive: false,
fix_errors: false,
@ -277,7 +280,7 @@ impl Default for Options {
}
/// Perform optimization on the input file using the options provided
pub fn optimize(input_path: &Path, opts: &Options) -> Result<(), PngError> {
pub fn optimize(input_path: &Path, output: &OutFile, opts: &Options) -> Result<(), PngError> {
// Initialize the thread pool with correct number of threads
#[cfg(feature = "parallel")]
let thread_count = opts.threads;
@ -293,19 +296,20 @@ pub fn optimize(input_path: &Path, opts: &Options) -> Result<(), PngError> {
let in_data = PngData::read_file(input_path)?;
let mut png = PngData::from_slice(&in_data, opts.fix_errors)?;
let output_path = opts.out_file
.clone()
.unwrap_or_else(|| input_path.to_path_buf());
// Run the optimizer on the decoded PNG.
let mut optimized_output = optimize_png(&mut png, &in_data, opts)?;
if is_fully_optimized(in_data.len(), optimized_output.len(), opts) {
eprintln!("File already optimized");
if input_path == output_path {
return Ok(());
} else {
optimized_output = in_data;
match *output {
// if p is None, it also means same as the input path
OutFile::Path(ref p) if p.as_ref().map_or(true, |p| p == input_path) => {
return Ok(());
},
_ => {
optimized_output = in_data;
}
}
}
@ -313,45 +317,35 @@ pub fn optimize(input_path: &Path, opts: &Options) -> Result<(), PngError> {
if opts.verbosity.is_some() {
eprintln!("Running in pretend mode, no output");
}
} else {
if opts.backup {
perform_backup(input_path)?;
}
return Ok(());
}
if opts.stdout {
match *output {
OutFile::StdOut => {
let mut buffer = BufWriter::new(stdout());
match buffer.write_all(&optimized_output) {
Ok(_) => (),
Err(_) => return Err(PngError::new("Unable to write to stdout")),
buffer.write_all(&optimized_output)
.map_err(|e| PngError::new(&format!("Unable to write to stdout: {}", e)))?;
},
OutFile::Path(ref output_path) => {
let output_path = output_path.as_ref().map(|p| p.as_path()).unwrap_or(input_path);
if opts.backup {
perform_backup(output_path)?;
}
} else {
let out_file = match File::create(&output_path) {
Ok(x) => x,
Err(_) => {
return Err(PngError::new(&format!(
"Unable to write to file {}",
output_path.display()
)))
}
};
let out_file = File::create(output_path)
.map_err(|err| PngError::new(&format!(
"Unable to write to file {}: {}", output_path.display(), err
)))?;
if opts.preserve_attrs {
copy_permissions(input_path, &out_file, opts.verbosity);
}
let mut buffer = BufWriter::new(out_file);
match buffer.write_all(&optimized_output) {
Ok(_) => if opts.verbosity.is_some() {
eprintln!("Output: {}", output_path.display());
},
Err(_) => {
return Err(PngError::new(&format!(
"Unable to write to file {}",
output_path.display()
)))
}
buffer.write_all(&optimized_output)
.map_err(|e| PngError::new(&format!("Unable to write to {}: {}", output_path.display(), e)))?;
if opts.verbosity.is_some() {
eprintln!("Output: {}", output_path.display());
}
}
},
}
Ok(())
}

View file

@ -15,6 +15,7 @@ use clap::{App, Arg, ArgMatches};
use oxipng::AlphaOptim;
use oxipng::Deflaters;
use oxipng::Headers;
use oxipng::OutFile;
use oxipng::{Options, PngError};
use std::collections::HashSet;
use std::fs::DirBuilder;
@ -209,7 +210,7 @@ fn main() {
regardless of the order you write the arguments.")
.get_matches_from(wild::args());
let opts = match parse_opts_into_struct(&matches) {
let (out_file, out_dir, opts) = match parse_opts_into_struct(&matches) {
Ok(x) => x,
Err(x) => {
eprintln!("{}", x);
@ -217,45 +218,47 @@ fn main() {
}
};
if let Err(e) = handle_optimization(
matches.values_of("files").unwrap()
.map(PathBuf::from).collect(),
&opts,
) {
let files = collect_files(matches.values_of("files").unwrap()
.map(PathBuf::from).collect(), &out_dir, &out_file, opts.recursive);
let res: Result<(), PngError> = files.into_iter().map(|(input, output)| {
oxipng::optimize(&input, &output, &opts)
}).collect();
if let Err(e) = res {
eprintln!("{}", e);
exit(1);
}
}
fn handle_optimization(inputs: Vec<PathBuf>, opts: &Options) -> Result<(), PngError> {
inputs.into_iter().fold(Ok(()), |res, input| {
let mut current_opts = opts.clone();
fn collect_files(files: Vec<PathBuf>, out_dir: &Option<PathBuf>, out_file: &OutFile, recursive: bool) -> Vec<(PathBuf, OutFile)> {
let mut out = Vec::new();
for input in files {
if input.is_dir() {
if current_opts.recursive {
let cur_result = handle_optimization(
input
.read_dir()
.unwrap()
.map(|x| x.unwrap().path())
.collect(),
&current_opts,
);
return res.and(cur_result);
if recursive {
let files = input
.read_dir()
.unwrap()
.map(|x| x.unwrap().path().to_owned())
.collect();
out.extend(collect_files(files, out_dir, out_file, recursive));
} else {
eprintln!("{} is a directory, skipping", input.display());
}
return res;
} else {
out.push(if let Some(ref out_dir) = *out_dir {
let out_path = Some(out_dir.join(input.file_name().unwrap()));
(input, OutFile::Path(out_path))
} else {
(input, (*out_file).clone())
});
}
if let Some(ref out_dir) = current_opts.out_dir {
current_opts.out_file = Some(out_dir.join(input.file_name().unwrap()));
}
let cur_result = oxipng::optimize(&input, &current_opts);
res.and(cur_result)
})
}
out
}
#[cfg_attr(feature = "clippy", allow(cyclomatic_complexity))]
fn parse_opts_into_struct(matches: &ArgMatches) -> Result<Options, String> {
fn parse_opts_into_struct(matches: &ArgMatches) -> Result<(OutFile, Option<PathBuf>, Options), String> {
let mut opts = if let Some(x) = matches.value_of("optimization") {
if let Ok(opt) = x.parse::<u8>() {
Options::from_preset(opt)
@ -294,7 +297,7 @@ fn parse_opts_into_struct(matches: &ArgMatches) -> Result<Options, String> {
_ => (),
}
if let Some(x) = matches.value_of("output_dir") {
let out_dir = if let Some(x) = matches.value_of("output_dir") {
let path = PathBuf::from(x);
if !path.exists() {
match DirBuilder::new().recursive(true).create(&path) {
@ -307,16 +310,18 @@ fn parse_opts_into_struct(matches: &ArgMatches) -> Result<Options, String> {
x
));
}
opts.out_dir = Some(path);
}
Some(path)
} else {
None
};
if let Some(x) = matches.value_of("output_file") {
opts.out_file = Some(PathBuf::from(x));
}
if matches.is_present("stdout") {
opts.stdout = true;
}
let out_file = if matches.is_present("stdout") {
OutFile::StdOut
} else if let Some(x) = matches.value_of("output_file") {
OutFile::Path(Some(PathBuf::from(x)))
} else {
OutFile::Path(None)
};
if matches.is_present("alpha") {
opts.alphas.insert(AlphaOptim::White);
@ -422,7 +427,7 @@ fn parse_opts_into_struct(matches: &ArgMatches) -> Result<Options, String> {
opts.threads = x.parse::<usize>().unwrap();
}
Ok(opts)
Ok((out_file, out_dir, opts))
}
fn parse_numeric_range_opts(

View file

@ -2,26 +2,26 @@ extern crate oxipng;
use oxipng::colors::{BitDepth, ColorType};
use oxipng::png;
use oxipng::OutFile;
use std::collections::HashSet;
use std::fs::remove_file;
use std::path::Path;
use std::path::PathBuf;
fn get_opts(input: &Path) -> oxipng::Options {
fn get_opts(input: &Path) -> (OutFile, oxipng::Options) {
let mut options = oxipng::Options::default();
options.out_file = Some(input.with_extension("out.png").to_owned());
options.verbosity = None;
options.force = true;
let mut filter = HashSet::new();
filter.insert(0);
options.filter = filter;
options
(OutFile::Path(Some(input.with_extension("out.png").to_owned())), options)
}
fn test_it_converts(
input: &Path,
output: &Path,
output: &OutFile,
opts: &oxipng::Options,
color_type_in: ColorType,
bit_depth_in: BitDepth,
@ -33,10 +33,11 @@ fn test_it_converts(
assert_eq!(png.ihdr_data.color_type, color_type_in);
assert_eq!(png.ihdr_data.bit_depth, bit_depth_in);
match oxipng::optimize(input, opts) {
match oxipng::optimize(input, output, opts) {
Ok(_) => (),
Err(x) => panic!("{}", x),
};
let output = output.path().unwrap();
assert!(output.exists());
let png = match png::PngData::new(output, opts.fix_errors) {
@ -56,10 +57,9 @@ fn test_it_converts(
#[test]
fn filter_0_for_rgba_16() {
let input = PathBuf::from("tests/files/filter_0_for_rgba_16.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(0);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -75,10 +75,9 @@ fn filter_0_for_rgba_16() {
#[test]
fn filter_1_for_rgba_16() {
let input = PathBuf::from("tests/files/filter_1_for_rgba_16.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(1);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -94,10 +93,9 @@ fn filter_1_for_rgba_16() {
#[test]
fn filter_2_for_rgba_16() {
let input = PathBuf::from("tests/files/filter_2_for_rgba_16.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(2);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -113,10 +111,9 @@ fn filter_2_for_rgba_16() {
#[test]
fn filter_3_for_rgba_16() {
let input = PathBuf::from("tests/files/filter_3_for_rgba_16.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(3);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -132,10 +129,9 @@ fn filter_3_for_rgba_16() {
#[test]
fn filter_4_for_rgba_16() {
let input = PathBuf::from("tests/files/filter_4_for_rgba_16.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(4);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -151,10 +147,9 @@ fn filter_4_for_rgba_16() {
#[test]
fn filter_5_for_rgba_16() {
let input = PathBuf::from("tests/files/filter_5_for_rgba_16.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(5);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -170,10 +165,9 @@ fn filter_5_for_rgba_16() {
#[test]
fn filter_0_for_rgba_8() {
let input = PathBuf::from("tests/files/filter_0_for_rgba_8.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(0);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -189,10 +183,9 @@ fn filter_0_for_rgba_8() {
#[test]
fn filter_1_for_rgba_8() {
let input = PathBuf::from("tests/files/filter_1_for_rgba_8.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(1);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -208,10 +201,9 @@ fn filter_1_for_rgba_8() {
#[test]
fn filter_2_for_rgba_8() {
let input = PathBuf::from("tests/files/filter_2_for_rgba_8.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(2);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -227,10 +219,9 @@ fn filter_2_for_rgba_8() {
#[test]
fn filter_3_for_rgba_8() {
let input = PathBuf::from("tests/files/filter_3_for_rgba_8.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(3);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -246,10 +237,9 @@ fn filter_3_for_rgba_8() {
#[test]
fn filter_4_for_rgba_8() {
let input = PathBuf::from("tests/files/filter_4_for_rgba_8.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(4);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -265,10 +255,9 @@ fn filter_4_for_rgba_8() {
#[test]
fn filter_5_for_rgba_8() {
let input = PathBuf::from("tests/files/filter_5_for_rgba_8.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(5);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -284,10 +273,9 @@ fn filter_5_for_rgba_8() {
#[test]
fn filter_0_for_rgb_16() {
let input = PathBuf::from("tests/files/filter_0_for_rgb_16.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(0);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -303,10 +291,9 @@ fn filter_0_for_rgb_16() {
#[test]
fn filter_1_for_rgb_16() {
let input = PathBuf::from("tests/files/filter_1_for_rgb_16.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(1);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -322,10 +309,9 @@ fn filter_1_for_rgb_16() {
#[test]
fn filter_2_for_rgb_16() {
let input = PathBuf::from("tests/files/filter_2_for_rgb_16.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(2);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -341,10 +327,9 @@ fn filter_2_for_rgb_16() {
#[test]
fn filter_3_for_rgb_16() {
let input = PathBuf::from("tests/files/filter_3_for_rgb_16.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(3);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -360,10 +345,9 @@ fn filter_3_for_rgb_16() {
#[test]
fn filter_4_for_rgb_16() {
let input = PathBuf::from("tests/files/filter_4_for_rgb_16.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(4);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -379,10 +363,9 @@ fn filter_4_for_rgb_16() {
#[test]
fn filter_5_for_rgb_16() {
let input = PathBuf::from("tests/files/filter_5_for_rgb_16.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(5);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -398,10 +381,9 @@ fn filter_5_for_rgb_16() {
#[test]
fn filter_0_for_rgb_8() {
let input = PathBuf::from("tests/files/filter_0_for_rgb_8.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(0);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -417,10 +399,9 @@ fn filter_0_for_rgb_8() {
#[test]
fn filter_1_for_rgb_8() {
let input = PathBuf::from("tests/files/filter_1_for_rgb_8.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(1);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -436,10 +417,9 @@ fn filter_1_for_rgb_8() {
#[test]
fn filter_2_for_rgb_8() {
let input = PathBuf::from("tests/files/filter_2_for_rgb_8.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(2);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -455,10 +435,9 @@ fn filter_2_for_rgb_8() {
#[test]
fn filter_3_for_rgb_8() {
let input = PathBuf::from("tests/files/filter_3_for_rgb_8.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(3);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -474,10 +453,9 @@ fn filter_3_for_rgb_8() {
#[test]
fn filter_4_for_rgb_8() {
let input = PathBuf::from("tests/files/filter_4_for_rgb_8.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(4);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -493,10 +471,9 @@ fn filter_4_for_rgb_8() {
#[test]
fn filter_5_for_rgb_8() {
let input = PathBuf::from("tests/files/filter_5_for_rgb_8.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(5);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -512,10 +489,9 @@ fn filter_5_for_rgb_8() {
#[test]
fn filter_0_for_grayscale_alpha_16() {
let input = PathBuf::from("tests/files/filter_0_for_grayscale_alpha_16.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(0);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -531,10 +507,9 @@ fn filter_0_for_grayscale_alpha_16() {
#[test]
fn filter_1_for_grayscale_alpha_16() {
let input = PathBuf::from("tests/files/filter_1_for_grayscale_alpha_16.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(1);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -550,10 +525,9 @@ fn filter_1_for_grayscale_alpha_16() {
#[test]
fn filter_2_for_grayscale_alpha_16() {
let input = PathBuf::from("tests/files/filter_2_for_grayscale_alpha_16.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(2);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -569,10 +543,9 @@ fn filter_2_for_grayscale_alpha_16() {
#[test]
fn filter_3_for_grayscale_alpha_16() {
let input = PathBuf::from("tests/files/filter_3_for_grayscale_alpha_16.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(3);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -588,10 +561,9 @@ fn filter_3_for_grayscale_alpha_16() {
#[test]
fn filter_4_for_grayscale_alpha_16() {
let input = PathBuf::from("tests/files/filter_4_for_grayscale_alpha_16.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(4);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -607,10 +579,9 @@ fn filter_4_for_grayscale_alpha_16() {
#[test]
fn filter_5_for_grayscale_alpha_16() {
let input = PathBuf::from("tests/files/filter_5_for_grayscale_alpha_16.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(5);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -626,10 +597,9 @@ fn filter_5_for_grayscale_alpha_16() {
#[test]
fn filter_0_for_grayscale_alpha_8() {
let input = PathBuf::from("tests/files/filter_0_for_grayscale_alpha_8.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(0);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -645,10 +615,9 @@ fn filter_0_for_grayscale_alpha_8() {
#[test]
fn filter_1_for_grayscale_alpha_8() {
let input = PathBuf::from("tests/files/filter_1_for_grayscale_alpha_8.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(1);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -664,10 +633,9 @@ fn filter_1_for_grayscale_alpha_8() {
#[test]
fn filter_2_for_grayscale_alpha_8() {
let input = PathBuf::from("tests/files/filter_2_for_grayscale_alpha_8.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(2);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -683,10 +651,9 @@ fn filter_2_for_grayscale_alpha_8() {
#[test]
fn filter_3_for_grayscale_alpha_8() {
let input = PathBuf::from("tests/files/filter_3_for_grayscale_alpha_8.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(3);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -702,10 +669,9 @@ fn filter_3_for_grayscale_alpha_8() {
#[test]
fn filter_4_for_grayscale_alpha_8() {
let input = PathBuf::from("tests/files/filter_4_for_grayscale_alpha_8.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(4);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -721,10 +687,9 @@ fn filter_4_for_grayscale_alpha_8() {
#[test]
fn filter_5_for_grayscale_alpha_8() {
let input = PathBuf::from("tests/files/filter_5_for_grayscale_alpha_8.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(5);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -740,10 +705,9 @@ fn filter_5_for_grayscale_alpha_8() {
#[test]
fn filter_0_for_grayscale_16() {
let input = PathBuf::from("tests/files/filter_0_for_grayscale_16.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(0);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -759,10 +723,9 @@ fn filter_0_for_grayscale_16() {
#[test]
fn filter_1_for_grayscale_16() {
let input = PathBuf::from("tests/files/filter_1_for_grayscale_16.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(1);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -778,10 +741,9 @@ fn filter_1_for_grayscale_16() {
#[test]
fn filter_2_for_grayscale_16() {
let input = PathBuf::from("tests/files/filter_2_for_grayscale_16.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(2);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -797,10 +759,9 @@ fn filter_2_for_grayscale_16() {
#[test]
fn filter_3_for_grayscale_16() {
let input = PathBuf::from("tests/files/filter_3_for_grayscale_16.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(3);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -816,10 +777,9 @@ fn filter_3_for_grayscale_16() {
#[test]
fn filter_4_for_grayscale_16() {
let input = PathBuf::from("tests/files/filter_4_for_grayscale_16.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(4);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -835,10 +795,9 @@ fn filter_4_for_grayscale_16() {
#[test]
fn filter_5_for_grayscale_16() {
let input = PathBuf::from("tests/files/filter_5_for_grayscale_16.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(5);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -854,10 +813,9 @@ fn filter_5_for_grayscale_16() {
#[test]
fn filter_0_for_grayscale_8() {
let input = PathBuf::from("tests/files/filter_0_for_grayscale_8.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(0);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -873,10 +831,9 @@ fn filter_0_for_grayscale_8() {
#[test]
fn filter_1_for_grayscale_8() {
let input = PathBuf::from("tests/files/filter_1_for_grayscale_8.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(1);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -892,10 +849,9 @@ fn filter_1_for_grayscale_8() {
#[test]
fn filter_2_for_grayscale_8() {
let input = PathBuf::from("tests/files/filter_2_for_grayscale_8.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(2);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -911,10 +867,9 @@ fn filter_2_for_grayscale_8() {
#[test]
fn filter_3_for_grayscale_8() {
let input = PathBuf::from("tests/files/filter_3_for_grayscale_8.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(3);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -930,10 +885,9 @@ fn filter_3_for_grayscale_8() {
#[test]
fn filter_4_for_grayscale_8() {
let input = PathBuf::from("tests/files/filter_4_for_grayscale_8.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(4);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -949,10 +903,9 @@ fn filter_4_for_grayscale_8() {
#[test]
fn filter_5_for_grayscale_8() {
let input = PathBuf::from("tests/files/filter_5_for_grayscale_8.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(5);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -968,10 +921,9 @@ fn filter_5_for_grayscale_8() {
#[test]
fn filter_0_for_palette_4() {
let input = PathBuf::from("tests/files/filter_0_for_palette_4.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(0);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -987,10 +939,9 @@ fn filter_0_for_palette_4() {
#[test]
fn filter_1_for_palette_4() {
let input = PathBuf::from("tests/files/filter_1_for_palette_4.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(1);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -1006,10 +957,9 @@ fn filter_1_for_palette_4() {
#[test]
fn filter_2_for_palette_4() {
let input = PathBuf::from("tests/files/filter_2_for_palette_4.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(2);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -1025,10 +975,9 @@ fn filter_2_for_palette_4() {
#[test]
fn filter_3_for_palette_4() {
let input = PathBuf::from("tests/files/filter_3_for_palette_4.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(3);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -1044,10 +993,9 @@ fn filter_3_for_palette_4() {
#[test]
fn filter_4_for_palette_4() {
let input = PathBuf::from("tests/files/filter_4_for_palette_4.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(4);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -1063,10 +1011,9 @@ fn filter_4_for_palette_4() {
#[test]
fn filter_5_for_palette_4() {
let input = PathBuf::from("tests/files/filter_5_for_palette_4.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(5);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -1082,10 +1029,9 @@ fn filter_5_for_palette_4() {
#[test]
fn filter_0_for_palette_2() {
let input = PathBuf::from("tests/files/filter_0_for_palette_2.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(0);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -1101,10 +1047,9 @@ fn filter_0_for_palette_2() {
#[test]
fn filter_1_for_palette_2() {
let input = PathBuf::from("tests/files/filter_1_for_palette_2.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(1);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -1120,10 +1065,9 @@ fn filter_1_for_palette_2() {
#[test]
fn filter_2_for_palette_2() {
let input = PathBuf::from("tests/files/filter_2_for_palette_2.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(2);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -1139,10 +1083,9 @@ fn filter_2_for_palette_2() {
#[test]
fn filter_3_for_palette_2() {
let input = PathBuf::from("tests/files/filter_3_for_palette_2.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(3);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -1158,10 +1101,9 @@ fn filter_3_for_palette_2() {
#[test]
fn filter_4_for_palette_2() {
let input = PathBuf::from("tests/files/filter_4_for_palette_2.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(4);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -1177,10 +1119,9 @@ fn filter_4_for_palette_2() {
#[test]
fn filter_5_for_palette_2() {
let input = PathBuf::from("tests/files/filter_5_for_palette_2.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(5);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -1196,10 +1137,9 @@ fn filter_5_for_palette_2() {
#[test]
fn filter_0_for_palette_1() {
let input = PathBuf::from("tests/files/filter_0_for_palette_1.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(0);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -1215,10 +1155,9 @@ fn filter_0_for_palette_1() {
#[test]
fn filter_1_for_palette_1() {
let input = PathBuf::from("tests/files/filter_1_for_palette_1.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(1);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -1234,10 +1173,9 @@ fn filter_1_for_palette_1() {
#[test]
fn filter_2_for_palette_1() {
let input = PathBuf::from("tests/files/filter_2_for_palette_1.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(2);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -1253,10 +1191,9 @@ fn filter_2_for_palette_1() {
#[test]
fn filter_3_for_palette_1() {
let input = PathBuf::from("tests/files/filter_3_for_palette_1.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(3);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -1272,10 +1209,9 @@ fn filter_3_for_palette_1() {
#[test]
fn filter_4_for_palette_1() {
let input = PathBuf::from("tests/files/filter_4_for_palette_1.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(4);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -1291,10 +1227,9 @@ fn filter_4_for_palette_1() {
#[test]
fn filter_5_for_palette_1() {
let input = PathBuf::from("tests/files/filter_5_for_palette_1.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.filter = HashSet::new();
opts.filter.insert(5);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,

View file

@ -1,5 +1,6 @@
extern crate oxipng;
use oxipng::OutFile;
use oxipng::colors::{BitDepth, ColorType};
use oxipng::deflate::Deflaters;
use oxipng::headers::Headers;
@ -9,21 +10,20 @@ use std::fs::remove_file;
use std::path::Path;
use std::path::PathBuf;
fn get_opts(input: &Path) -> oxipng::Options {
fn get_opts(input: &Path) -> (OutFile, oxipng::Options) {
let mut options = oxipng::Options::default();
options.out_file = Some(input.with_extension("out.png").to_owned());
options.verbosity = None;
options.force = true;
let mut filter = HashSet::new();
filter.insert(0);
options.filter = filter;
options
(OutFile::Path(Some(input.with_extension("out.png").to_owned())), options)
}
fn test_it_converts(
input: &Path,
output: &Path,
output: &OutFile,
opts: &oxipng::Options,
color_type_in: ColorType,
bit_depth_in: BitDepth,
@ -35,10 +35,11 @@ fn test_it_converts(
assert_eq!(png.ihdr_data.color_type, color_type_in);
assert_eq!(png.ihdr_data.bit_depth, bit_depth_in);
match oxipng::optimize(input, opts) {
match oxipng::optimize(input, output, opts) {
Ok(_) => (),
Err(x) => panic!("{}", x),
};
let output = output.path().unwrap();
assert!(output.exists());
let png = match png::PngData::new(output, opts.fix_errors) {
@ -58,9 +59,8 @@ fn test_it_converts(
#[test]
fn verbose_mode() {
let input = PathBuf::from("tests/files/verbose_mode.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.verbosity = Some(1);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -76,9 +76,8 @@ fn verbose_mode() {
#[test]
fn strip_headers_list() {
let input = PathBuf::from("tests/files/strip_headers_list.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.strip = Headers::Some(vec!["iCCP".to_owned(), "tEXt".to_owned()]);
let output = opts.out_file.clone().unwrap();
let png = png::PngData::new(&input, opts.fix_errors).unwrap();
@ -86,10 +85,11 @@ fn strip_headers_list() {
assert!(png.aux_headers.contains_key("iTXt"));
assert!(png.aux_headers.contains_key("iCCP"));
match oxipng::optimize(&input, &opts) {
match oxipng::optimize(&input, &output, &opts) {
Ok(_) => (),
Err(x) => panic!("{}", x),
};
let output = output.path().unwrap();
assert!(output.exists());
let png = match png::PngData::new(&output, opts.fix_errors) {
@ -110,9 +110,8 @@ fn strip_headers_list() {
#[test]
fn strip_headers_safe() {
let input = PathBuf::from("tests/files/strip_headers_safe.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.strip = Headers::Safe;
let output = opts.out_file.clone().unwrap();
let png = png::PngData::new(&input, opts.fix_errors).unwrap();
@ -120,10 +119,11 @@ fn strip_headers_safe() {
assert!(png.aux_headers.contains_key("iTXt"));
assert!(png.aux_headers.contains_key("iCCP"));
match oxipng::optimize(&input, &opts) {
match oxipng::optimize(&input, &output, &opts) {
Ok(_) => (),
Err(x) => panic!("{}", x),
};
let output = output.path().unwrap();
assert!(output.exists());
let png = match png::PngData::new(&output, opts.fix_errors) {
@ -144,9 +144,8 @@ fn strip_headers_safe() {
#[test]
fn strip_headers_all() {
let input = PathBuf::from("tests/files/strip_headers_all.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.strip = Headers::All;
let output = opts.out_file.clone().unwrap();
let png = png::PngData::new(&input, opts.fix_errors).unwrap();
@ -154,10 +153,11 @@ fn strip_headers_all() {
assert!(png.aux_headers.contains_key("iTXt"));
assert!(png.aux_headers.contains_key("iCCP"));
match oxipng::optimize(&input, &opts) {
match oxipng::optimize(&input, &output, &opts) {
Ok(_) => (),
Err(x) => panic!("{}", x),
};
let output = output.path().unwrap();
assert!(output.exists());
let png = match png::PngData::new(&output, opts.fix_errors) {
@ -178,9 +178,8 @@ fn strip_headers_all() {
#[test]
fn strip_headers_none() {
let input = PathBuf::from("tests/files/strip_headers_none.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.strip = Headers::None;
let output = opts.out_file.clone().unwrap();
let png = png::PngData::new(&input, opts.fix_errors).unwrap();
@ -188,10 +187,11 @@ fn strip_headers_none() {
assert!(png.aux_headers.contains_key("iTXt"));
assert!(png.aux_headers.contains_key("iCCP"));
match oxipng::optimize(&input, &opts) {
match oxipng::optimize(&input, &output, &opts) {
Ok(_) => (),
Err(x) => panic!("{}", x),
};
let output = output.path().unwrap();
assert!(output.exists());
let png = match png::PngData::new(&output, opts.fix_errors) {
@ -212,18 +212,18 @@ fn strip_headers_none() {
#[test]
fn interlacing_0_to_1() {
let input = PathBuf::from("tests/files/interlacing_0_to_1.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.interlace = Some(1);
let output = opts.out_file.clone().unwrap();
let png = png::PngData::new(&input, opts.fix_errors).unwrap();
assert_eq!(png.ihdr_data.interlaced, 0);
match oxipng::optimize(&input, &opts) {
match oxipng::optimize(&input, &output, &opts) {
Ok(_) => (),
Err(x) => panic!("{}", x),
};
let output = output.path().unwrap();
assert!(output.exists());
let png = match png::PngData::new(&output, opts.fix_errors) {
@ -242,18 +242,18 @@ fn interlacing_0_to_1() {
#[test]
fn interlacing_1_to_0() {
let input = PathBuf::from("tests/files/interlacing_1_to_0.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.interlace = Some(0);
let output = opts.out_file.clone().unwrap();
let png = png::PngData::new(&input, opts.fix_errors).unwrap();
assert_eq!(png.ihdr_data.interlaced, 1);
match oxipng::optimize(&input, &opts) {
match oxipng::optimize(&input, &output, &opts) {
Ok(_) => (),
Err(x) => panic!("{}", x),
};
let output = output.path().unwrap();
assert!(output.exists());
let png = match png::PngData::new(&output, opts.fix_errors) {
@ -272,9 +272,8 @@ fn interlacing_1_to_0() {
#[test]
fn interlacing_0_to_1_small_files() {
let input = PathBuf::from("tests/files/interlacing_0_to_1_small_files.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.interlace = Some(1);
let output = opts.out_file.clone().unwrap();
let png = png::PngData::new(&input, opts.fix_errors).unwrap();
@ -282,10 +281,11 @@ fn interlacing_0_to_1_small_files() {
assert_eq!(png.ihdr_data.color_type, ColorType::Indexed);
assert_eq!(png.ihdr_data.bit_depth, BitDepth::Eight);
match oxipng::optimize(&input, &opts) {
match oxipng::optimize(&input, &output, &opts) {
Ok(_) => (),
Err(x) => panic!("{}", x),
};
let output = output.path().unwrap();
assert!(output.exists());
let png = match png::PngData::new(&output, opts.fix_errors) {
@ -306,9 +306,8 @@ fn interlacing_0_to_1_small_files() {
#[test]
fn interlacing_1_to_0_small_files() {
let input = PathBuf::from("tests/files/interlacing_1_to_0_small_files.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.interlace = Some(0);
let output = opts.out_file.clone().unwrap();
let png = png::PngData::new(&input, opts.fix_errors).unwrap();
@ -316,10 +315,11 @@ fn interlacing_1_to_0_small_files() {
assert_eq!(png.ihdr_data.color_type, ColorType::Indexed);
assert_eq!(png.ihdr_data.bit_depth, BitDepth::Eight);
match oxipng::optimize(&input, &opts) {
match oxipng::optimize(&input, &output, &opts) {
Ok(_) => (),
Err(x) => panic!("{}", x),
};
let output = output.path().unwrap();
assert!(output.exists());
let png = match png::PngData::new(&output, opts.fix_errors) {
@ -340,21 +340,21 @@ fn interlacing_1_to_0_small_files() {
#[test]
fn interlaced_0_to_1_other_filter_mode() {
let input = PathBuf::from("tests/files/interlaced_0_to_1_other_filter_mode.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.interlace = Some(1);
let mut filter = HashSet::new();
filter.insert(4);
opts.filter = filter;
let output = opts.out_file.clone().unwrap();
let png = png::PngData::new(&input, opts.fix_errors).unwrap();
assert_eq!(png.ihdr_data.interlaced, 0);
match oxipng::optimize(&input, &opts) {
match oxipng::optimize(&input, &output, &opts) {
Ok(_) => (),
Err(x) => panic!("{}", x),
};
let output = output.path().unwrap();
assert!(output.exists());
let png = match png::PngData::new(&output, opts.fix_errors) {
@ -373,9 +373,8 @@ fn interlaced_0_to_1_other_filter_mode() {
#[test]
fn preserve_attrs() {
let input = PathBuf::from("tests/files/preserve_attrs.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.preserve_attrs = true;
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -393,19 +392,19 @@ fn preserve_attrs() {
#[test]
fn fix_errors() {
let input = PathBuf::from("tests/files/fix_errors.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.fix_errors = true;
let output = opts.out_file.clone().unwrap();
let png = png::PngData::new(&input, opts.fix_errors).unwrap();
assert_eq!(png.ihdr_data.color_type, ColorType::RGBA);
assert_eq!(png.ihdr_data.bit_depth, BitDepth::Eight);
match oxipng::optimize(&input, &opts) {
match oxipng::optimize(&input, &output, &opts) {
Ok(_) => (),
Err(x) => panic!("{}", x),
};
let output = output.path().unwrap();
assert!(output.exists());
let png = match png::PngData::new(&output, false) {
@ -426,9 +425,8 @@ fn fix_errors() {
#[test]
fn zopfli_mode() {
let input = PathBuf::from("tests/files/zopfli_mode.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.deflate = Deflaters::Zopfli;
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,

View file

@ -1,5 +1,6 @@
extern crate oxipng;
use oxipng::OutFile;
use oxipng::colors::{BitDepth, ColorType};
use oxipng::png;
use std::collections::HashSet;
@ -7,21 +8,20 @@ use std::fs::remove_file;
use std::path::Path;
use std::path::PathBuf;
fn get_opts(input: &Path) -> oxipng::Options {
fn get_opts(input: &Path) -> (OutFile, oxipng::Options) {
let mut options = oxipng::Options::default();
options.out_file = Some(input.with_extension("out.png").to_owned());
options.verbosity = None;
options.force = true;
let mut filter = HashSet::new();
filter.insert(0);
options.filter = filter;
options
(OutFile::Path(Some(input.with_extension("out.png").to_owned())), options)
}
fn test_it_converts(
input: &Path,
output: &Path,
output: &OutFile,
opts: &oxipng::Options,
color_type_in: ColorType,
bit_depth_in: BitDepth,
@ -34,10 +34,11 @@ fn test_it_converts(
assert_eq!(png.ihdr_data.bit_depth, bit_depth_in);
assert_eq!(png.ihdr_data.interlaced, 1);
match oxipng::optimize(input, opts) {
match oxipng::optimize(input, output, opts) {
Ok(_) => (),
Err(x) => panic!("{}", x),
};
let output = output.path().unwrap();
assert!(output.exists());
let png = match png::PngData::new(output, opts.fix_errors) {
@ -57,8 +58,7 @@ fn test_it_converts(
#[test]
fn interlaced_rgba_16_should_be_rgba_16() {
let input = PathBuf::from("tests/files/interlaced_rgba_16_should_be_rgba_16.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -74,8 +74,7 @@ fn interlaced_rgba_16_should_be_rgba_16() {
#[test]
fn interlaced_rgba_16_should_be_rgba_8() {
let input = PathBuf::from("tests/files/interlaced_rgba_16_should_be_rgba_8.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -91,8 +90,7 @@ fn interlaced_rgba_16_should_be_rgba_8() {
#[test]
fn interlaced_rgba_8_should_be_rgba_8() {
let input = PathBuf::from("tests/files/interlaced_rgba_8_should_be_rgba_8.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -108,8 +106,7 @@ fn interlaced_rgba_8_should_be_rgba_8() {
#[test]
fn interlaced_rgba_16_should_be_rgb_16() {
let input = PathBuf::from("tests/files/interlaced_rgba_16_should_be_rgb_16.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -125,8 +122,7 @@ fn interlaced_rgba_16_should_be_rgb_16() {
#[test]
fn interlaced_rgba_16_should_be_rgb_8() {
let input = PathBuf::from("tests/files/interlaced_rgba_16_should_be_rgb_8.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -142,8 +138,7 @@ fn interlaced_rgba_16_should_be_rgb_8() {
#[test]
fn interlaced_rgba_8_should_be_rgb_8() {
let input = PathBuf::from("tests/files/interlaced_rgba_8_should_be_rgb_8.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -159,8 +154,7 @@ fn interlaced_rgba_8_should_be_rgb_8() {
#[test]
fn interlaced_rgba_16_should_be_palette_8() {
let input = PathBuf::from("tests/files/interlaced_rgba_16_should_be_palette_8.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -176,8 +170,7 @@ fn interlaced_rgba_16_should_be_palette_8() {
#[test]
fn interlaced_rgba_8_should_be_palette_8() {
let input = PathBuf::from("tests/files/interlaced_rgba_8_should_be_palette_8.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -193,8 +186,7 @@ fn interlaced_rgba_8_should_be_palette_8() {
#[test]
fn interlaced_rgba_16_should_be_palette_4() {
let input = PathBuf::from("tests/files/interlaced_rgba_16_should_be_palette_4.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -210,8 +202,7 @@ fn interlaced_rgba_16_should_be_palette_4() {
#[test]
fn interlaced_rgba_8_should_be_palette_4() {
let input = PathBuf::from("tests/files/interlaced_rgba_8_should_be_palette_4.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -227,8 +218,7 @@ fn interlaced_rgba_8_should_be_palette_4() {
#[test]
fn interlaced_rgba_16_should_be_palette_2() {
let input = PathBuf::from("tests/files/interlaced_rgba_16_should_be_palette_2.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -244,8 +234,7 @@ fn interlaced_rgba_16_should_be_palette_2() {
#[test]
fn interlaced_rgba_8_should_be_palette_2() {
let input = PathBuf::from("tests/files/interlaced_rgba_8_should_be_palette_2.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -261,8 +250,7 @@ fn interlaced_rgba_8_should_be_palette_2() {
#[test]
fn interlaced_rgba_16_should_be_palette_1() {
let input = PathBuf::from("tests/files/interlaced_rgba_16_should_be_palette_1.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -278,8 +266,7 @@ fn interlaced_rgba_16_should_be_palette_1() {
#[test]
fn interlaced_rgba_8_should_be_palette_1() {
let input = PathBuf::from("tests/files/interlaced_rgba_8_should_be_palette_1.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -295,8 +282,7 @@ fn interlaced_rgba_8_should_be_palette_1() {
#[test]
fn interlaced_rgba_16_should_be_grayscale_alpha_16() {
let input = PathBuf::from("tests/files/interlaced_rgba_16_should_be_grayscale_alpha_16.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -312,8 +298,7 @@ fn interlaced_rgba_16_should_be_grayscale_alpha_16() {
#[test]
fn interlaced_rgba_16_should_be_grayscale_alpha_8() {
let input = PathBuf::from("tests/files/interlaced_rgba_16_should_be_grayscale_alpha_8.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -329,8 +314,7 @@ fn interlaced_rgba_16_should_be_grayscale_alpha_8() {
#[test]
fn interlaced_rgba_8_should_be_grayscale_alpha_8() {
let input = PathBuf::from("tests/files/interlaced_rgba_8_should_be_grayscale_alpha_8.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -346,8 +330,7 @@ fn interlaced_rgba_8_should_be_grayscale_alpha_8() {
#[test]
fn interlaced_rgba_16_should_be_grayscale_16() {
let input = PathBuf::from("tests/files/interlaced_rgba_16_should_be_grayscale_16.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -363,8 +346,7 @@ fn interlaced_rgba_16_should_be_grayscale_16() {
#[test]
fn interlaced_rgba_16_should_be_grayscale_8() {
let input = PathBuf::from("tests/files/interlaced_rgba_16_should_be_grayscale_8.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -380,8 +362,7 @@ fn interlaced_rgba_16_should_be_grayscale_8() {
#[test]
fn interlaced_rgba_8_should_be_grayscale_8() {
let input = PathBuf::from("tests/files/interlaced_rgba_8_should_be_grayscale_8.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -397,8 +378,7 @@ fn interlaced_rgba_8_should_be_grayscale_8() {
#[test]
fn interlaced_rgb_16_should_be_rgb_16() {
let input = PathBuf::from("tests/files/interlaced_rgb_16_should_be_rgb_16.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -414,8 +394,7 @@ fn interlaced_rgb_16_should_be_rgb_16() {
#[test]
fn interlaced_rgb_16_should_be_rgb_8() {
let input = PathBuf::from("tests/files/interlaced_rgb_16_should_be_rgb_8.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -431,8 +410,7 @@ fn interlaced_rgb_16_should_be_rgb_8() {
#[test]
fn interlaced_rgb_8_should_be_rgb_8() {
let input = PathBuf::from("tests/files/interlaced_rgb_8_should_be_rgb_8.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -448,8 +426,7 @@ fn interlaced_rgb_8_should_be_rgb_8() {
#[test]
fn interlaced_rgb_16_should_be_palette_8() {
let input = PathBuf::from("tests/files/interlaced_rgb_16_should_be_palette_8.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -465,8 +442,7 @@ fn interlaced_rgb_16_should_be_palette_8() {
#[test]
fn interlaced_rgb_8_should_be_palette_8() {
let input = PathBuf::from("tests/files/interlaced_rgb_8_should_be_palette_8.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -482,8 +458,7 @@ fn interlaced_rgb_8_should_be_palette_8() {
#[test]
fn interlaced_rgb_16_should_be_palette_4() {
let input = PathBuf::from("tests/files/interlaced_rgb_16_should_be_palette_4.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -499,8 +474,7 @@ fn interlaced_rgb_16_should_be_palette_4() {
#[test]
fn interlaced_rgb_8_should_be_palette_4() {
let input = PathBuf::from("tests/files/interlaced_rgb_8_should_be_palette_4.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -516,8 +490,7 @@ fn interlaced_rgb_8_should_be_palette_4() {
#[test]
fn interlaced_rgb_16_should_be_palette_2() {
let input = PathBuf::from("tests/files/interlaced_rgb_16_should_be_palette_2.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -533,8 +506,7 @@ fn interlaced_rgb_16_should_be_palette_2() {
#[test]
fn interlaced_rgb_8_should_be_palette_2() {
let input = PathBuf::from("tests/files/interlaced_rgb_8_should_be_palette_2.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -550,8 +522,7 @@ fn interlaced_rgb_8_should_be_palette_2() {
#[test]
fn interlaced_rgb_16_should_be_palette_1() {
let input = PathBuf::from("tests/files/interlaced_rgb_16_should_be_palette_1.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -567,8 +538,7 @@ fn interlaced_rgb_16_should_be_palette_1() {
#[test]
fn interlaced_rgb_8_should_be_palette_1() {
let input = PathBuf::from("tests/files/interlaced_rgb_8_should_be_palette_1.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -584,8 +554,7 @@ fn interlaced_rgb_8_should_be_palette_1() {
#[test]
fn interlaced_rgb_16_should_be_grayscale_16() {
let input = PathBuf::from("tests/files/interlaced_rgb_16_should_be_grayscale_16.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -601,8 +570,7 @@ fn interlaced_rgb_16_should_be_grayscale_16() {
#[test]
fn interlaced_rgb_16_should_be_grayscale_8() {
let input = PathBuf::from("tests/files/interlaced_rgb_16_should_be_grayscale_8.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -618,8 +586,7 @@ fn interlaced_rgb_16_should_be_grayscale_8() {
#[test]
fn interlaced_rgb_8_should_be_grayscale_8() {
let input = PathBuf::from("tests/files/interlaced_rgb_8_should_be_grayscale_8.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -635,8 +602,7 @@ fn interlaced_rgb_8_should_be_grayscale_8() {
#[test]
fn interlaced_palette_8_should_be_palette_8() {
let input = PathBuf::from("tests/files/interlaced_palette_8_should_be_palette_8.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -652,8 +618,7 @@ fn interlaced_palette_8_should_be_palette_8() {
#[test]
fn interlaced_palette_8_should_be_palette_4() {
let input = PathBuf::from("tests/files/interlaced_palette_8_should_be_palette_4.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -669,8 +634,7 @@ fn interlaced_palette_8_should_be_palette_4() {
#[test]
fn interlaced_palette_4_should_be_palette_4() {
let input = PathBuf::from("tests/files/interlaced_palette_4_should_be_palette_4.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -686,8 +650,7 @@ fn interlaced_palette_4_should_be_palette_4() {
#[test]
fn interlaced_palette_8_should_be_palette_2() {
let input = PathBuf::from("tests/files/interlaced_palette_8_should_be_palette_2.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -703,8 +666,7 @@ fn interlaced_palette_8_should_be_palette_2() {
#[test]
fn interlaced_palette_4_should_be_palette_2() {
let input = PathBuf::from("tests/files/interlaced_palette_4_should_be_palette_2.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -720,8 +682,7 @@ fn interlaced_palette_4_should_be_palette_2() {
#[test]
fn interlaced_palette_2_should_be_palette_2() {
let input = PathBuf::from("tests/files/interlaced_palette_2_should_be_palette_2.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -737,8 +698,7 @@ fn interlaced_palette_2_should_be_palette_2() {
#[test]
fn interlaced_palette_8_should_be_palette_1() {
let input = PathBuf::from("tests/files/interlaced_palette_8_should_be_palette_1.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -754,8 +714,7 @@ fn interlaced_palette_8_should_be_palette_1() {
#[test]
fn interlaced_palette_4_should_be_palette_1() {
let input = PathBuf::from("tests/files/interlaced_palette_4_should_be_palette_1.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -771,8 +730,7 @@ fn interlaced_palette_4_should_be_palette_1() {
#[test]
fn interlaced_palette_2_should_be_palette_1() {
let input = PathBuf::from("tests/files/interlaced_palette_2_should_be_palette_1.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -788,8 +746,7 @@ fn interlaced_palette_2_should_be_palette_1() {
#[test]
fn interlaced_palette_1_should_be_palette_1() {
let input = PathBuf::from("tests/files/interlaced_palette_1_should_be_palette_1.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -806,8 +763,7 @@ fn interlaced_palette_1_should_be_palette_1() {
fn interlaced_grayscale_alpha_16_should_be_grayscale_alpha_16() {
let input =
PathBuf::from("tests/files/interlaced_grayscale_alpha_16_should_be_grayscale_alpha_16.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -824,8 +780,7 @@ fn interlaced_grayscale_alpha_16_should_be_grayscale_alpha_16() {
fn interlaced_grayscale_alpha_16_should_be_grayscale_alpha_8() {
let input =
PathBuf::from("tests/files/interlaced_grayscale_alpha_16_should_be_grayscale_alpha_8.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -842,8 +797,7 @@ fn interlaced_grayscale_alpha_16_should_be_grayscale_alpha_8() {
fn interlaced_grayscale_alpha_8_should_be_grayscale_alpha_8() {
let input =
PathBuf::from("tests/files/interlaced_grayscale_alpha_8_should_be_grayscale_alpha_8.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -860,8 +814,7 @@ fn interlaced_grayscale_alpha_8_should_be_grayscale_alpha_8() {
fn interlaced_grayscale_alpha_16_should_be_grayscale_16() {
let input =
PathBuf::from("tests/files/interlaced_grayscale_alpha_16_should_be_grayscale_16.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -878,8 +831,7 @@ fn interlaced_grayscale_alpha_16_should_be_grayscale_16() {
fn interlaced_grayscale_alpha_16_should_be_grayscale_8() {
let input =
PathBuf::from("tests/files/interlaced_grayscale_alpha_16_should_be_grayscale_8.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -895,8 +847,7 @@ fn interlaced_grayscale_alpha_16_should_be_grayscale_8() {
#[test]
fn interlaced_grayscale_alpha_8_should_be_grayscale_8() {
let input = PathBuf::from("tests/files/interlaced_grayscale_alpha_8_should_be_grayscale_8.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -912,8 +863,7 @@ fn interlaced_grayscale_alpha_8_should_be_grayscale_8() {
#[test]
fn interlaced_grayscale_16_should_be_grayscale_16() {
let input = PathBuf::from("tests/files/interlaced_grayscale_16_should_be_grayscale_16.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -929,8 +879,7 @@ fn interlaced_grayscale_16_should_be_grayscale_16() {
#[test]
fn interlaced_grayscale_16_should_be_grayscale_8() {
let input = PathBuf::from("tests/files/interlaced_grayscale_16_should_be_grayscale_8.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -946,8 +895,7 @@ fn interlaced_grayscale_16_should_be_grayscale_8() {
#[test]
fn interlaced_grayscale_8_should_be_grayscale_8() {
let input = PathBuf::from("tests/files/interlaced_grayscale_8_should_be_grayscale_8.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -963,8 +911,7 @@ fn interlaced_grayscale_8_should_be_grayscale_8() {
#[test]
fn interlaced_small_files() {
let input = PathBuf::from("tests/files/interlaced_small_files.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -980,8 +927,7 @@ fn interlaced_small_files() {
#[test]
fn interlaced_odd_width() {
let input = PathBuf::from("tests/files/interlaced_odd_width.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,

View file

@ -1,5 +1,6 @@
extern crate oxipng;
use oxipng::OutFile;
use std::default::Default;
use std::fs::File;
use std::path::Path;
@ -49,7 +50,7 @@ fn optimize() {
let mut opts: oxipng::Options = Default::default();
opts.verbosity = Some(1);
let result = oxipng::optimize(Path::new("tests/files/fully_optimized.png"), &opts);
let result = oxipng::optimize(Path::new("tests/files/fully_optimized.png"), &OutFile::Path(None), &opts);
assert!(result.is_ok());
}
@ -58,7 +59,7 @@ fn optimize_corrupted() {
let mut opts: oxipng::Options = Default::default();
opts.verbosity = Some(1);
let result = oxipng::optimize(Path::new("tests/files/corrupted_header.png"), &opts);
let result = oxipng::optimize(Path::new("tests/files/corrupted_header.png"), &OutFile::Path(None), &opts);
assert!(result.is_err());
}
@ -67,6 +68,6 @@ fn optimize_apng() {
let mut opts: oxipng::Options = Default::default();
opts.verbosity = Some(1);
let result = oxipng::optimize(Path::new("tests/files/apng_file.png"), &opts);
let result = oxipng::optimize(Path::new("tests/files/apng_file.png"), &OutFile::Path(None), &opts);
assert!(result.is_err());
}

View file

@ -1,5 +1,6 @@
extern crate oxipng;
use oxipng::OutFile;
use oxipng::colors::{AlphaOptim, BitDepth, ColorType};
use oxipng::png;
use std::collections::HashSet;
@ -7,21 +8,20 @@ use std::fs::remove_file;
use std::path::Path;
use std::path::PathBuf;
fn get_opts(input: &Path) -> oxipng::Options {
fn get_opts(input: &Path) -> (OutFile, oxipng::Options) {
let mut options = oxipng::Options::default();
options.out_file = Some(input.with_extension("out.png").to_owned());
options.verbosity = None;
options.force = true;
let mut filter = HashSet::new();
filter.insert(0);
options.filter = filter;
options
(OutFile::Path(Some(input.with_extension("out.png").to_owned())), options)
}
fn test_it_converts(
input: &Path,
output: &Path,
output: &OutFile,
opts: &oxipng::Options,
color_type_in: ColorType,
bit_depth_in: BitDepth,
@ -34,10 +34,11 @@ fn test_it_converts(
assert_eq!(png.ihdr_data.bit_depth, bit_depth_in);
assert_eq!(png.ihdr_data.interlaced, 0);
match oxipng::optimize(input, opts) {
match oxipng::optimize(input, output, opts) {
Ok(_) => (),
Err(x) => panic!("{}", x),
};
let output = output.path().unwrap();
assert!(output.exists());
let png = match png::PngData::new(output, opts.fix_errors) {
@ -57,8 +58,7 @@ fn test_it_converts(
#[test]
fn rgba_16_should_be_rgba_16() {
let input = PathBuf::from("tests/files/rgba_16_should_be_rgba_16.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -74,8 +74,7 @@ fn rgba_16_should_be_rgba_16() {
#[test]
fn rgba_16_should_be_rgba_8() {
let input = PathBuf::from("tests/files/rgba_16_should_be_rgba_8.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -91,8 +90,7 @@ fn rgba_16_should_be_rgba_8() {
#[test]
fn rgba_8_should_be_rgba_8() {
let input = PathBuf::from("tests/files/rgba_8_should_be_rgba_8.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -108,8 +106,7 @@ fn rgba_8_should_be_rgba_8() {
#[test]
fn rgba_16_should_be_rgb_16() {
let input = PathBuf::from("tests/files/rgba_16_should_be_rgb_16.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -125,8 +122,7 @@ fn rgba_16_should_be_rgb_16() {
#[test]
fn rgba_16_should_be_rgb_8() {
let input = PathBuf::from("tests/files/rgba_16_should_be_rgb_8.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -142,8 +138,7 @@ fn rgba_16_should_be_rgb_8() {
#[test]
fn rgba_8_should_be_rgb_8() {
let input = PathBuf::from("tests/files/rgba_8_should_be_rgb_8.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -159,8 +154,7 @@ fn rgba_8_should_be_rgb_8() {
#[test]
fn rgba_16_should_be_palette_8() {
let input = PathBuf::from("tests/files/rgba_16_should_be_palette_8.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -176,8 +170,7 @@ fn rgba_16_should_be_palette_8() {
#[test]
fn rgba_8_should_be_palette_8() {
let input = PathBuf::from("tests/files/rgba_8_should_be_palette_8.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -193,8 +186,7 @@ fn rgba_8_should_be_palette_8() {
#[test]
fn rgba_16_should_be_palette_4() {
let input = PathBuf::from("tests/files/rgba_16_should_be_palette_4.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -210,8 +202,7 @@ fn rgba_16_should_be_palette_4() {
#[test]
fn rgba_8_should_be_palette_4() {
let input = PathBuf::from("tests/files/rgba_8_should_be_palette_4.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -227,8 +218,7 @@ fn rgba_8_should_be_palette_4() {
#[test]
fn rgba_16_should_be_palette_2() {
let input = PathBuf::from("tests/files/rgba_16_should_be_palette_2.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -244,8 +234,7 @@ fn rgba_16_should_be_palette_2() {
#[test]
fn rgba_8_should_be_palette_2() {
let input = PathBuf::from("tests/files/rgba_8_should_be_palette_2.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -261,8 +250,7 @@ fn rgba_8_should_be_palette_2() {
#[test]
fn rgba_16_should_be_palette_1() {
let input = PathBuf::from("tests/files/rgba_16_should_be_palette_1.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -278,8 +266,7 @@ fn rgba_16_should_be_palette_1() {
#[test]
fn rgba_8_should_be_palette_1() {
let input = PathBuf::from("tests/files/rgba_8_should_be_palette_1.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -295,8 +282,7 @@ fn rgba_8_should_be_palette_1() {
#[test]
fn rgba_16_should_be_grayscale_alpha_16() {
let input = PathBuf::from("tests/files/rgba_16_should_be_grayscale_alpha_16.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -312,8 +298,7 @@ fn rgba_16_should_be_grayscale_alpha_16() {
#[test]
fn rgba_16_should_be_grayscale_alpha_8() {
let input = PathBuf::from("tests/files/rgba_16_should_be_grayscale_alpha_8.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -329,8 +314,7 @@ fn rgba_16_should_be_grayscale_alpha_8() {
#[test]
fn rgba_8_should_be_grayscale_alpha_8() {
let input = PathBuf::from("tests/files/rgba_8_should_be_grayscale_alpha_8.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -346,8 +330,7 @@ fn rgba_8_should_be_grayscale_alpha_8() {
#[test]
fn rgba_16_should_be_grayscale_16() {
let input = PathBuf::from("tests/files/rgba_16_should_be_grayscale_16.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -363,8 +346,7 @@ fn rgba_16_should_be_grayscale_16() {
#[test]
fn rgba_16_should_be_grayscale_8() {
let input = PathBuf::from("tests/files/rgba_16_should_be_grayscale_8.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -380,8 +362,7 @@ fn rgba_16_should_be_grayscale_8() {
#[test]
fn rgba_8_should_be_grayscale_8() {
let input = PathBuf::from("tests/files/rgba_8_should_be_grayscale_8.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -397,8 +378,7 @@ fn rgba_8_should_be_grayscale_8() {
#[test]
fn rgb_16_should_be_rgb_16() {
let input = PathBuf::from("tests/files/rgb_16_should_be_rgb_16.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -414,8 +394,7 @@ fn rgb_16_should_be_rgb_16() {
#[test]
fn rgb_16_should_be_rgb_8() {
let input = PathBuf::from("tests/files/rgb_16_should_be_rgb_8.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -431,8 +410,7 @@ fn rgb_16_should_be_rgb_8() {
#[test]
fn rgb_8_should_be_rgb_8() {
let input = PathBuf::from("tests/files/rgb_8_should_be_rgb_8.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -448,8 +426,7 @@ fn rgb_8_should_be_rgb_8() {
#[test]
fn rgb_16_should_be_palette_8() {
let input = PathBuf::from("tests/files/rgb_16_should_be_palette_8.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -465,8 +442,7 @@ fn rgb_16_should_be_palette_8() {
#[test]
fn rgb_8_should_be_palette_8() {
let input = PathBuf::from("tests/files/rgb_8_should_be_palette_8.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -482,8 +458,7 @@ fn rgb_8_should_be_palette_8() {
#[test]
fn rgb_16_should_be_palette_4() {
let input = PathBuf::from("tests/files/rgb_16_should_be_palette_4.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -499,8 +474,7 @@ fn rgb_16_should_be_palette_4() {
#[test]
fn rgb_8_should_be_palette_4() {
let input = PathBuf::from("tests/files/rgb_8_should_be_palette_4.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -516,8 +490,7 @@ fn rgb_8_should_be_palette_4() {
#[test]
fn rgb_16_should_be_palette_2() {
let input = PathBuf::from("tests/files/rgb_16_should_be_palette_2.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -533,8 +506,7 @@ fn rgb_16_should_be_palette_2() {
#[test]
fn rgb_8_should_be_palette_2() {
let input = PathBuf::from("tests/files/rgb_8_should_be_palette_2.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -550,8 +522,7 @@ fn rgb_8_should_be_palette_2() {
#[test]
fn rgb_16_should_be_palette_1() {
let input = PathBuf::from("tests/files/rgb_16_should_be_palette_1.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -567,8 +538,7 @@ fn rgb_16_should_be_palette_1() {
#[test]
fn rgb_8_should_be_palette_1() {
let input = PathBuf::from("tests/files/rgb_8_should_be_palette_1.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -584,8 +554,7 @@ fn rgb_8_should_be_palette_1() {
#[test]
fn rgb_16_should_be_grayscale_16() {
let input = PathBuf::from("tests/files/rgb_16_should_be_grayscale_16.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -601,8 +570,7 @@ fn rgb_16_should_be_grayscale_16() {
#[test]
fn rgb_16_should_be_grayscale_8() {
let input = PathBuf::from("tests/files/rgb_16_should_be_grayscale_8.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -618,8 +586,7 @@ fn rgb_16_should_be_grayscale_8() {
#[test]
fn rgb_8_should_be_grayscale_8() {
let input = PathBuf::from("tests/files/rgb_8_should_be_grayscale_8.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -635,8 +602,7 @@ fn rgb_8_should_be_grayscale_8() {
#[test]
fn palette_8_should_be_palette_8() {
let input = PathBuf::from("tests/files/palette_8_should_be_palette_8.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -652,8 +618,7 @@ fn palette_8_should_be_palette_8() {
#[test]
fn palette_8_should_be_palette_4() {
let input = PathBuf::from("tests/files/palette_8_should_be_palette_4.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -669,8 +634,7 @@ fn palette_8_should_be_palette_4() {
#[test]
fn palette_4_should_be_palette_4() {
let input = PathBuf::from("tests/files/palette_4_should_be_palette_4.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -686,8 +650,7 @@ fn palette_4_should_be_palette_4() {
#[test]
fn palette_8_should_be_palette_2() {
let input = PathBuf::from("tests/files/palette_8_should_be_palette_2.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -703,8 +666,7 @@ fn palette_8_should_be_palette_2() {
#[test]
fn palette_4_should_be_palette_2() {
let input = PathBuf::from("tests/files/palette_4_should_be_palette_2.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -720,8 +682,7 @@ fn palette_4_should_be_palette_2() {
#[test]
fn palette_2_should_be_palette_2() {
let input = PathBuf::from("tests/files/palette_2_should_be_palette_2.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -737,8 +698,7 @@ fn palette_2_should_be_palette_2() {
#[test]
fn palette_8_should_be_palette_1() {
let input = PathBuf::from("tests/files/palette_8_should_be_palette_1.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -754,8 +714,7 @@ fn palette_8_should_be_palette_1() {
#[test]
fn palette_4_should_be_palette_1() {
let input = PathBuf::from("tests/files/palette_4_should_be_palette_1.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -771,8 +730,7 @@ fn palette_4_should_be_palette_1() {
#[test]
fn palette_2_should_be_palette_1() {
let input = PathBuf::from("tests/files/palette_2_should_be_palette_1.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -788,8 +746,7 @@ fn palette_2_should_be_palette_1() {
#[test]
fn palette_1_should_be_palette_1() {
let input = PathBuf::from("tests/files/palette_1_should_be_palette_1.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -805,8 +762,7 @@ fn palette_1_should_be_palette_1() {
#[test]
fn grayscale_alpha_16_should_be_grayscale_alpha_16() {
let input = PathBuf::from("tests/files/grayscale_alpha_16_should_be_grayscale_alpha_16.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -822,8 +778,7 @@ fn grayscale_alpha_16_should_be_grayscale_alpha_16() {
#[test]
fn grayscale_alpha_16_should_be_grayscale_alpha_8() {
let input = PathBuf::from("tests/files/grayscale_alpha_16_should_be_grayscale_alpha_8.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -839,8 +794,7 @@ fn grayscale_alpha_16_should_be_grayscale_alpha_8() {
#[test]
fn grayscale_alpha_8_should_be_grayscale_alpha_8() {
let input = PathBuf::from("tests/files/grayscale_alpha_8_should_be_grayscale_alpha_8.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -856,8 +810,7 @@ fn grayscale_alpha_8_should_be_grayscale_alpha_8() {
#[test]
fn grayscale_alpha_16_should_be_grayscale_16() {
let input = PathBuf::from("tests/files/grayscale_alpha_16_should_be_grayscale_16.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -873,8 +826,7 @@ fn grayscale_alpha_16_should_be_grayscale_16() {
#[test]
fn grayscale_alpha_16_should_be_grayscale_8() {
let input = PathBuf::from("tests/files/grayscale_alpha_16_should_be_grayscale_8.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -890,8 +842,7 @@ fn grayscale_alpha_16_should_be_grayscale_8() {
#[test]
fn grayscale_alpha_8_should_be_grayscale_8() {
let input = PathBuf::from("tests/files/grayscale_alpha_8_should_be_grayscale_8.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -907,8 +858,7 @@ fn grayscale_alpha_8_should_be_grayscale_8() {
#[test]
fn grayscale_16_should_be_grayscale_16() {
let input = PathBuf::from("tests/files/grayscale_16_should_be_grayscale_16.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -924,8 +874,7 @@ fn grayscale_16_should_be_grayscale_16() {
#[test]
fn grayscale_16_should_be_grayscale_8() {
let input = PathBuf::from("tests/files/grayscale_16_should_be_grayscale_8.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -941,8 +890,7 @@ fn grayscale_16_should_be_grayscale_8() {
#[test]
fn grayscale_8_should_be_grayscale_8() {
let input = PathBuf::from("tests/files/grayscale_8_should_be_grayscale_8.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -958,8 +906,7 @@ fn grayscale_8_should_be_grayscale_8() {
#[test]
fn small_files() {
let input = PathBuf::from("tests/files/small_files.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -975,8 +922,7 @@ fn small_files() {
#[test]
fn palette_should_be_reduced_with_dupes() {
let input = PathBuf::from("tests/files/palette_should_be_reduced_with_dupes.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
let png = png::PngData::new(&input, opts.fix_errors).unwrap();
@ -984,10 +930,11 @@ fn palette_should_be_reduced_with_dupes() {
assert_eq!(png.ihdr_data.bit_depth, BitDepth::Eight);
assert_eq!(png.palette.unwrap().len(), 43 * 3);
match oxipng::optimize(&input, &opts) {
match oxipng::optimize(&input, &output, &opts) {
Ok(_) => (),
Err(x) => panic!("{}", x),
};
let output = output.path().unwrap();
assert!(output.exists());
let png = match png::PngData::new(&output, opts.fix_errors) {
@ -1008,8 +955,7 @@ fn palette_should_be_reduced_with_dupes() {
#[test]
fn palette_should_be_reduced_with_unused() {
let input = PathBuf::from("tests/files/palette_should_be_reduced_with_unused.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
let png = png::PngData::new(&input, opts.fix_errors).unwrap();
@ -1017,10 +963,11 @@ fn palette_should_be_reduced_with_unused() {
assert_eq!(png.ihdr_data.bit_depth, BitDepth::Eight);
assert_eq!(png.palette.unwrap().len(), 35 * 3);
match oxipng::optimize(&input, &opts) {
match oxipng::optimize(&input, &output, &opts) {
Ok(_) => (),
Err(x) => panic!("{}", x),
};
let output = output.path().unwrap();
assert!(output.exists());
let png = match png::PngData::new(&output, opts.fix_errors) {
@ -1041,8 +988,7 @@ fn palette_should_be_reduced_with_unused() {
#[test]
fn palette_should_be_reduced_with_both() {
let input = PathBuf::from("tests/files/palette_should_be_reduced_with_both.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
let png = png::PngData::new(&input, opts.fix_errors).unwrap();
@ -1050,10 +996,11 @@ fn palette_should_be_reduced_with_both() {
assert_eq!(png.ihdr_data.bit_depth, BitDepth::Eight);
assert_eq!(png.palette.unwrap().len(), 43 * 3);
match oxipng::optimize(&input, &opts) {
match oxipng::optimize(&input, &output, &opts) {
Ok(_) => (),
Err(x) => panic!("{}", x),
};
let output = output.path().unwrap();
assert!(output.exists());
let png = match png::PngData::new(&output, opts.fix_errors) {
@ -1074,8 +1021,7 @@ fn palette_should_be_reduced_with_both() {
#[test]
fn rgba_16_reduce_alpha_black() {
let input = PathBuf::from("tests/files/rgba_16_reduce_alpha_black.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -1091,8 +1037,7 @@ fn rgba_16_reduce_alpha_black() {
#[test]
fn rgba_8_reduce_alpha_black() {
let input = PathBuf::from("tests/files/rgba_8_reduce_alpha_black.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -1108,8 +1053,7 @@ fn rgba_8_reduce_alpha_black() {
#[test]
fn grayscale_alpha_16_reduce_alpha_black() {
let input = PathBuf::from("tests/files/grayscale_alpha_16_reduce_alpha_black.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -1125,8 +1069,7 @@ fn grayscale_alpha_16_reduce_alpha_black() {
#[test]
fn grayscale_alpha_8_reduce_alpha_black() {
let input = PathBuf::from("tests/files/grayscale_alpha_8_reduce_alpha_black.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -1142,10 +1085,9 @@ fn grayscale_alpha_8_reduce_alpha_black() {
#[test]
fn rgba_16_reduce_alpha_white() {
let input = PathBuf::from("tests/files/rgba_16_reduce_alpha_white.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.alphas = HashSet::with_capacity(1);
opts.alphas.insert(AlphaOptim::White);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -1161,10 +1103,9 @@ fn rgba_16_reduce_alpha_white() {
#[test]
fn rgba_8_reduce_alpha_white() {
let input = PathBuf::from("tests/files/rgba_8_reduce_alpha_white.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.alphas = HashSet::with_capacity(1);
opts.alphas.insert(AlphaOptim::White);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -1180,10 +1121,9 @@ fn rgba_8_reduce_alpha_white() {
#[test]
fn grayscale_alpha_16_reduce_alpha_white() {
let input = PathBuf::from("tests/files/grayscale_alpha_16_reduce_alpha_white.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.alphas = HashSet::with_capacity(1);
opts.alphas.insert(AlphaOptim::White);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -1199,10 +1139,9 @@ fn grayscale_alpha_16_reduce_alpha_white() {
#[test]
fn grayscale_alpha_8_reduce_alpha_white() {
let input = PathBuf::from("tests/files/grayscale_alpha_8_reduce_alpha_white.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.alphas = HashSet::with_capacity(1);
opts.alphas.insert(AlphaOptim::White);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -1218,10 +1157,9 @@ fn grayscale_alpha_8_reduce_alpha_white() {
#[test]
fn rgba_16_reduce_alpha_down() {
let input = PathBuf::from("tests/files/rgba_16_reduce_alpha_down.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.alphas = HashSet::with_capacity(1);
opts.alphas.insert(AlphaOptim::Down);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -1237,10 +1175,9 @@ fn rgba_16_reduce_alpha_down() {
#[test]
fn rgba_8_reduce_alpha_down() {
let input = PathBuf::from("tests/files/rgba_8_reduce_alpha_down.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.alphas = HashSet::with_capacity(1);
opts.alphas.insert(AlphaOptim::Down);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -1256,10 +1193,9 @@ fn rgba_8_reduce_alpha_down() {
#[test]
fn grayscale_alpha_16_reduce_alpha_down() {
let input = PathBuf::from("tests/files/grayscale_alpha_16_reduce_alpha_down.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.alphas = HashSet::with_capacity(1);
opts.alphas.insert(AlphaOptim::Down);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -1275,10 +1211,9 @@ fn grayscale_alpha_16_reduce_alpha_down() {
#[test]
fn grayscale_alpha_8_reduce_alpha_down() {
let input = PathBuf::from("tests/files/grayscale_alpha_8_reduce_alpha_down.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.alphas = HashSet::with_capacity(1);
opts.alphas.insert(AlphaOptim::Down);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -1294,10 +1229,9 @@ fn grayscale_alpha_8_reduce_alpha_down() {
#[test]
fn rgba_16_reduce_alpha_up() {
let input = PathBuf::from("tests/files/rgba_16_reduce_alpha_up.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.alphas = HashSet::with_capacity(1);
opts.alphas.insert(AlphaOptim::Up);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -1313,10 +1247,9 @@ fn rgba_16_reduce_alpha_up() {
#[test]
fn rgba_8_reduce_alpha_up() {
let input = PathBuf::from("tests/files/rgba_8_reduce_alpha_up.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.alphas = HashSet::with_capacity(1);
opts.alphas.insert(AlphaOptim::Up);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -1332,10 +1265,9 @@ fn rgba_8_reduce_alpha_up() {
#[test]
fn grayscale_alpha_16_reduce_alpha_up() {
let input = PathBuf::from("tests/files/grayscale_alpha_16_reduce_alpha_up.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.alphas = HashSet::with_capacity(1);
opts.alphas.insert(AlphaOptim::Up);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -1351,10 +1283,9 @@ fn grayscale_alpha_16_reduce_alpha_up() {
#[test]
fn grayscale_alpha_8_reduce_alpha_up() {
let input = PathBuf::from("tests/files/grayscale_alpha_8_reduce_alpha_up.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.alphas = HashSet::with_capacity(1);
opts.alphas.insert(AlphaOptim::Up);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -1370,10 +1301,9 @@ fn grayscale_alpha_8_reduce_alpha_up() {
#[test]
fn rgba_16_reduce_alpha_left() {
let input = PathBuf::from("tests/files/rgba_16_reduce_alpha_left.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.alphas = HashSet::with_capacity(1);
opts.alphas.insert(AlphaOptim::Left);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -1389,10 +1319,9 @@ fn rgba_16_reduce_alpha_left() {
#[test]
fn rgba_8_reduce_alpha_left() {
let input = PathBuf::from("tests/files/rgba_8_reduce_alpha_left.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.alphas = HashSet::with_capacity(1);
opts.alphas.insert(AlphaOptim::Left);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -1408,10 +1337,9 @@ fn rgba_8_reduce_alpha_left() {
#[test]
fn grayscale_alpha_16_reduce_alpha_left() {
let input = PathBuf::from("tests/files/grayscale_alpha_16_reduce_alpha_left.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.alphas = HashSet::with_capacity(1);
opts.alphas.insert(AlphaOptim::Left);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -1427,10 +1355,9 @@ fn grayscale_alpha_16_reduce_alpha_left() {
#[test]
fn grayscale_alpha_8_reduce_alpha_left() {
let input = PathBuf::from("tests/files/grayscale_alpha_8_reduce_alpha_left.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.alphas = HashSet::with_capacity(1);
opts.alphas.insert(AlphaOptim::Left);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -1446,10 +1373,9 @@ fn grayscale_alpha_8_reduce_alpha_left() {
#[test]
fn rgba_16_reduce_alpha_right() {
let input = PathBuf::from("tests/files/rgba_16_reduce_alpha_right.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.alphas = HashSet::with_capacity(1);
opts.alphas.insert(AlphaOptim::Right);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -1465,10 +1391,9 @@ fn rgba_16_reduce_alpha_right() {
#[test]
fn rgba_8_reduce_alpha_right() {
let input = PathBuf::from("tests/files/rgba_8_reduce_alpha_right.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.alphas = HashSet::with_capacity(1);
opts.alphas.insert(AlphaOptim::Right);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -1484,10 +1409,9 @@ fn rgba_8_reduce_alpha_right() {
#[test]
fn grayscale_alpha_16_reduce_alpha_right() {
let input = PathBuf::from("tests/files/grayscale_alpha_16_reduce_alpha_right.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.alphas = HashSet::with_capacity(1);
opts.alphas.insert(AlphaOptim::Right);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,
@ -1503,10 +1427,9 @@ fn grayscale_alpha_16_reduce_alpha_right() {
#[test]
fn grayscale_alpha_8_reduce_alpha_right() {
let input = PathBuf::from("tests/files/grayscale_alpha_8_reduce_alpha_right.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.alphas = HashSet::with_capacity(1);
opts.alphas.insert(AlphaOptim::Right);
let output = opts.out_file.clone().unwrap();
test_it_converts(
&input,

View file

@ -2,26 +2,26 @@ extern crate oxipng;
use oxipng::colors::{BitDepth, ColorType};
use oxipng::png;
use oxipng::OutFile;
use std::collections::HashSet;
use std::fs::remove_file;
use std::path::Path;
use std::path::PathBuf;
fn get_opts(input: &Path) -> oxipng::Options {
fn get_opts(input: &Path) -> (OutFile, oxipng::Options) {
let mut options = oxipng::Options::default();
options.out_file = Some(input.with_extension("out.png").to_owned());
options.verbosity = None;
options.force = true;
let mut filter = HashSet::new();
filter.insert(0);
options.filter = filter;
options
(OutFile::Path(Some(input.with_extension("out.png").to_owned())), options)
}
fn test_it_converts(
input: &Path,
output: &Path,
output: &OutFile,
opts: &oxipng::Options,
color_type_in: ColorType,
bit_depth_in: BitDepth,
@ -33,10 +33,11 @@ fn test_it_converts(
assert_eq!(png.ihdr_data.color_type, color_type_in);
assert_eq!(png.ihdr_data.bit_depth, bit_depth_in);
match oxipng::optimize(input, opts) {
match oxipng::optimize(input, output, opts) {
Ok(_) => (),
Err(x) => panic!("{}", x),
};
let output = output.path().unwrap();
assert!(output.exists());
let png = match png::PngData::new(output, opts.fix_errors) {
@ -56,8 +57,7 @@ fn test_it_converts(
#[test]
fn issue_29() {
let input = PathBuf::from("tests/files/issue-29.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -73,9 +73,8 @@ fn issue_29() {
#[test]
fn issue_42() {
let input = PathBuf::from("tests/files/issue_42.png");
let mut opts = get_opts(&input);
let (output, mut opts) = get_opts(&input);
opts.interlace = Some(1);
let output = opts.out_file.clone().unwrap();
let png = png::PngData::new(&input, opts.fix_errors).unwrap();
@ -83,10 +82,11 @@ fn issue_42() {
assert_eq!(png.ihdr_data.color_type, ColorType::GrayscaleAlpha);
assert_eq!(png.ihdr_data.bit_depth, BitDepth::Eight);
match oxipng::optimize(&input, &opts) {
match oxipng::optimize(&input, &output, &opts) {
Ok(_) => (),
Err(x) => panic!("{}", x),
};
let output = output.path().unwrap();
assert!(output.exists());
let png = match png::PngData::new(&output, opts.fix_errors) {
@ -107,8 +107,7 @@ fn issue_42() {
#[test]
fn issue_52_01() {
let input = PathBuf::from("tests/files/issue-52-01.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -124,8 +123,7 @@ fn issue_52_01() {
#[test]
fn issue_52_02() {
let input = PathBuf::from("tests/files/issue-52-02.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -141,8 +139,7 @@ fn issue_52_02() {
#[test]
fn issue_52_03() {
let input = PathBuf::from("tests/files/issue-52-03.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -158,8 +155,7 @@ fn issue_52_03() {
#[test]
fn issue_52_04() {
let input = PathBuf::from("tests/files/issue-52-04.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -175,8 +171,7 @@ fn issue_52_04() {
#[test]
fn issue_52_05() {
let input = PathBuf::from("tests/files/issue-52-05.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -192,8 +187,7 @@ fn issue_52_05() {
#[test]
fn issue_52_06() {
let input = PathBuf::from("tests/files/issue-52-06.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -209,8 +203,7 @@ fn issue_52_06() {
#[test]
fn issue_56() {
let input = PathBuf::from("tests/files/issue-56.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -226,8 +219,7 @@ fn issue_56() {
#[test]
fn issue_58() {
let input = PathBuf::from("tests/files/issue-58.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -243,8 +235,7 @@ fn issue_58() {
#[test]
fn issue_59() {
let input = PathBuf::from("tests/files/issue-59.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -260,8 +251,7 @@ fn issue_59() {
#[test]
fn issue_60() {
let input = PathBuf::from("tests/files/issue-60.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -277,8 +267,7 @@ fn issue_60() {
#[test]
fn issue_80() {
let input = PathBuf::from("tests/files/issue-80.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -294,8 +283,7 @@ fn issue_80() {
#[test]
fn issue_82() {
let input = PathBuf::from("tests/files/issue-82.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -311,8 +299,7 @@ fn issue_82() {
#[test]
fn issue_89() {
let input = PathBuf::from("tests/files/issue-89.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -328,8 +315,7 @@ fn issue_89() {
#[test]
fn issue_92_filter_0() {
let input = PathBuf::from("tests/files/issue-92.png");
let opts = get_opts(&input);
let output = opts.out_file.clone().unwrap();
let (output, opts) = get_opts(&input);
test_it_converts(
&input,
@ -345,12 +331,11 @@ fn issue_92_filter_0() {
#[test]
fn issue_92_filter_5() {
let input = PathBuf::from("tests/files/issue-92.png");
let mut opts = get_opts(&input);
let (_, mut opts) = get_opts(&input);
let mut filter = HashSet::new();
filter.insert(5);
opts.filter = filter;
opts.out_file = Some(input.with_extension("-f5-out.png").to_owned());
let output = opts.out_file.clone().unwrap();
let output = OutFile::Path(Some(input.with_extension("-f5-out.png").to_owned()));
test_it_converts(
&input,