From aaf443fca7749c2c89c686f838ccbe1cedb059b0 Mon Sep 17 00:00:00 2001 From: Joshua Holmer Date: Mon, 2 May 2016 15:58:45 -0400 Subject: [PATCH] Similarly optimize unfilter mode 2 Unfilter mode 1 can't benefit from this optimization because it modifies and reads from the same line of data --- src/png.rs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/png.rs b/src/png.rs index e694bdfe..be009855 100644 --- a/src/png.rs +++ b/src/png.rs @@ -1149,13 +1149,14 @@ fn unfilter_line(filter: u8, bpp: usize, data: &[u8], last_line: &[u8]) -> Vec { - for (i, byte) in data.iter().enumerate() { - if last_line.is_empty() { - unfiltered.push(*byte); - } else { - unfiltered.push(byte.wrapping_add(last_line[i])); - }; - } + if last_line.is_empty() { + unfiltered.extend_from_slice(data); + } else { + unfiltered.extend_from_slice(&data.iter() + .zip(last_line.iter()) + .map(|(cur, last)| cur.wrapping_add(*last)) + .collect::>()); + }; } 3 => { for (i, byte) in data.iter().enumerate() {