Include filter byte in filter output
This commit is contained in:
parent
77d063aa84
commit
dfb6eb7c46
2 changed files with 3 additions and 7 deletions
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue