From 9faac7e1cacc1787bd45987c0f28b5aa1fbb9563 Mon Sep 17 00:00:00 2001 From: pommicket Date: Mon, 8 Sep 2025 14:45:29 -0400 Subject: Various code cleanup --- src/lib.rs | 39 ++++++++++++++++----------------------- 1 file changed, 16 insertions(+), 23 deletions(-) (limited to 'src/lib.rs') diff --git a/src/lib.rs b/src/lib.rs index 9d61021..dc8ee83 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -322,8 +322,8 @@ impl ImageHeader { pub fn bytes_per_row(&self) -> usize { (self.width() as usize * usize::from(self.bit_depth() as u8) - * usize::from(self.color_type().channels()) - + 7) / 8 + * usize::from(self.color_type().channels())) + .div_ceil(8) } fn data_size(&self) -> usize { @@ -375,7 +375,7 @@ impl BitReader<'_> { } fn peek_bits(&mut self, count: u8) -> Result { - debug_assert!(count > 0 && u32::from(count) <= 31); + debug_assert!(count > 0 && count <= 31); if self.bits_left < count { self.read_more_bits()?; } @@ -433,7 +433,7 @@ impl<'a> From<&'a mut [u8]> for DecompressedDataWriter<'a> { } } -impl<'a> DecompressedDataWriter<'a> { +impl DecompressedDataWriter<'_> { fn write_byte(&mut self, byte: u8) -> Result<()> { match self.slice.get_mut(self.pos) { None => return Err(Error::TooMuchData), @@ -527,7 +527,7 @@ impl HuffmanTable { *entry = -i; } else { debug_assert!(*entry < 0); - }; + } entry = &mut self.tree[usize::from((-*entry) as u16 + (code & 1))]; code >>= 1; } @@ -963,12 +963,6 @@ fn read_compressed_block( writer: &mut DecompressedDataWriter, dynamic: bool, ) -> Result<()> { - let (literal_length_table, distance_table) = if dynamic { - read_dynamic_huffman_dictionary(reader)? - } else { - get_fixed_huffman_dictionaries() - }; - fn parse_length(reader: &mut BitReader, literal_length: u16) -> Result { Ok(match literal_length { 257..=264 => literal_length - 254, @@ -1004,6 +998,12 @@ fn read_compressed_block( }) } + let (literal_length_table, distance_table) = if dynamic { + read_dynamic_huffman_dictionary(reader)? + } else { + get_fixed_huffman_dictionaries() + }; + loop { let literal_length = literal_length_table.read_value(reader)?; match literal_length { @@ -1090,6 +1090,7 @@ fn read_image(reader: IdatReader, writer: &mut DecompressedDataWriter) -> Result } if cfg!(feature = "adler") { + const BASE: u32 = 65521; // Adler-32 checksum let padding = reader.bits_left % 8; if padding > 0 { @@ -1101,7 +1102,6 @@ fn read_image(reader: IdatReader, writer: &mut DecompressedDataWriter) -> Result expected_adler |= reader.read_bits(16)? << 16; expected_adler = expected_adler.swap_bytes(); - const BASE: u32 = 65521; let mut s1: u32 = 1; let mut s2: u32 = 0; for byte in writer.slice[..decompressed_size].iter().copied() { @@ -1136,18 +1136,18 @@ fn apply_filters(header: &ImageHeader, data: &mut [u8]) -> Result<()> { ); let scanline_bytes = header.bytes_per_row(); for scanline in 0..header.height() { - let filter = data[s]; const FILTER_NONE: u8 = 0; const FILTER_SUB: u8 = 1; const FILTER_UP: u8 = 2; const FILTER_AVG: u8 = 3; const FILTER_PAETH: u8 = 4; + let filter = data[s]; s += 1; data.copy_within(s..s + scanline_bytes, d); match (filter, scanline == 0) { (FILTER_NONE, _) | (FILTER_UP, true) => {} - (FILTER_SUB, _) => { + (FILTER_SUB, _) | (FILTER_PAETH, true) => { for i in d + x_byte_offset..d + scanline_bytes { data[i] = data[i].wrapping_add(data[i - x_byte_offset]); } @@ -1162,10 +1162,8 @@ fn apply_filters(header: &ImageHeader, data: &mut [u8]) -> Result<()> { data[i] = data[i].wrapping_add(data[i - scanline_bytes] / 2); } for i in d + x_byte_offset..d + scanline_bytes { - data[i] = data[i].wrapping_add( - ((u32::from(data[i - scanline_bytes]) + u32::from(data[i - x_byte_offset])) - / 2) as u8, - ); + data[i] = data[i] + .wrapping_add(data[i - scanline_bytes].midpoint(data[i - x_byte_offset])); } } (FILTER_AVG, true) => { @@ -1196,11 +1194,6 @@ fn apply_filters(header: &ImageHeader, data: &mut [u8]) -> Result<()> { data[i] = data[i].wrapping_add(paeth); } } - (FILTER_PAETH, true) => { - for i in d + x_byte_offset..d + scanline_bytes { - data[i] = data[i].wrapping_add(data[i - x_byte_offset]); - } - } (5.., _) => return Err(Error::BadFilter), } -- cgit v1.2.3