mirror of
https://github.com/G2-Games/lbee-utils.git
synced 2025-04-19 15:22:53 -05:00
Cleaned up code a little, fixed compression quirks
This commit is contained in:
parent
8aa150ee46
commit
ea7f8fb6d2
2 changed files with 14 additions and 12 deletions
|
@ -256,7 +256,7 @@ pub fn compress(
|
||||||
offset += count;
|
offset += count;
|
||||||
|
|
||||||
for d in &part_data {
|
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 {
|
output_info.chunks.push(ChunkInfo {
|
||||||
|
@ -269,6 +269,9 @@ pub fn compress(
|
||||||
|
|
||||||
if output_info.chunk_count == 0 {
|
if output_info.chunk_count == 0 {
|
||||||
panic!("No chunks compressed!")
|
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;
|
output_info.total_size_compressed = output_buf.len() / 2;
|
||||||
|
@ -285,7 +288,7 @@ fn compress_lzw(data: &[u8], size: usize, last: Vec<u8>) -> (usize, Vec<u16>, Ve
|
||||||
let mut dictionary_count = (dictionary.len() + 1) as u16;
|
let mut dictionary_count = (dictionary.len() + 1) as u16;
|
||||||
|
|
||||||
let mut element = Vec::new();
|
let mut element = Vec::new();
|
||||||
if last.len() != 0 {
|
if !last.is_empty() {
|
||||||
element = last
|
element = last
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -294,7 +297,7 @@ fn compress_lzw(data: &[u8], size: usize, last: Vec<u8>) -> (usize, Vec<u16>, Ve
|
||||||
let mut entry = element.clone();
|
let mut entry = element.clone();
|
||||||
entry.push(*c);
|
entry.push(*c);
|
||||||
|
|
||||||
if dictionary.get(&entry).is_some() {
|
if dictionary.contains_key(&entry) {
|
||||||
element = entry
|
element = entry
|
||||||
} else {
|
} else {
|
||||||
compressed.push(*dictionary.get(&element).unwrap());
|
compressed.push(*dictionary.get(&element).unwrap());
|
||||||
|
@ -311,15 +314,15 @@ fn compress_lzw(data: &[u8], size: usize, last: Vec<u8>) -> (usize, Vec<u16>, Ve
|
||||||
}
|
}
|
||||||
|
|
||||||
let last_element = element;
|
let last_element = element;
|
||||||
if compressed.len() == 0 {
|
if compressed.is_empty() {
|
||||||
if last_element.len() != 0 {
|
if !last_element.is_empty() {
|
||||||
for c in last_element {
|
for c in last_element {
|
||||||
compressed.push(*dictionary.get(&vec![c]).unwrap());
|
compressed.push(*dictionary.get(&vec![c]).unwrap());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return (count, compressed, Vec::new())
|
return (count, compressed, Vec::new())
|
||||||
} else if compressed.len() < size {
|
} else if compressed.len() < size {
|
||||||
if last_element.len() != 0 {
|
if !last_element.is_empty() {
|
||||||
compressed.push(*dictionary.get(&last_element).unwrap());
|
compressed.push(*dictionary.get(&last_element).unwrap());
|
||||||
}
|
}
|
||||||
return (count, compressed, Vec::new())
|
return (count, compressed, Vec::new())
|
||||||
|
@ -365,8 +368,8 @@ pub fn compress2(data: &[u8], size: usize) -> (Vec<u8>, CompressionInfo) {
|
||||||
if output_info.chunk_count == 0 {
|
if output_info.chunk_count == 0 {
|
||||||
panic!("No chunks compressed!")
|
panic!("No chunks compressed!")
|
||||||
} else if output_info.chunk_count != 1 {
|
} else if output_info.chunk_count != 1 {
|
||||||
output_info.chunks[0].size_raw += 1;
|
output_info.chunks[0].size_raw -= 1;
|
||||||
output_info.chunks[output_info.chunk_count - 1].size_raw -= 1;
|
output_info.chunks[output_info.chunk_count - 1].size_raw += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
output_info.total_size_compressed = output_buf.len();
|
output_info.total_size_compressed = output_buf.len();
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
use byteorder::{ReadBytesExt, WriteBytesExt};
|
use byteorder::{ReadBytesExt, WriteBytesExt};
|
||||||
use image::RgbaImage;
|
use image::RgbaImage;
|
||||||
use std::{fs, time};
|
|
||||||
use std::io::{Read, Seek, SeekFrom, Write};
|
use std::io::{Read, Seek, SeekFrom, Write};
|
||||||
|
|
||||||
use crate::common::{CommonHeader, CzError};
|
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 block_height = (f32::ceil(height as f32 / 3.0) as u16) as u32;
|
||||||
|
|
||||||
let mut curr_line;
|
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 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;
|
let pcount = (width * height * 3) as usize;
|
||||||
|
|
||||||
|
@ -87,7 +86,7 @@ fn diff_line(header: &CommonHeader, input: &[u8]) -> Vec<u8> {
|
||||||
let width = header.width() as u32;
|
let width = header.width() as u32;
|
||||||
let height = header.height() 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 mut alpha_data = Vec::with_capacity(width as usize);
|
||||||
|
|
||||||
let block_height = (f32::ceil(height as f32 / 3.0) as u16) as usize;
|
let block_height = (f32::ceil(height as f32 / 3.0) as u16) as usize;
|
||||||
|
|
Loading…
Reference in a new issue