summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpommicket <pommicket@gmail.com>2025-09-08 14:45:29 -0400
committerpommicket <pommicket@gmail.com>2025-09-08 15:11:36 -0400
commit9faac7e1cacc1787bd45987c0f28b5aa1fbb9563 (patch)
tree239c146520719a1652f078856783d2d503b3ac34
parenta9660e92e086442fd2e7d158ff989944e20bdd22 (diff)
Various code cleanup
-rw-r--r--src/lib.rs39
1 files changed, 16 insertions, 23 deletions
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<u32> {
- 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<u16> {
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),
}