Avoid split_at panic in ScanLines

This commit is contained in:
Kornel 2024-03-26 15:09:58 +00:00 committed by andrews05
parent f4e631bce7
commit d063119d9c

View file

@ -24,20 +24,24 @@ impl<'a> Iterator for ScanLines<'a> {
type Item = ScanLine<'a>; type Item = ScanLine<'a>;
#[inline] #[inline]
fn next(&mut self) -> Option<Self::Item> { fn next(&mut self) -> Option<Self::Item> {
self.iter.next().map(|(len, pass, num_pixels)| { let (len, pass, num_pixels) = self.iter.next()?;
let (data, rest) = self.raw_data.split_at(len); debug_assert!(self.raw_data.len() >= len);
self.raw_data = rest; debug_assert!(!self.has_filter || len > 1);
let (&filter, data) = if self.has_filter { if self.raw_data.len() < len {
data.split_first().unwrap() return None;
} else { }
(&0, data) let (data, rest) = self.raw_data.split_at(len);
}; self.raw_data = rest;
ScanLine { let (&filter, data) = if self.has_filter {
filter, data.split_first().unwrap()
data, } else {
pass, (&0, data)
num_pixels, };
} Some(ScanLine {
filter,
data,
pass,
num_pixels,
}) })
} }
} }