diff --git a/src/filters.rs b/src/filters.rs index a9d5630e..c7a77b3d 100644 --- a/src/filters.rs +++ b/src/filters.rs @@ -50,7 +50,9 @@ impl RowFilter { pub fn filter_line(self, bpp: usize, data: &[u8], last_line: &[u8], buf: &mut Vec) { assert!(data.len() >= bpp); 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 { Self::None => { buf.extend_from_slice(data); diff --git a/src/png/mod.rs b/src/png/mod.rs index d6697298..dac3f33f 100644 --- a/src/png/mod.rs +++ b/src/png/mod.rs @@ -306,7 +306,6 @@ impl PngImage { let mut last_pass: Option = None; let mut f_buf = Vec::new(); for line in self.scan_lines() { - f_buf.clear(); if last_pass != line.pass { last_line = &[]; } @@ -315,7 +314,6 @@ impl PngImage { // Heuristically guess best filter per line // Uses MSAD algorithm mentioned in libpng reference docs // http://www.libpng.org/pub/png/book/chapter09.html - let mut best_filter = RowFilter::None; let mut best_line = Vec::new(); let mut best_size = u64::MAX; @@ -331,12 +329,9 @@ impl PngImage { }); if size < best_size { best_size = size; - best_filter = try_filter; 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); } _ => { @@ -345,7 +340,6 @@ impl PngImage { } else { RowFilter::None }; - filtered.push(filter as u8); filter.filter_line(bpp, line.data, last_line, &mut f_buf); filtered.extend_from_slice(&f_buf); }