From 460b9883cfa65f72ee9470852d5ec8d5d674fbed Mon Sep 17 00:00:00 2001 From: Andrew Date: Mon, 24 Oct 2022 16:36:58 +1300 Subject: [PATCH] Use libdeflater crc --- src/deflate/deflater.rs | 6 ++++++ src/deflate/mod.rs | 2 ++ src/headers.rs | 4 ++-- src/lib.rs | 8 ++------ src/png/mod.rs | 3 +-- 5 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/deflate/deflater.rs b/src/deflate/deflater.rs index c6b0d35a..a2f9dacb 100644 --- a/src/deflate/deflater.rs +++ b/src/deflate/deflater.rs @@ -36,3 +36,9 @@ pub fn inflate(data: &[u8], out_size: usize) -> PngResult> { dest.truncate(len); Ok(dest) } + +pub fn crc32(data: &[u8]) -> u32 { + let mut crc = Crc::new(); + crc.update(data); + crc.sum() +} diff --git a/src/deflate/mod.rs b/src/deflate/mod.rs index 59ace7ef..d465b715 100644 --- a/src/deflate/mod.rs +++ b/src/deflate/mod.rs @@ -13,6 +13,8 @@ pub mod miniz_stream; #[cfg(feature = "libdeflater")] mod deflater; #[cfg(feature = "libdeflater")] +pub use deflater::crc32; +#[cfg(feature = "libdeflater")] pub use deflater::deflate as libdeflater_deflate; #[cfg(feature = "libdeflater")] pub use deflater::inflate as libdeflater_inflate; diff --git a/src/headers.rs b/src/headers.rs index 1183ca69..1b92d9b3 100644 --- a/src/headers.rs +++ b/src/headers.rs @@ -1,7 +1,7 @@ use crate::colors::{BitDepth, ColorType}; +use crate::deflate::crc32; use crate::error::PngError; use crate::PngResult; -use crc::{Crc, CRC_32_ISO_HDLC}; use indexmap::IndexSet; use std::io; use std::io::{Cursor, Read}; @@ -130,7 +130,7 @@ pub fn parse_next_header<'a>( let header_bytes = byte_data .get(header_start..header_start + 4 + length as usize) .ok_or(PngError::TruncatedData)?; - if !fix_errors && Crc::::new(&CRC_32_ISO_HDLC).checksum(header_bytes) != crc { + if !fix_errors && crc32(header_bytes) != crc { return Err(PngError::new(&format!( "CRC Mismatch in {} header; May be recoverable by using --fix", String::from_utf8_lossy(chunk_name) diff --git a/src/lib.rs b/src/lib.rs index af152183..70370445 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -26,12 +26,11 @@ mod rayon; use crate::atomicmin::AtomicMin; use crate::colors::BitDepth; -use crate::deflate::libdeflater_inflate; +use crate::deflate::{crc32, libdeflater_inflate}; use crate::evaluate::Evaluator; use crate::png::PngData; use crate::png::PngImage; use crate::reduction::*; -use crc::{Crc, CRC_32_ISO_HDLC}; use image::{DynamicImage, GenericImageView, ImageFormat, Pixel}; use log::{debug, error, info, warn}; use rayon::prelude::*; @@ -966,10 +965,7 @@ fn srgb_rendering_intent(mut iccp: &[u8]) -> Option { } b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" => { // Known-bad profiles are identified by their CRC - match ( - Crc::::new(&CRC_32_ISO_HDLC).checksum(&icc_data), - icc_data.len(), - ) { + match (crc32(&icc_data), icc_data.len()) { (0x5d51_29ce, 3024) | (0x182e_a552, 3144) | (0xf29e_526d, 3144) => { Some(rendering_intent) } diff --git a/src/png/mod.rs b/src/png/mod.rs index 846269f3..e1d87295 100644 --- a/src/png/mod.rs +++ b/src/png/mod.rs @@ -4,7 +4,6 @@ use crate::error::PngError; use crate::filters::*; use crate::headers::*; use crate::interlace::{deinterlace_image, interlace_image}; -use crc::{Crc, CRC_32_ISO_HDLC}; use indexmap::IndexMap; use rgb::ComponentSlice; use rgb::RGBA8; @@ -370,7 +369,7 @@ fn write_png_block(key: &[u8], header: &[u8], output: &mut Vec) { header_data.extend_from_slice(header); output.reserve(header_data.len() + 8); output.extend_from_slice(&(header_data.len() as u32 - 4).to_be_bytes()); - let crc = Crc::::new(&CRC_32_ISO_HDLC).checksum(&header_data); + let crc = deflate::crc32(&header_data); output.append(&mut header_data); output.extend_from_slice(&crc.to_be_bytes()); }