Don't set baseline if no reductions
This commit is contained in:
parent
affd86a2e5
commit
a330998e4e
2 changed files with 29 additions and 15 deletions
24
src/lib.rs
24
src/lib.rs
|
|
@ -500,11 +500,6 @@ fn optimize_png(
|
||||||
|
|
||||||
// This will collect all versions of images and pick one that compresses best
|
// This will collect all versions of images and pick one that compresses best
|
||||||
let eval = Evaluator::new(deadline.clone());
|
let eval = Evaluator::new(deadline.clone());
|
||||||
// Usually we want transformations that are smaller than the unmodified original,
|
|
||||||
// but if we're interlacing, we have to accept a possible file size increase.
|
|
||||||
if opts.interlace.is_none() {
|
|
||||||
eval.set_baseline(png.raw.clone());
|
|
||||||
}
|
|
||||||
perform_reductions(png.raw.clone(), opts, &deadline, &eval);
|
perform_reductions(png.raw.clone(), opts, &deadline, &eval);
|
||||||
let reduction_occurred = if let Some(result) = eval.get_best_candidate() {
|
let reduction_occurred = if let Some(result) = eval.get_best_candidate() {
|
||||||
*png = result.image;
|
*png = result.image;
|
||||||
|
|
@ -663,11 +658,17 @@ fn perform_reductions(
|
||||||
deadline: &Deadline,
|
deadline: &Deadline,
|
||||||
eval: &Evaluator,
|
eval: &Evaluator,
|
||||||
) {
|
) {
|
||||||
|
// The eval baseline will be set from the original png only if we attempt any reductions
|
||||||
|
let mut baseline = Some(png.clone());
|
||||||
|
let mut reduction_occurred = false;
|
||||||
|
|
||||||
// must be done first to evaluate rest with the correct interlacing
|
// must be done first to evaluate rest with the correct interlacing
|
||||||
if let Some(interlacing) = opts.interlace {
|
if let Some(interlacing) = opts.interlace {
|
||||||
if let Some(reduced) = png.change_interlacing(interlacing) {
|
if let Some(reduced) = png.change_interlacing(interlacing) {
|
||||||
png = Arc::new(reduced);
|
png = Arc::new(reduced);
|
||||||
eval.try_image(png.clone());
|
eval.try_image(png.clone());
|
||||||
|
// If we're interlacing, we have to accept a possible file size increase
|
||||||
|
baseline = None;
|
||||||
}
|
}
|
||||||
if deadline.passed() {
|
if deadline.passed() {
|
||||||
return;
|
return;
|
||||||
|
|
@ -679,6 +680,7 @@ fn perform_reductions(
|
||||||
png = Arc::new(reduced);
|
png = Arc::new(reduced);
|
||||||
eval.try_image(png.clone());
|
eval.try_image(png.clone());
|
||||||
report_reduction(&png);
|
report_reduction(&png);
|
||||||
|
reduction_occurred = true;
|
||||||
}
|
}
|
||||||
if deadline.passed() {
|
if deadline.passed() {
|
||||||
return;
|
return;
|
||||||
|
|
@ -700,6 +702,7 @@ fn perform_reductions(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
report_reduction(&png);
|
report_reduction(&png);
|
||||||
|
reduction_occurred = true;
|
||||||
}
|
}
|
||||||
if deadline.passed() {
|
if deadline.passed() {
|
||||||
return;
|
return;
|
||||||
|
|
@ -711,13 +714,22 @@ fn perform_reductions(
|
||||||
png = Arc::new(reduced);
|
png = Arc::new(reduced);
|
||||||
eval.try_image(png.clone());
|
eval.try_image(png.clone());
|
||||||
report_reduction(&png);
|
report_reduction(&png);
|
||||||
|
reduction_occurred = true;
|
||||||
}
|
}
|
||||||
if deadline.passed() {
|
if deadline.passed() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
try_alpha_reductions(png, &opts.alphas, eval);
|
if try_alpha_reductions(png, &opts.alphas, eval) {
|
||||||
|
reduction_occurred = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(baseline) = baseline {
|
||||||
|
if reduction_occurred {
|
||||||
|
eval.set_baseline(baseline);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
|
|
||||||
|
|
@ -14,16 +14,18 @@ pub(crate) fn try_alpha_reductions(
|
||||||
png: Arc<PngImage>,
|
png: Arc<PngImage>,
|
||||||
alphas: &IndexSet<AlphaOptim>,
|
alphas: &IndexSet<AlphaOptim>,
|
||||||
eval: &Evaluator,
|
eval: &Evaluator,
|
||||||
) {
|
) -> bool {
|
||||||
if alphas.is_empty() {
|
match png.ihdr.color_type {
|
||||||
return;
|
ColorType::RGBA | ColorType::GrayscaleAlpha if !alphas.is_empty() => {
|
||||||
|
alphas
|
||||||
|
.par_iter()
|
||||||
|
.with_max_len(1)
|
||||||
|
.filter_map(|&alpha| filtered_alpha_channel(&png, alpha))
|
||||||
|
.for_each(|image| eval.try_image(Arc::new(image)));
|
||||||
|
true
|
||||||
|
}
|
||||||
|
_ => false,
|
||||||
}
|
}
|
||||||
|
|
||||||
alphas
|
|
||||||
.par_iter()
|
|
||||||
.with_max_len(1)
|
|
||||||
.filter_map(|&alpha| filtered_alpha_channel(&png, alpha))
|
|
||||||
.for_each(|image| eval.try_image(Arc::new(image)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn filtered_alpha_channel(png: &PngImage, optim: AlphaOptim) -> Option<PngImage> {
|
pub fn filtered_alpha_channel(png: &PngImage, optim: AlphaOptim) -> Option<PngImage> {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue