From d8b7ebaf47287b15f27567b041c3a2accff85383 Mon Sep 17 00:00:00 2001 From: andrews05 Date: Wed, 17 May 2023 12:53:05 +1200 Subject: [PATCH] Further small reduction improvements (#504) --- benches/reductions.rs | 52 ++- src/colors.rs | 10 +- src/lib.rs | 51 +-- src/png/mod.rs | 22 +- src/reduction/color.rs | 235 ++++++++------ src/reduction/mod.rs | 62 +++- src/reduction/palette.rs | 301 ++++++++++-------- .../grayscale_8_should_be_grayscale_4.png | Bin 14680 -> 67607 bytes .../files/grayscale_8_should_be_palette_8.png | Bin 0 -> 42482 bytes tests/files/palette_8_should_be_rgb.png | Bin 0 -> 195 bytes tests/files/palette_8_should_be_rgba.png | Bin 0 -> 1715 bytes tests/flags.rs | 8 +- tests/interlaced.rs | 15 +- tests/reduction.rs | 119 +++++-- 14 files changed, 533 insertions(+), 342 deletions(-) create mode 100644 tests/files/grayscale_8_should_be_palette_8.png create mode 100644 tests/files/palette_8_should_be_rgb.png create mode 100644 tests/files/palette_8_should_be_rgba.png diff --git a/benches/reductions.rs b/benches/reductions.rs index dc97effb..28803a38 100644 --- a/benches/reductions.rs +++ b/benches/reductions.rs @@ -158,7 +158,7 @@ fn reductions_rgba_to_grayscale_alpha_16(b: &mut Bencher) { )); let png = PngData::new(&input, false).unwrap(); - b.iter(|| color::reduce_rgb_to_grayscale(&png.raw)); + b.iter(|| color::reduced_rgb_to_grayscale(&png.raw)); } #[bench] @@ -168,7 +168,7 @@ fn reductions_rgba_to_grayscale_alpha_8(b: &mut Bencher) { )); let png = PngData::new(&input, false).unwrap(); - b.iter(|| color::reduce_rgb_to_grayscale(&png.raw)); + b.iter(|| color::reduced_rgb_to_grayscale(&png.raw)); } #[bench] @@ -179,7 +179,7 @@ fn reductions_rgba_to_grayscale_16(b: &mut Bencher) { let png = PngData::new(&input, false).unwrap(); b.iter(|| { - color::reduce_rgb_to_grayscale(&png.raw) + color::reduced_rgb_to_grayscale(&png.raw) .and_then(|r| alpha::reduced_alpha_channel(&r, false)) }); } @@ -192,7 +192,7 @@ fn reductions_rgba_to_grayscale_8(b: &mut Bencher) { let png = PngData::new(&input, false).unwrap(); b.iter(|| { - color::reduce_rgb_to_grayscale(&png.raw) + color::reduced_rgb_to_grayscale(&png.raw) .and_then(|r| alpha::reduced_alpha_channel(&r, false)) }); } @@ -204,7 +204,7 @@ fn reductions_rgb_to_grayscale_16(b: &mut Bencher) { )); let png = PngData::new(&input, false).unwrap(); - b.iter(|| color::reduce_rgb_to_grayscale(&png.raw)); + b.iter(|| color::reduced_rgb_to_grayscale(&png.raw)); } #[bench] @@ -212,7 +212,7 @@ fn reductions_rgb_to_grayscale_8(b: &mut Bencher) { let input = test::black_box(PathBuf::from("tests/files/rgb_8_should_be_grayscale_8.png")); let png = PngData::new(&input, false).unwrap(); - b.iter(|| color::reduce_rgb_to_grayscale(&png.raw)); + b.iter(|| color::reduced_rgb_to_grayscale(&png.raw)); } #[bench] @@ -220,7 +220,7 @@ fn reductions_rgba_to_palette_8(b: &mut Bencher) { let input = test::black_box(PathBuf::from("tests/files/rgba_8_should_be_palette_8.png")); let png = PngData::new(&input, false).unwrap(); - b.iter(|| color::reduce_to_palette(&png.raw)); + b.iter(|| color::reduced_to_indexed(&png.raw)); } #[bench] @@ -228,7 +228,27 @@ fn reductions_rgb_to_palette_8(b: &mut Bencher) { let input = test::black_box(PathBuf::from("tests/files/rgb_8_should_be_palette_8.png")); let png = PngData::new(&input, false).unwrap(); - b.iter(|| color::reduce_to_palette(&png.raw)); + b.iter(|| color::reduced_to_indexed(&png.raw)); +} + +#[bench] +fn reductions_grayscale_8_to_palette_8(b: &mut Bencher) { + let input = test::black_box(PathBuf::from( + "tests/files/grayscale_8_should_be_palette_8.png", + )); + let png = PngData::new(&input, false).unwrap(); + + b.iter(|| color::reduced_to_indexed(&png.raw)); +} + +#[bench] +fn reductions_palette_8_to_grayscale_8(b: &mut Bencher) { + let input = test::black_box(PathBuf::from( + "tests/files/palette_8_should_be_grayscale_8.png", + )); + let png = PngData::new(&input, false).unwrap(); + + b.iter(|| color::indexed_to_channels(&png.raw)); } #[bench] @@ -238,7 +258,7 @@ fn reductions_palette_duplicate_reduction(b: &mut Bencher) { )); let png = PngData::new(&input, false).unwrap(); - b.iter(|| palette::optimized_palette(&png.raw, false)); + b.iter(|| palette::reduced_palette(&png.raw, false)); } #[bench] @@ -248,7 +268,7 @@ fn reductions_palette_unused_reduction(b: &mut Bencher) { )); let png = PngData::new(&input, false).unwrap(); - b.iter(|| palette::optimized_palette(&png.raw, false)); + b.iter(|| palette::reduced_palette(&png.raw, false)); } #[bench] @@ -258,7 +278,17 @@ fn reductions_palette_full_reduction(b: &mut Bencher) { )); let png = PngData::new(&input, false).unwrap(); - b.iter(|| palette::optimized_palette(&png.raw, false)); + b.iter(|| palette::reduced_palette(&png.raw, false)); +} + +#[bench] +fn reductions_palette_sort(b: &mut Bencher) { + let input = test::black_box(PathBuf::from( + "tests/files/palette_8_should_be_palette_8.png", + )); + let png = PngData::new(&input, false).unwrap(); + + b.iter(|| palette::sorted_palette(&png.raw)); } #[bench] diff --git a/src/colors.rs b/src/colors.rs index 22f24f19..59cd589e 100644 --- a/src/colors.rs +++ b/src/colors.rs @@ -70,13 +70,21 @@ impl ColorType { matches!(self, ColorType::RGB { .. } | ColorType::RGBA) } + #[inline] + pub(crate) fn is_grayscale(&self) -> bool { + matches!( + self, + ColorType::Grayscale { .. } | ColorType::GrayscaleAlpha + ) + } + #[inline] pub(crate) fn has_alpha(&self) -> bool { matches!(self, ColorType::GrayscaleAlpha | ColorType::RGBA) } #[inline] - pub fn has_trns(&self) -> bool { + pub(crate) fn has_trns(&self) -> bool { match self { ColorType::Grayscale { transparent_shade } => transparent_shade.is_some(), ColorType::RGB { transparent_color } => transparent_color.is_some(), diff --git a/src/lib.rs b/src/lib.rs index c3927d45..4c43e287 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -564,7 +564,12 @@ fn optimize_png( // Do this first so that reductions can ignore certain chunks such as bKGD perform_strip(png, opts); - if let Some(new_png) = optimize_raw(png.raw.clone(), opts, deadline, Some(idat_original_size)) { + let max_size = if opts.force { + None + } else { + Some(png.estimated_output_size()) + }; + if let Some(new_png) = optimize_raw(png.raw.clone(), opts, deadline, max_size) { png.raw = new_png.raw; png.idat_data = new_png.idat_data; } @@ -611,7 +616,7 @@ fn optimize_raw( mut png: Arc, opts: &Options, deadline: Arc, - max_idat_size: Option, + max_size: Option, ) -> Option { // Must use normal (lazy) compression, as faster ones (greedy) are not representative let eval_compression = 5; @@ -673,15 +678,10 @@ fn optimize_raw( }; if trial.compression > 0 && trial.compression <= eval_compression { // No further compression required - let idat_data = eval_result.image.idat_data; - if opts.force || idat_data.len() < max_idat_size.unwrap_or(usize::MAX) { - Some((trial, idat_data)) - } else { - None - } + Some((trial, eval_result.image.idat_data)) } else { debug!("Trying: {}", trial.filter); - let best_size = AtomicMin::new(if opts.force { None } else { max_idat_size }); + let best_size = AtomicMin::new(max_size); perform_trial(&eval_result.image.filtered, opts, trial, &best_size) } } else { @@ -712,7 +712,7 @@ fn optimize_raw( debug!("Trying: {} filters", results.len()); - let best_size = AtomicMin::new(if opts.force { None } else { max_idat_size }); + let best_size = AtomicMin::new(max_size); let results_iter = results.into_par_iter().with_max_len(1); let best = results_iter.filter_map(|trial| { if deadline.passed() { @@ -730,34 +730,37 @@ fn optimize_raw( }) }; - if let Some((opts, idat_data)) = best { - debug!("Found better combination:"); - debug!( - " zc = {} f = {:8} {} bytes", - opts.compression, - opts.filter, - idat_data.len() - ); - return Some(PngData { + if let Some((trial, idat_data)) = best { + let image = PngData { raw: png, // The filtered data has not been retained here, but we don't need to return it filtered: vec![], idat_data, - }); + }; + if image.estimated_output_size() < max_size.unwrap_or(usize::MAX) { + debug!("Found better combination:"); + debug!( + " zc = {} f = {:8} {} bytes", + trial.compression, + trial.filter, + image.idat_data.len() + ); + return Some(image); + } } } else if let Some(result) = eval_result { // If idat_recoding is off and reductions were attempted but ended up choosing the baseline, // we should still check if the evaluator compressed the baseline smaller than the original. - let idat_data = &result.image.idat_data; - if idat_data.len() < max_idat_size.unwrap_or(usize::MAX) { + let image = result.image; + if image.estimated_output_size() < max_size.unwrap_or(usize::MAX) { debug!("Found better combination:"); debug!( " zc = {} f = {:8} {} bytes", eval_compression, result.filter, - idat_data.len() + image.idat_data.len() ); - return Some(result.image); + return Some(image); } } diff --git a/src/png/mod.rs b/src/png/mod.rs index dd37f69c..c25c52a9 100644 --- a/src/png/mod.rs +++ b/src/png/mod.rs @@ -186,28 +186,12 @@ impl PngData { match &self.raw.ihdr.color_type { ColorType::Indexed { palette } => { let mut palette_data = Vec::with_capacity(palette.len() * 3); - let mut max_palette_size = 1 << (self.raw.ihdr.bit_depth as u8); - // Ensure bKGD color doesn't get truncated from palette - if let Some(&idx) = self.raw.aux_headers.get(b"bKGD").and_then(|b| b.first()) { - max_palette_size = max_palette_size.max(idx as usize + 1); - } - for px in palette.iter().take(max_palette_size) { + for px in palette { palette_data.extend_from_slice(px.rgb().as_slice()); } write_png_block(b"PLTE", &palette_data, &mut output); - let num_transparent = palette.iter().take(max_palette_size).enumerate().fold( - 0, - |prev, (index, px)| { - if px.a == 255 { - prev - } else { - index + 1 - } - }, - ); - if num_transparent > 0 { - let trns_data: Vec<_> = - palette[0..num_transparent].iter().map(|px| px.a).collect(); + if let Some(last_trns) = palette.iter().rposition(|px| px.a != 255) { + let trns_data: Vec<_> = palette[0..=last_trns].iter().map(|px| px.a).collect(); write_png_block(b"tRNS", &trns_data, &mut output); } } diff --git a/src/reduction/color.rs b/src/reduction/color.rs index 6eb9700a..177ae1d6 100644 --- a/src/reduction/color.rs +++ b/src/reduction/color.rs @@ -1,103 +1,88 @@ use crate::colors::{BitDepth, ColorType}; use crate::headers::IhdrData; use crate::png::PngImage; -use indexmap::IndexMap; -use rgb::{ComponentMap, FromSlice, RGBA, RGBA8}; +use indexmap::IndexSet; +use rgb::alt::Gray; +use rgb::{ComponentMap, ComponentSlice, FromSlice, RGB, RGBA, RGBA8}; use rustc_hash::FxHasher; use std::hash::{BuildHasherDefault, Hash}; -type FxIndexMap = IndexMap>; +type FxIndexSet = IndexSet>; -fn reduce_scanline_to_palette( +/// Maximum size difference between indexed and channels to consider a candidate for evaluation +pub const INDEXED_MAX_DIFF: usize = 20000; + +fn build_palette( iter: impl IntoIterator, - palette: &mut FxIndexMap, reduced: &mut Vec, -) -> bool +) -> Option> where T: Eq + Hash, { + let mut palette = FxIndexSet::default(); + palette.reserve(257); for pixel in iter { - let idx = if let Some(&idx) = palette.get(&pixel) { - idx - } else { - let len = palette.len(); - if len == 256 { - return false; - } - let idx = len as u8; - palette.insert(pixel, idx); - idx - }; - reduced.push(idx); + let (idx, _) = palette.insert_full(pixel); + if idx == 256 { + return None; + } + reduced.push(idx as u8); } - true + Some(palette) } #[must_use] -pub fn reduce_to_palette(png: &PngImage) -> Option { - if png.ihdr.bit_depth != BitDepth::Eight || png.channels_per_pixel() == 1 { +pub fn reduced_to_indexed(png: &PngImage) -> Option { + if png.ihdr.bit_depth != BitDepth::Eight { return None; } - let mut raw_data = Vec::with_capacity(png.data.len()); - let mut palette = FxIndexMap::default(); - palette.reserve(257); - let ok = if let ColorType::RGB { transparent_color } = png.ihdr.color_type { - // Convert the RGB16 transparency to RGB8 - let transparency_pixel = transparent_color.map(|t| t.map(|c| c as u8)); - reduce_scanline_to_palette( - png.data.as_rgb().iter().cloned().map(|px| { - px.alpha(if Some(px) != transparency_pixel { - 255 - } else { - 0 + if matches!(png.ihdr.color_type, ColorType::Indexed { .. }) { + return None; + } + + let mut raw_data = Vec::with_capacity(png.data.len() / png.channels_per_pixel()); + let mut palette: Vec<_> = match png.ihdr.color_type { + ColorType::Grayscale { transparent_shade } => { + let pmap = build_palette(png.data.as_gray().iter().cloned(), &mut raw_data)?; + // Convert the Gray16 transparency to Gray8 + let transparency_pixel = transparent_shade.map(|t| Gray::from(t as u8)); + pmap.into_iter() + .map(|px| { + RGB::from(px).alpha(if Some(px) != transparency_pixel { + 255 + } else { + 0 + }) }) - }), - &mut palette, - &mut raw_data, - ) - } else if png.ihdr.color_type == ColorType::GrayscaleAlpha { - reduce_scanline_to_palette( - png.data.as_gray_alpha().iter().cloned().map(|px| RGBA { - r: px.0, - g: px.0, - b: px.0, - a: px.1, - }), - &mut palette, - &mut raw_data, - ) - } else { - debug_assert_eq!(png.ihdr.color_type, ColorType::RGBA); - reduce_scanline_to_palette( - png.data.as_rgba().iter().cloned(), - &mut palette, - &mut raw_data, - ) + .collect() + } + ColorType::RGB { transparent_color } => { + let pmap = build_palette(png.data.as_rgb().iter().cloned(), &mut raw_data)?; + // Convert the RGB16 transparency to RGB8 + let transparency_pixel = transparent_color.map(|t| t.map(|c| c as u8)); + pmap.into_iter() + .map(|px| { + px.alpha(if Some(px) != transparency_pixel { + 255 + } else { + 0 + }) + }) + .collect() + } + ColorType::GrayscaleAlpha => { + let pmap = build_palette(png.data.as_gray_alpha().iter().cloned(), &mut raw_data)?; + pmap.into_iter().map(RGBA::from).collect() + } + ColorType::RGBA => { + let pmap = build_palette(png.data.as_rgba().iter().cloned(), &mut raw_data)?; + pmap.into_iter().collect() + } + _ => return None, }; - if !ok { - return None; - } - - let num_transparent = palette - .iter() - .filter_map(|(px, &idx)| { - if px.a != 255 { - Some(idx as usize + 1) - } else { - None - } - }) - .max(); - let trns_size = num_transparent.map_or(0, |n| n + 8); - - let headers_size = palette.len() * 3 + 8 + trns_size; - if raw_data.len() + headers_size > png.data.len() { - // Reduction would result in a larger image - return None; - } let mut aux_headers = png.aux_headers.clone(); - if let Some(bkgd_header) = png.aux_headers.get(b"bKGD") { + if let Some(bkgd_header) = aux_headers.remove(b"bKGD") { let bg = if png.ihdr.color_type.is_rgb() && bkgd_header.len() == 6 { // In bKGD 16-bit values are used even for 8-bit images Some(RGBA8::new( @@ -106,7 +91,7 @@ pub fn reduce_to_palette(png: &PngImage) -> Option { bkgd_header[5], 255, )) - } else if png.ihdr.color_type == ColorType::GrayscaleAlpha && bkgd_header.len() == 2 { + } else if png.ihdr.color_type.is_grayscale() && bkgd_header.len() == 2 { Some(RGBA8::new( bkgd_header[1], bkgd_header[1], @@ -117,16 +102,15 @@ pub fn reduce_to_palette(png: &PngImage) -> Option { None }; if let Some(bg) = bg { - let entry = if let Some(&entry) = palette.get(&bg) { - entry - } else if palette.len() < 256 { - let entry = palette.len() as u8; - palette.insert(bg, entry); - entry - } else { - return None; // No space in palette to store the bg as an index - }; - aux_headers.insert(*b"bKGD", vec![entry]); + let idx = palette.iter().position(|&px| px == bg).or_else(|| { + if palette.len() < 256 { + palette.push(bg); + Some(palette.len() - 1) + } else { + None // No space in palette to store the bg as an index + } + })?; + aux_headers.insert(*b"bKGD", vec![idx as u8]); } } @@ -135,17 +119,10 @@ pub fn reduce_to_palette(png: &PngImage) -> Option { aux_headers.insert(*b"sBIT", sbit_header.iter().cloned().take(3).collect()); } - let mut palette_vec = vec![RGBA8::new(0, 0, 0, 0); palette.len()]; - for (color, idx) in palette { - palette_vec[idx as usize] = color; - } - Some(PngImage { data: raw_data, ihdr: IhdrData { - color_type: ColorType::Indexed { - palette: palette_vec, - }, + color_type: ColorType::Indexed { palette }, ..png.ihdr }, aux_headers, @@ -153,7 +130,7 @@ pub fn reduce_to_palette(png: &PngImage) -> Option { } #[must_use] -pub fn reduce_rgb_to_grayscale(png: &PngImage) -> Option { +pub fn reduced_rgb_to_grayscale(png: &PngImage) -> Option { if !png.ihdr.color_type.is_rgb() { return None; } @@ -204,3 +181,67 @@ pub fn reduce_rgb_to_grayscale(png: &PngImage) -> Option { aux_headers, }) } + +/// Attempt to convert indexed to a different color type, returning the resulting image if successful +#[must_use] +pub fn indexed_to_channels(png: &PngImage) -> Option { + if png.ihdr.bit_depth != BitDepth::Eight { + return None; + } + let palette = match &png.ihdr.color_type { + ColorType::Indexed { palette } => palette, + _ => return None, + }; + + // Determine which channels are required + let is_gray = palette.iter().all(|c| c.r == c.g && c.g == c.b); + let has_alpha = palette.iter().any(|c| c.a != 255); + let color_type = match (is_gray, has_alpha) { + (false, true) => ColorType::RGBA, + (false, false) => ColorType::RGB { + transparent_color: None, + }, + (true, true) => ColorType::GrayscaleAlpha, + (true, false) => ColorType::Grayscale { + transparent_shade: None, + }, + }; + + // Don't proceed if output would be too much larger + let out_size = color_type.channels_per_pixel() as usize * png.data.len(); + if out_size - png.data.len() > INDEXED_MAX_DIFF { + return None; + } + + // Construct the new data + let black = RGBA::new(0, 0, 0, 255); + let ch_start = if is_gray { 2 } else { 0 }; + let ch_end = if has_alpha { 3 } else { 2 }; + let mut data = Vec::with_capacity(out_size); + for b in &png.data { + let color = palette.get(*b as usize).unwrap_or(&black); + data.extend_from_slice(&color.as_slice()[ch_start..=ch_end]); + } + + // Update bKGD if it exists + let mut aux_headers = png.aux_headers.clone(); + if let Some(idx) = aux_headers.remove(b"bKGD").and_then(|b| b.first().cloned()) { + if let Some(color) = palette.get(idx as usize) { + let bkgd = if is_gray { + vec![0, color.r] + } else { + vec![0, color.r, 0, color.g, 0, color.b] + }; + aux_headers.insert(*b"bKGD", bkgd); + } + } + + Some(PngImage { + ihdr: IhdrData { + color_type, + ..png.ihdr + }, + data, + aux_headers, + }) +} diff --git a/src/reduction/mod.rs b/src/reduction/mod.rs index e6888216..f5539096 100644 --- a/src/reduction/mod.rs +++ b/src/reduction/mod.rs @@ -51,7 +51,16 @@ pub(crate) fn perform_reductions( // Attempt to reduce RGB to grayscale // This is just removal of bytes and does not need to be evaluated if opts.color_type_reduction && !deadline.passed() { - if let Some(reduced) = reduce_rgb_to_grayscale(&png) { + if let Some(reduced) = reduced_rgb_to_grayscale(&png) { + png = Arc::new(reduced); + reduction_occurred = true; + } + } + + // Attempt to reduce the palette + // This may change bytes but should always be beneficial + if opts.palette_reduction && !deadline.passed() { + if let Some(reduced) = reduced_palette(&png, opts.optimize_alpha) { png = Arc::new(reduced); reduction_occurred = true; } @@ -65,9 +74,9 @@ pub(crate) fn perform_reductions( if opts.color_type_reduction && !deadline.passed() { if let Some(reduced) = reduced_alpha_channel(&png, opts.optimize_alpha) { png = Arc::new(reduced); - // If the reduction requires a tRNS chunk, enter this into the evaluator - // Otherwise it is just removal of bytes and should become the baseline - if png.ihdr.color_type.has_trns() { + // For small differences, if a tRNS chunk is required then enter this into the evaluator + // Otherwise it is mostly just removal of bytes and should become the baseline + if png.ihdr.color_type.has_trns() && baseline.data.len() - png.data.len() <= 1000 { eval.try_image(png.clone()); evaluation_added = true; } else { @@ -77,33 +86,52 @@ pub(crate) fn perform_reductions( } } - // Attempt to reduce the palette size + // Attempt to sort the palette if opts.palette_reduction && !deadline.passed() { - if let Some(reduced) = optimized_palette(&png, opts.optimize_alpha) { + if let Some(reduced) = sorted_palette(&png) { png = Arc::new(reduced); eval.try_image(png.clone()); evaluation_added = true; } } - // Attempt to reduce to palette + // Attempt to convert from indexed to channels + // This may give a better result due to dropping the PLTE chunk if opts.color_type_reduction && !deadline.passed() { - if let Some(reduced) = reduce_to_palette(&png) { - png = Arc::new(reduced); - // Make sure the palette gets sorted (ideally, this should be done within reduce_to_palette) - if let Some(reduced) = optimized_palette(&png, opts.optimize_alpha) { - png = Arc::new(reduced); - } - eval.try_image(png.clone()); + if let Some(reduced) = indexed_to_channels(&png) { + // This result should not be passed on to subsequent reductions + eval.try_image(Arc::new(reduced)); evaluation_added = true; } } + // Attempt to reduce to indexed + let mut indexed = None; + if opts.color_type_reduction && !deadline.passed() { + if let Some(reduced) = reduced_to_indexed(&png) { + // Make sure the palette gets sorted (but don't bother evaluating both results) + let new = Arc::new(sorted_palette(&reduced).unwrap_or(reduced)); + // For relatively small differences, enter this into the evaluator + // Otherwise we're confident enough for it to become the baseline + if png.data.len() - new.data.len() <= INDEXED_MAX_DIFF { + eval.try_image(new.clone()); + evaluation_added = true; + } else { + baseline = new.clone(); + reduction_occurred = true; + } + indexed = Some(new); + } + } + // Attempt to reduce to a lower bit depth if opts.bit_depth_reduction && !deadline.passed() { - if let Some(reduced) = reduced_bit_depth_8_or_less(&png, 1) { - png = Arc::new(reduced); - eval.try_image(png.clone()); + // Try reducing the previous png, falling back to the indexed one if it exists + // This allows a grayscale depth reduction to be preferred over an indexed depth reduction + let reduced = reduced_bit_depth_8_or_less(&png, 1) + .or_else(|| indexed.and_then(|png| reduced_bit_depth_8_or_less(&png, 1))); + if let Some(reduced) = reduced { + eval.try_image(Arc::new(reduced)); evaluation_added = true; } } diff --git a/src/reduction/palette.rs b/src/reduction/palette.rs index 081d43db..83c14e24 100644 --- a/src/reduction/palette.rs +++ b/src/reduction/palette.rs @@ -1,180 +1,201 @@ use crate::colors::{BitDepth, ColorType}; use crate::headers::IhdrData; use crate::png::PngImage; -use indexmap::map::{Entry::*, IndexMap}; +use indexmap::IndexSet; use rgb::RGBA8; -/// Attempt to shrink and sort the palette, returning the optimized image if successful +/// Attempt to reduce the number of colors in the palette, returning the reduced image if successful #[must_use] -pub fn optimized_palette(png: &PngImage, optimize_alpha: bool) -> Option { +pub fn reduced_palette(png: &PngImage, optimize_alpha: bool) -> Option { let palette = match &png.ihdr.color_type { - ColorType::Indexed { palette } => palette, - // Can't reduce if there is no palette + ColorType::Indexed { palette } if palette.len() > 1 => palette, _ => return None, }; - if png.ihdr.bit_depth == BitDepth::One { - // Gains from 1-bit images will be at most 1 byte - // Not worth the CPU time - return None; - } - let mut palette_map = [None; 256]; - let mut used = [false; 256]; - { - // Find palette entries that are never used - match png.ihdr.bit_depth { - BitDepth::Eight => { - for &byte in &png.data { - used[byte as usize] = true; - } - } - BitDepth::Four => { - for &byte in &png.data { - used[(byte & 0x0F) as usize] = true; - used[(byte >> 4) as usize] = true; - } - } - BitDepth::Two => { - for &byte in &png.data { - used[(byte & 0x03) as usize] = true; - used[((byte >> 2) & 0x03) as usize] = true; - used[((byte >> 4) & 0x03) as usize] = true; - used[(byte >> 6) as usize] = true; - } - } - _ => unreachable!(), + let used = get_used_entries(png); + + let black = RGBA8::new(0, 0, 0, 255); + let mut condensed = IndexSet::with_capacity(palette.len()); + let mut palette_map = [0; 256]; + let mut did_change = false; + for (i, used) in used.iter().enumerate() { + if !used { + continue; } - - let mut used_enumerated: Vec<(usize, &bool)> = used.iter().enumerate().collect(); - used_enumerated.sort_by(|a, b| { - //Sort by ascending alpha and descending luma. - let color_val = |i| { - let color = palette - .get(i) - .copied() - .unwrap_or_else(|| RGBA8::new(0, 0, 0, 255)); - ((color.a as i32) << 18) - // These are coefficients for standard sRGB to luma conversion - - i32::from(color.r) * 299 - - i32::from(color.g) * 587 - - i32::from(color.b) * 114 - }; - color_val(a.0).cmp(&color_val(b.0)) - }); - - // Make sure the background is also included, but only after sorting since it may not be used in idat - if let Some(&idx) = png.aux_headers.get(b"bKGD").and_then(|b| b.first()) { - if !used[idx as usize] { - used_enumerated.push((idx as usize, &true)); - } - } - - let mut next_index = 0_u16; - let mut seen = IndexMap::with_capacity(palette.len()); - for (i, used) in used_enumerated.iter().cloned() { - if !used { - continue; - } - // There are invalid files that use pixel indices beyond palette size - let mut color = palette - .get(i) - .cloned() - .unwrap_or_else(|| RGBA8::new(0, 0, 0, 255)); - // If there are multiple fully transparent entries, reduce them into one - if optimize_alpha && color.a == 0 { - color.r = 0; - color.g = 0; - color.b = 0; - } - match seen.entry(color) { - Vacant(new) => { - palette_map[i] = Some(next_index as u8); - new.insert(next_index as u8); - next_index += 1; - } - Occupied(remap_to) => palette_map[i] = Some(*remap_to.get()), - } + // There are invalid files that use pixel indices beyond palette size + let color = *palette.get(i).unwrap_or(&black); + palette_map[i] = add_color_to_set(color, &mut condensed, optimize_alpha); + if palette_map[i] as usize != i { + did_change = true; } } - do_palette_reduction(png, palette, &palette_map) -} - -#[must_use] -fn do_palette_reduction( - png: &PngImage, - palette: &[RGBA8], - palette_map: &[Option; 256], -) -> Option { - let byte_map = palette_map_to_byte_map(png, palette_map)?; - - // Reassign data bytes to new indices - let raw_data = png.data.iter().map(|b| byte_map[*b as usize]).collect(); - + // Update bKGD if it exists, ensuring it comes last in the palette if otherwise unused let mut aux_headers = png.aux_headers.clone(); - if let Some(bkgd_header) = png.aux_headers.get(b"bKGD") { - if let Some(Some(map_to)) = bkgd_header - .first() - .and_then(|&idx| palette_map.get(idx as usize)) - { - aux_headers.insert(*b"bKGD", vec![*map_to]); + if let Some(idx) = aux_headers.remove(b"bKGD").and_then(|b| b.first().cloned()) { + if let Some(&color) = palette.get(idx as usize) { + let idx = add_color_to_set(color, &mut condensed, optimize_alpha); + aux_headers.insert(*b"bKGD", vec![idx]); } } + let data = if did_change { + // Reassign data bytes to new indices + let byte_map = palette_map_to_byte_map(png.ihdr.bit_depth, &palette_map); + png.data.iter().map(|b| byte_map[*b as usize]).collect() + } else if condensed.len() < palette.len() { + // Data is unchanged but palette will be truncated + png.data.clone() + } else { + // Nothing has changed + return None; + }; + + let palette: Vec<_> = condensed.into_iter().collect(); + Some(PngImage { ihdr: IhdrData { - color_type: ColorType::Indexed { - palette: reordered_palette(palette, palette_map), - }, + color_type: ColorType::Indexed { palette }, ..png.ihdr }, - data: raw_data, + data, aux_headers, }) } -fn palette_map_to_byte_map(png: &PngImage, palette_map: &[Option; 256]) -> Option<[u8; 256]> { - if (0..256).all(|i| palette_map[i].map_or(true, |to| to == i as u8)) { - // No reduction necessary - return None; +fn add_color_to_set(mut color: RGBA8, set: &mut IndexSet, optimize_alpha: bool) -> u8 { + // If there are multiple fully transparent entries, reduce them into one + if optimize_alpha && color.a == 0 { + color.r = 0; + color.g = 0; + color.b = 0; } + let (idx, _) = set.insert_full(color); + idx as u8 +} - let mut byte_map = [0_u8; 256]; - - // low bit-depths can be pre-computed for every byte value +fn get_used_entries(png: &PngImage) -> [bool; 256] { + let mut used = [false; 256]; match png.ihdr.bit_depth { BitDepth::Eight => { - for byte in 0..=255usize { - byte_map[byte] = palette_map[byte].unwrap_or(0) + for &byte in &png.data { + used[byte as usize] = true; } } BitDepth::Four => { - for byte in 0..=255usize { - byte_map[byte] = palette_map[byte & 0x0F].unwrap_or(0) - | (palette_map[byte >> 4].unwrap_or(0) << 4); + for &byte in &png.data { + used[(byte & 0x0F) as usize] = true; + used[(byte >> 4) as usize] = true; } } BitDepth::Two => { - for byte in 0..=255usize { - byte_map[byte] = palette_map[byte & 0x03].unwrap_or(0) - | (palette_map[(byte >> 2) & 0x03].unwrap_or(0) << 2) - | (palette_map[(byte >> 4) & 0x03].unwrap_or(0) << 4) - | (palette_map[byte >> 6].unwrap_or(0) << 6); + for &byte in &png.data { + used[(byte & 0x03) as usize] = true; + used[((byte >> 2) & 0x03) as usize] = true; + used[((byte >> 4) & 0x03) as usize] = true; + used[(byte >> 6) as usize] = true; } } - _ => {} - } - - Some(byte_map) -} - -fn reordered_palette(palette: &[RGBA8], palette_map: &[Option; 256]) -> Vec { - let max_index = palette_map.iter().cloned().flatten().max().unwrap_or(0) as usize; - let mut new_palette = vec![RGBA8::new(0, 0, 0, 255); max_index + 1]; - for (&color, &map_to) in palette.iter().zip(palette_map.iter()) { - if let Some(map_to) = map_to { - new_palette[map_to as usize] = color; + BitDepth::One => { + // Only two options, don't bother checking which are actually used + used[0] = true; + used[1] = true; } - } - new_palette + _ => unreachable!(), + }; + used +} + +fn palette_map_to_byte_map(bit_depth: BitDepth, palette_map: &[u8; 256]) -> [u8; 256] { + // Low bit-depths can be pre-computed for every byte value + match bit_depth { + BitDepth::Eight => *palette_map, + BitDepth::Four => { + let mut byte_map = [0_u8; 256]; + for byte in 0..256 { + byte_map[byte] = palette_map[byte & 0x0F] | (palette_map[byte >> 4] << 4); + } + byte_map + } + BitDepth::Two => { + let mut byte_map = [0_u8; 256]; + for byte in 0..256 { + byte_map[byte] = palette_map[byte & 0x03] + | (palette_map[(byte >> 2) & 0x03] << 2) + | (palette_map[(byte >> 4) & 0x03] << 4) + | (palette_map[byte >> 6] << 6); + } + byte_map + } + _ => unreachable!(), + } +} + +/// Attempt to sort the colors in the palette, returning the sorted image if successful +#[must_use] +pub fn sorted_palette(png: &PngImage) -> Option { + if png.ihdr.bit_depth == BitDepth::One { + // Don't bother trying to sort a 1-bit image + return None; + } + let palette = match &png.ihdr.color_type { + ColorType::Indexed { palette } => palette, + _ => return None, + }; + + let mut enumerated: Vec<_> = palette.iter().enumerate().collect(); + + // If the background is the last entry in the palette we should make sure it stays last + // Otherwise an entry that's unused by the idat could prevent reduction to a lower depth + let mut aux_headers = png.aux_headers.clone(); + let bkgd_idx = aux_headers.remove(b"bKGD").and_then(|b| b.first().cloned()); + let bkgd_last = match bkgd_idx { + Some(idx) if idx as usize + 1 == palette.len() => enumerated.pop(), + _ => None, + }; + + // Sort the palette + enumerated.sort_by(|a, b| { + // Sort by ascending alpha and descending luma + let color_val = |color: &RGBA8| { + ((color.a as i32) << 18) + // These are coefficients for standard sRGB to luma conversion + - i32::from(color.r) * 299 + - i32::from(color.g) * 587 + - i32::from(color.b) * 114 + }; + color_val(a.1).cmp(&color_val(b.1)) + }); + + if let Some(bkgd) = bkgd_last { + enumerated.push(bkgd); + } + + // Extract the new palette and determine if anything changed + let (old_map, palette): (Vec<_>, Vec) = enumerated.into_iter().unzip(); + if old_map.iter().enumerate().all(|(a, b)| a == *b) { + return None; + } + + // Construct the palette and byte maps and convert the data + let mut new_map = [0; 256]; + for (i, &v) in old_map.iter().enumerate() { + new_map[v] = i as u8; + } + let byte_map = palette_map_to_byte_map(png.ihdr.bit_depth, &new_map); + let data = png.data.iter().map(|&b| byte_map[b as usize]).collect(); + + // Update bKGD if it exists + if let Some(idx) = bkgd_idx.map(|idx| new_map[idx as usize]) { + aux_headers.insert(*b"bKGD", vec![idx]); + } + + Some(PngImage { + ihdr: IhdrData { + color_type: ColorType::Indexed { palette }, + ..png.ihdr + }, + data, + aux_headers, + }) } diff --git a/tests/files/grayscale_8_should_be_grayscale_4.png b/tests/files/grayscale_8_should_be_grayscale_4.png index c561432ec2313d8fccfe51a6bb6df4358a7d9e76..e5e62cb1d5ed420c586146a954b7f28838f6f12b 100644 GIT binary patch literal 67607 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

W07_%>0UVZiB1&)=DTNXXq2 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 literal 14680 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 cdk9k4cHBl$Q4woccYS27z4uy&y-(`Y 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 J`_RPV{{U34bz=Yk literal 0 HcmV?d00001 diff --git a/tests/flags.rs b/tests/flags.rs index 3690f21a..ebb2108e 100644 --- a/tests/flags.rs +++ b/tests/flags.rs @@ -427,8 +427,8 @@ fn interlacing_0_to_1_small_files() { }; assert_eq!(png.raw.ihdr.interlaced, Interlacing::Adam7); - assert_eq!(png.raw.ihdr.color_type.png_header_code(), INDEXED); - assert_eq!(png.raw.ihdr.bit_depth, BitDepth::One); + assert_eq!(png.raw.ihdr.color_type.png_header_code(), RGB); + assert_eq!(png.raw.ihdr.bit_depth, BitDepth::Eight); remove_file(output).ok(); } @@ -461,8 +461,8 @@ fn interlacing_1_to_0_small_files() { }; assert_eq!(png.raw.ihdr.interlaced, Interlacing::None); - assert_eq!(png.raw.ihdr.color_type.png_header_code(), INDEXED); - // the depth can't be asserted reliably, because on such small file different zlib implementations pick different depth as the best + assert_eq!(png.raw.ihdr.color_type.png_header_code(), RGB); + assert_eq!(png.raw.ihdr.bit_depth, BitDepth::Eight); remove_file(output).ok(); } diff --git a/tests/interlaced.rs b/tests/interlaced.rs index ff884b1a..52540a85 100644 --- a/tests/interlaced.rs +++ b/tests/interlaced.rs @@ -546,6 +546,17 @@ fn interlaced_palette_1_should_be_palette_1() { ); } +#[test] +fn interlaced_palette_8_should_be_grayscale_8() { + test_it_converts( + "tests/files/interlaced_palette_8_should_be_grayscale_8.png", + INDEXED, + BitDepth::Eight, + GRAYSCALE, + BitDepth::Eight, + ); +} + #[test] fn interlaced_grayscale_alpha_16_should_be_grayscale_alpha_16() { test_it_converts( @@ -651,8 +662,8 @@ fn interlaced_small_files() { "tests/files/interlaced_small_files.png", INDEXED, BitDepth::Eight, - INDEXED, - BitDepth::One, + RGB, + BitDepth::Eight, ); } diff --git a/tests/reduction.rs b/tests/reduction.rs index a7fe5e39..3d6577eb 100644 --- a/tests/reduction.rs +++ b/tests/reduction.rs @@ -556,6 +556,42 @@ fn palette_4_should_be_palette_2() { ); } +#[test] +fn palette_8_should_be_grayscale_8() { + test_it_converts( + "tests/files/palette_8_should_be_grayscale_8.png", + false, + INDEXED, + BitDepth::Eight, + GRAYSCALE, + BitDepth::Eight, + ); +} + +#[test] +fn palette_8_should_be_rgb() { + test_it_converts( + "tests/files/palette_8_should_be_rgb.png", + false, + INDEXED, + BitDepth::Eight, + RGB, + BitDepth::Eight, + ); +} + +#[test] +fn palette_8_should_be_rgba() { + test_it_converts( + "tests/files/palette_8_should_be_rgba.png", + false, + INDEXED, + BitDepth::Eight, + RGBA, + BitDepth::Eight, + ); +} + #[test] fn palette_2_should_be_palette_2() { test_it_converts( @@ -808,6 +844,54 @@ fn grayscale_2_should_be_grayscale_1() { ); } +#[test] +fn grayscale_8_should_be_palette_8() { + test_it_converts( + "tests/files/grayscale_8_should_be_palette_8.png", + false, + GRAYSCALE, + BitDepth::Eight, + INDEXED, + BitDepth::Eight, + ); +} + +#[test] +fn grayscale_8_should_be_palette_4() { + test_it_converts( + "tests/files/grayscale_8_should_be_palette_4.png", + false, + GRAYSCALE, + BitDepth::Eight, + INDEXED, + BitDepth::Four, + ); +} + +#[test] +fn grayscale_8_should_be_palette_2() { + test_it_converts( + "tests/files/grayscale_8_should_be_palette_2.png", + false, + GRAYSCALE, + BitDepth::Eight, + INDEXED, + BitDepth::Two, + ); +} + +#[test] +fn grayscale_8_should_be_palette_1() { + test_it_converts( + "tests/files/grayscale_8_should_be_palette_1.png", + false, + GRAYSCALE, + BitDepth::Eight, + INDEXED, + BitDepth::One, + ); +} + #[test] fn grayscale_alpha_16_should_be_grayscale_trns_16() { test_it_converts( @@ -834,33 +918,14 @@ fn grayscale_alpha_8_should_be_grayscale_trns_8() { #[test] fn small_files() { - let input = PathBuf::from("tests/files/small_files.png"); - let (output, opts) = get_opts(&input); - - let png = PngData::new(&input, opts.fix_errors).unwrap(); - - assert_eq!(png.raw.ihdr.color_type.png_header_code(), INDEXED); - assert_eq!(png.raw.ihdr.bit_depth, BitDepth::Eight); - - match oxipng::optimize(&InFile::Path(input), &output, &opts) { - Ok(_) => (), - Err(x) => panic!("{}", x), - }; - let output = output.path().unwrap(); - assert!(output.exists()); - - let png = match PngData::new(output, opts.fix_errors) { - Ok(x) => x, - Err(x) => { - remove_file(output).ok(); - panic!("{}", x) - } - }; - - assert_eq!(png.raw.ihdr.color_type.png_header_code(), INDEXED); - // depth varies depending on zlib implementation used - - remove_file(output).ok(); + test_it_converts( + "tests/files/small_files.png", + false, + INDEXED, + BitDepth::Eight, + RGB, + BitDepth::Eight, + ); } #[test]