Retain filtered idat
This commit is contained in:
parent
82ce66399b
commit
0e3d7cda94
3 changed files with 13 additions and 10 deletions
|
|
@ -122,15 +122,15 @@ impl Evaluator {
|
||||||
if deadline.passed() {
|
if deadline.passed() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if let Ok(idat_data) = deflate::deflate(
|
let filtered = image.filter_image(filter);
|
||||||
&image.filter_image(filter),
|
if let Ok(idat_data) =
|
||||||
compression,
|
deflate::deflate(&filtered, compression, &best_candidate_size)
|
||||||
&best_candidate_size,
|
{
|
||||||
) {
|
|
||||||
best_candidate_size.set_min(idat_data.len());
|
best_candidate_size.set_min(idat_data.len());
|
||||||
let new = Candidate {
|
let new = Candidate {
|
||||||
image: PngData {
|
image: PngData {
|
||||||
idat_data,
|
idat_data,
|
||||||
|
filtered,
|
||||||
raw: Arc::clone(&image),
|
raw: Arc::clone(&image),
|
||||||
},
|
},
|
||||||
filter,
|
filter,
|
||||||
|
|
|
||||||
|
|
@ -548,7 +548,7 @@ fn optimize_png(
|
||||||
info!("Trying: {}", trial.filter);
|
info!("Trying: {}", trial.filter);
|
||||||
let original_len = idat_original_size;
|
let original_len = idat_original_size;
|
||||||
let best_size = AtomicMin::new(if opts.force { None } else { Some(original_len) });
|
let best_size = AtomicMin::new(if opts.force { None } else { Some(original_len) });
|
||||||
perform_trial(&png.raw, opts, trial, &best_size)
|
perform_trial(&png.filtered, opts, trial, &best_size)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Perform full compression trials of selected filters and determine the best
|
// Perform full compression trials of selected filters and determine the best
|
||||||
|
|
@ -585,7 +585,8 @@ fn optimize_png(
|
||||||
if deadline.passed() {
|
if deadline.passed() {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
perform_trial(&png.raw, opts, trial, &best_size)
|
let filtered = &png.raw.filter_image(trial.filter);
|
||||||
|
perform_trial(filtered, opts, trial, &best_size)
|
||||||
});
|
});
|
||||||
best.reduce_with(|i, j| {
|
best.reduce_with(|i, j| {
|
||||||
if i.1.len() < j.1.len() || (i.1.len() == j.1.len() && i.0 < j.0) {
|
if i.1.len() < j.1.len() || (i.1.len() == j.1.len() && i.0 < j.0) {
|
||||||
|
|
@ -749,12 +750,11 @@ fn perform_reductions(
|
||||||
|
|
||||||
/// Execute a compression trial
|
/// Execute a compression trial
|
||||||
fn perform_trial(
|
fn perform_trial(
|
||||||
png: &PngImage,
|
filtered: &[u8],
|
||||||
opts: &Options,
|
opts: &Options,
|
||||||
trial: TrialOptions,
|
trial: TrialOptions,
|
||||||
best_size: &AtomicMin,
|
best_size: &AtomicMin,
|
||||||
) -> Option<TrialWithData> {
|
) -> Option<TrialWithData> {
|
||||||
let filtered = &png.filter_image(trial.filter);
|
|
||||||
let new_idat = match opts.deflate {
|
let new_idat = match opts.deflate {
|
||||||
Deflaters::Libdeflater { .. } => deflate::deflate(filtered, trial.compression, best_size),
|
Deflaters::Libdeflater { .. } => deflate::deflate(filtered, trial.compression, best_size),
|
||||||
#[cfg(feature = "zopfli")]
|
#[cfg(feature = "zopfli")]
|
||||||
|
|
|
||||||
|
|
@ -47,6 +47,8 @@ pub struct PngData {
|
||||||
pub raw: Arc<PngImage>,
|
pub raw: Arc<PngImage>,
|
||||||
/// The filtered and compressed data of the IDAT chunk
|
/// The filtered and compressed data of the IDAT chunk
|
||||||
pub idat_data: Vec<u8>,
|
pub idat_data: Vec<u8>,
|
||||||
|
/// The filtered, uncompressed data of the IDAT chunk
|
||||||
|
pub filtered: Vec<u8>,
|
||||||
}
|
}
|
||||||
|
|
||||||
type PaletteWithTrns = (Option<Vec<RGBA8>>, Option<Vec<u8>>);
|
type PaletteWithTrns = (Option<Vec<RGBA8>>, Option<Vec<u8>>);
|
||||||
|
|
@ -135,10 +137,11 @@ impl PngData {
|
||||||
transparency_pixel,
|
transparency_pixel,
|
||||||
aux_headers,
|
aux_headers,
|
||||||
};
|
};
|
||||||
raw.data = raw.unfilter_image()?;
|
let unfiltered = raw.unfilter_image()?;
|
||||||
// Return the PngData
|
// Return the PngData
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
idat_data: idat_headers,
|
idat_data: idat_headers,
|
||||||
|
filtered: std::mem::replace(&mut raw.data, unfiltered),
|
||||||
raw: Arc::new(raw),
|
raw: Arc::new(raw),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue