Include PLTE/tRNS size in evaluations
This commit is contained in:
parent
c97572be3e
commit
798a120926
3 changed files with 27 additions and 6 deletions
|
|
@ -30,7 +30,7 @@ pub struct Candidate {
|
||||||
impl Candidate {
|
impl Candidate {
|
||||||
fn cmp_key(&self) -> impl Ord {
|
fn cmp_key(&self) -> impl Ord {
|
||||||
(
|
(
|
||||||
self.image.idat_data.len(),
|
self.image.estimated_output_size(),
|
||||||
self.image.raw.data.len(),
|
self.image.raw.data.len(),
|
||||||
self.image.raw.ihdr.bit_depth,
|
self.image.raw.ihdr.bit_depth,
|
||||||
self.filter,
|
self.filter,
|
||||||
|
|
@ -134,7 +134,6 @@ impl Evaluator {
|
||||||
if let Ok(idat_data) =
|
if let Ok(idat_data) =
|
||||||
deflate::deflate(&filtered, compression, &best_candidate_size)
|
deflate::deflate(&filtered, compression, &best_candidate_size)
|
||||||
{
|
{
|
||||||
best_candidate_size.set_min(idat_data.len());
|
|
||||||
let new = Candidate {
|
let new = Candidate {
|
||||||
image: PngData {
|
image: PngData {
|
||||||
idat_data,
|
idat_data,
|
||||||
|
|
@ -145,6 +144,7 @@ impl Evaluator {
|
||||||
is_reduction,
|
is_reduction,
|
||||||
nth,
|
nth,
|
||||||
};
|
};
|
||||||
|
best_candidate_size.set_min(new.image.estimated_output_size());
|
||||||
|
|
||||||
#[cfg(feature = "parallel")]
|
#[cfg(feature = "parallel")]
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -134,6 +134,27 @@ impl PngData {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Return an estimate of the output size
|
||||||
|
pub fn estimated_output_size(&self) -> usize {
|
||||||
|
// Add the size of the PLTE and tRNS chunks to the compressed idat size
|
||||||
|
// This can help with evaluation of very small data
|
||||||
|
let size = self.idat_data.len();
|
||||||
|
size + match &self.raw.ihdr.color_type {
|
||||||
|
ColorType::Indexed { palette } => {
|
||||||
|
let plte = 12 + palette.len() * 3;
|
||||||
|
let trns = palette.iter().filter(|p| p.a != 255).count();
|
||||||
|
if trns != 0 {
|
||||||
|
plte + 12 + trns
|
||||||
|
} else {
|
||||||
|
plte
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ColorType::Grayscale { transparent_shade } if transparent_shade.is_some() => 12 + 2,
|
||||||
|
ColorType::RGB { transparent_color } if transparent_color.is_some() => 12 + 6,
|
||||||
|
_ => 0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Format the `PngData` struct into a valid PNG bytestream
|
/// Format the `PngData` struct into a valid PNG bytestream
|
||||||
pub fn output(&self) -> Vec<u8> {
|
pub fn output(&self) -> Vec<u8> {
|
||||||
// PNG header
|
// PNG header
|
||||||
|
|
|
||||||
|
|
@ -147,7 +147,7 @@ fn issue_52_02() {
|
||||||
None,
|
None,
|
||||||
RGBA,
|
RGBA,
|
||||||
BitDepth::Eight,
|
BitDepth::Eight,
|
||||||
INDEXED,
|
RGBA,
|
||||||
BitDepth::Eight,
|
BitDepth::Eight,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
@ -159,7 +159,7 @@ fn issue_52_03() {
|
||||||
None,
|
None,
|
||||||
RGBA,
|
RGBA,
|
||||||
BitDepth::Eight,
|
BitDepth::Eight,
|
||||||
INDEXED,
|
RGBA,
|
||||||
BitDepth::Eight,
|
BitDepth::Eight,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
@ -195,8 +195,8 @@ fn issue_52_06() {
|
||||||
None,
|
None,
|
||||||
RGBA,
|
RGBA,
|
||||||
BitDepth::Eight,
|
BitDepth::Eight,
|
||||||
INDEXED,
|
RGBA,
|
||||||
BitDepth::Two,
|
BitDepth::Eight,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue