Include filter byte in filter output

This commit is contained in:
Andrew 2022-11-05 13:51:04 +13:00
parent 77d063aa84
commit dfb6eb7c46
2 changed files with 3 additions and 7 deletions

View file

@ -50,7 +50,9 @@ impl RowFilter {
pub fn filter_line(self, bpp: usize, data: &[u8], last_line: &[u8], buf: &mut Vec<u8>) { pub fn filter_line(self, bpp: usize, data: &[u8], last_line: &[u8], buf: &mut Vec<u8>) {
assert!(data.len() >= bpp); assert!(data.len() >= bpp);
assert!(last_line.is_empty() || data.len() == last_line.len()); assert!(last_line.is_empty() || data.len() == last_line.len());
buf.reserve(data.len()); buf.clear();
buf.reserve(data.len() + 1);
buf.push(self as u8);
match self { match self {
Self::None => { Self::None => {
buf.extend_from_slice(data); buf.extend_from_slice(data);

View file

@ -306,7 +306,6 @@ impl PngImage {
let mut last_pass: Option<u8> = None; let mut last_pass: Option<u8> = None;
let mut f_buf = Vec::new(); let mut f_buf = Vec::new();
for line in self.scan_lines() { for line in self.scan_lines() {
f_buf.clear();
if last_pass != line.pass { if last_pass != line.pass {
last_line = &[]; last_line = &[];
} }
@ -315,7 +314,6 @@ impl PngImage {
// Heuristically guess best filter per line // Heuristically guess best filter per line
// Uses MSAD algorithm mentioned in libpng reference docs // Uses MSAD algorithm mentioned in libpng reference docs
// http://www.libpng.org/pub/png/book/chapter09.html // http://www.libpng.org/pub/png/book/chapter09.html
let mut best_filter = RowFilter::None;
let mut best_line = Vec::new(); let mut best_line = Vec::new();
let mut best_size = u64::MAX; let mut best_size = u64::MAX;
@ -331,12 +329,9 @@ impl PngImage {
}); });
if size < best_size { if size < best_size {
best_size = size; best_size = size;
best_filter = try_filter;
std::mem::swap(&mut best_line, &mut f_buf); std::mem::swap(&mut best_line, &mut f_buf);
} }
f_buf.clear() //discard buffer, and start again
} }
filtered.push(best_filter as u8);
filtered.extend_from_slice(&best_line); filtered.extend_from_slice(&best_line);
} }
_ => { _ => {
@ -345,7 +340,6 @@ impl PngImage {
} else { } else {
RowFilter::None RowFilter::None
}; };
filtered.push(filter as u8);
filter.filter_line(bpp, line.data, last_line, &mut f_buf); filter.filter_line(bpp, line.data, last_line, &mut f_buf);
filtered.extend_from_slice(&f_buf); filtered.extend_from_slice(&f_buf);
} }