Fix issues in transparency palette reduction and release version 0.14.3
This commit is contained in:
parent
44818a854b
commit
87810829ce
6 changed files with 36 additions and 12 deletions
|
|
@ -1,3 +1,6 @@
|
|||
**Version 0.14.3**
|
||||
- Fix multiple bugs when reducing transparency palettes
|
||||
|
||||
**Version 0.14.2**
|
||||
- Fix a bug when reducing palette in images with bit depth less than 8
|
||||
- Fix a bug when reducing palette in images with transparency
|
||||
|
|
|
|||
2
Cargo.lock
generated
2
Cargo.lock
generated
|
|
@ -1,6 +1,6 @@
|
|||
[root]
|
||||
name = "oxipng"
|
||||
version = "0.14.2"
|
||||
version = "0.14.3"
|
||||
dependencies = [
|
||||
"bit-vec 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"byteorder 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ homepage = "https://github.com/shssoichiro/oxipng"
|
|||
license = "MIT"
|
||||
name = "oxipng"
|
||||
repository = "https://github.com/shssoichiro/oxipng"
|
||||
version = "0.14.2"
|
||||
version = "0.14.3"
|
||||
|
||||
[lib]
|
||||
name = "oxipng"
|
||||
|
|
|
|||
26
src/png.rs
26
src/png.rs
|
|
@ -471,7 +471,7 @@ impl PngData {
|
|||
.clone()
|
||||
.unwrap()
|
||||
.chunks(3)
|
||||
.zip(trns.iter())
|
||||
.zip(trns.iter().chain([255].iter().cycle()))
|
||||
.flat_map(|(pixel, trns)| {
|
||||
let mut pixel = pixel.to_owned();
|
||||
pixel.push(*trns);
|
||||
|
|
@ -574,7 +574,6 @@ impl PngData {
|
|||
index_map: &mut HashMap<u8, u8>,
|
||||
indexed_palette: &mut Vec<&[u8]>) {
|
||||
let mut new_data = Vec::with_capacity(self.raw_data.len());
|
||||
let mut alpha_palette = self.aux_headers.get("tRNS").cloned();
|
||||
let original_len = indexed_palette.len();
|
||||
for idx in indices.iter().sorted_by(|a, b| b.cmp(a)) {
|
||||
for i in (*idx as usize + 1)..original_len {
|
||||
|
|
@ -584,14 +583,15 @@ impl PngData {
|
|||
}
|
||||
}
|
||||
indexed_palette.remove(*idx as usize);
|
||||
if let Some(ref mut alpha) = alpha_palette {
|
||||
alpha.remove(*idx as usize);
|
||||
if let Some(ref mut alpha) = self.transparency_palette {
|
||||
if (*idx as usize) < alpha.len() {
|
||||
alpha.remove(*idx as usize);
|
||||
}
|
||||
}
|
||||
}
|
||||
if alpha_palette.is_some() {
|
||||
let alpha_header = self.aux_headers.get_mut("tRNS");
|
||||
if let Some(alpha_hdr) = alpha_header {
|
||||
*alpha_hdr = alpha_palette.unwrap();
|
||||
if let Some(ref mut alpha) = self.transparency_palette {
|
||||
while let Some(255) = alpha.last().cloned() {
|
||||
alpha.pop();
|
||||
}
|
||||
}
|
||||
// Reassign data bytes to new indices
|
||||
|
|
@ -615,7 +615,7 @@ impl PngData {
|
|||
new_byte |= if let Some(new_idx) = index_map.get(&upper) {
|
||||
*new_idx << 4
|
||||
} else {
|
||||
upper << 4
|
||||
upper
|
||||
};
|
||||
new_byte |= if let Some(new_idx) = index_map.get(&lower) {
|
||||
*new_idx
|
||||
|
|
@ -660,7 +660,13 @@ impl PngData {
|
|||
}
|
||||
index_map.clear();
|
||||
self.raw_data = new_data;
|
||||
let new_palette = indexed_palette.iter().cloned().flatten().cloned().collect::<Vec<u8>>();
|
||||
let new_palette = indexed_palette.iter()
|
||||
.cloned()
|
||||
.flatten()
|
||||
.enumerate()
|
||||
.filter(|&(i, _)| !(self.transparency_palette.is_some() && i % 4 == 3))
|
||||
.map(|(_, x)| *x)
|
||||
.collect::<Vec<u8>>();
|
||||
self.palette = Some(new_palette);
|
||||
}
|
||||
|
||||
|
|
|
|||
BIN
tests/files/issue-58.png
Normal file
BIN
tests/files/issue-58.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 585 B |
|
|
@ -222,3 +222,18 @@ fn issue_56() {
|
|||
ColorType::Indexed,
|
||||
BitDepth::Four);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn issue_58() {
|
||||
let input = PathBuf::from("tests/files/issue-58.png");
|
||||
let opts = get_opts(&input);
|
||||
let output = opts.out_file.clone();
|
||||
|
||||
test_it_converts(&input,
|
||||
&output,
|
||||
&opts,
|
||||
ColorType::Indexed,
|
||||
BitDepth::Four,
|
||||
ColorType::Indexed,
|
||||
BitDepth::Four);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue