From ea7f8fb6d22d55950184a5dda54731fea613879e Mon Sep 17 00:00:00 2001 From: G2-Games Date: Thu, 23 May 2024 02:49:28 -0500 Subject: [PATCH] Cleaned up code a little, fixed compression quirks --- cz/src/compression.rs | 19 +++++++++++-------- cz/src/formats/cz4.rs | 7 +++---- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/cz/src/compression.rs b/cz/src/compression.rs index 8f78d2c..20f2579 100644 --- a/cz/src/compression.rs +++ b/cz/src/compression.rs @@ -256,7 +256,7 @@ pub fn compress( offset += count; for d in &part_data { - output_buf.write(&d.to_le_bytes()).unwrap(); + output_buf.write_all(&d.to_le_bytes()).unwrap(); } output_info.chunks.push(ChunkInfo { @@ -269,6 +269,9 @@ pub fn compress( if output_info.chunk_count == 0 { panic!("No chunks compressed!") + } else if output_info.chunk_count != 1 { + output_info.chunks[0].size_raw -= 1; + output_info.chunks[output_info.chunk_count - 1].size_raw += 1; } output_info.total_size_compressed = output_buf.len() / 2; @@ -285,7 +288,7 @@ fn compress_lzw(data: &[u8], size: usize, last: Vec) -> (usize, Vec, Ve let mut dictionary_count = (dictionary.len() + 1) as u16; let mut element = Vec::new(); - if last.len() != 0 { + if !last.is_empty() { element = last } @@ -294,7 +297,7 @@ fn compress_lzw(data: &[u8], size: usize, last: Vec) -> (usize, Vec, Ve let mut entry = element.clone(); entry.push(*c); - if dictionary.get(&entry).is_some() { + if dictionary.contains_key(&entry) { element = entry } else { compressed.push(*dictionary.get(&element).unwrap()); @@ -311,15 +314,15 @@ fn compress_lzw(data: &[u8], size: usize, last: Vec) -> (usize, Vec, Ve } let last_element = element; - if compressed.len() == 0 { - if last_element.len() != 0 { + if compressed.is_empty() { + if !last_element.is_empty() { for c in last_element { compressed.push(*dictionary.get(&vec![c]).unwrap()); } } return (count, compressed, Vec::new()) } else if compressed.len() < size { - if last_element.len() != 0 { + if !last_element.is_empty() { compressed.push(*dictionary.get(&last_element).unwrap()); } return (count, compressed, Vec::new()) @@ -365,8 +368,8 @@ pub fn compress2(data: &[u8], size: usize) -> (Vec, CompressionInfo) { if output_info.chunk_count == 0 { panic!("No chunks compressed!") } else if output_info.chunk_count != 1 { - output_info.chunks[0].size_raw += 1; - output_info.chunks[output_info.chunk_count - 1].size_raw -= 1; + output_info.chunks[0].size_raw -= 1; + output_info.chunks[output_info.chunk_count - 1].size_raw += 1; } output_info.total_size_compressed = output_buf.len(); diff --git a/cz/src/formats/cz4.rs b/cz/src/formats/cz4.rs index aa47e6d..f7c3f46 100644 --- a/cz/src/formats/cz4.rs +++ b/cz/src/formats/cz4.rs @@ -1,6 +1,5 @@ use byteorder::{ReadBytesExt, WriteBytesExt}; use image::RgbaImage; -use std::{fs, time}; use std::io::{Read, Seek, SeekFrom, Write}; use crate::common::{CommonHeader, CzError}; @@ -45,10 +44,10 @@ fn line_diff(picture: &mut RgbaImage, data: &[u8]) { let block_height = (f32::ceil(height as f32 / 3.0) as u16) as u32; let mut curr_line; - let mut prev_line = vec![0u8; width as usize * 3]; + let mut prev_line = Vec::with_capacity(width as usize * 3); let mut curr_alpha; - let mut prev_alpha = vec![0u8; width as usize]; + let mut prev_alpha = Vec::with_capacity(width as usize); let pcount = (width * height * 3) as usize; @@ -87,7 +86,7 @@ fn diff_line(header: &CommonHeader, input: &[u8]) -> Vec { let width = header.width() as u32; let height = header.height() as u32; - let mut data = Vec::with_capacity(input.len()); + let mut data = Vec::with_capacity(width as usize * 3); let mut alpha_data = Vec::with_capacity(width as usize); let block_height = (f32::ceil(height as f32 / 3.0) as u16) as usize;