From 95026f426b0e67b7b343709a72c91247e8f2640f Mon Sep 17 00:00:00 2001 From: Jaby Date: Tue, 6 Dec 2022 03:12:31 +0100 Subject: [PATCH] LZ7 compress --- src/Tools/psxcdgen_ex/Cargo.toml | 1 + .../psxcdgen_ex/src/types/overlay/mod.rs | 33 ++++++++++++++++--- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/Tools/psxcdgen_ex/Cargo.toml b/src/Tools/psxcdgen_ex/Cargo.toml index acc65024..c712b442 100644 --- a/src/Tools/psxcdgen_ex/Cargo.toml +++ b/src/Tools/psxcdgen_ex/Cargo.toml @@ -9,6 +9,7 @@ edition = "2021" byteorder = "*" cdtypes = {path = "../cdtypes"} clap = {version = "*", features = ["derive"]} +lz4 = "*" paste = "*" roxmltree = "*" tool_helper = {path = "../tool_helper"} \ No newline at end of file diff --git a/src/Tools/psxcdgen_ex/src/types/overlay/mod.rs b/src/Tools/psxcdgen_ex/src/types/overlay/mod.rs index 197a1364..98d2fb0f 100644 --- a/src/Tools/psxcdgen_ex/src/types/overlay/mod.rs +++ b/src/Tools/psxcdgen_ex/src/types/overlay/mod.rs @@ -1,6 +1,7 @@ use super::File; use std::path::PathBuf; use byteorder::{ByteOrder, BigEndian, LittleEndian}; +use lz4::EncoderBuilder; use tool_helper::{Error, format_if_error, read_file}; #[repr(packed)] @@ -17,14 +18,38 @@ impl OverlayHeader { } pub fn load_from(file_path: PathBuf) -> Result { - let content = read_file(&file_path)?; + let overlay_header_size = std::mem::size_of::(); + let mut content = read_file(&file_path)?; - if content.len() < std::mem::size_of::() { + if content.len() < overlay_header_size { return Err(Error::from_text(format!("Overlay {} has no header!", file_path.to_string_lossy()))); } - let lba_count = LittleEndian::read_u16(&content[OverlayHeader::lba_count_offset()..]); - println!("Dino: {}", lba_count); + let lba_count = LittleEndian::read_u16(&content[OverlayHeader::lba_count_offset()..]) as usize; + let lba_header_size = lba_count*std::mem::size_of::(); + let lba_header = &mut content[overlay_header_size..(overlay_header_size+lba_header_size)]; + + if lba_header.is_empty() { + return Err(Error::from_text(format!("LBA header of overlay {} is smaller then {} elements", file_path.to_string_lossy(), lba_count))); + } + + let mut count = 0; + for byte in lba_header { + *byte = count as u8; + count += 1; + } + + let mut lz4_encoder = EncoderBuilder::new().level(16).build(Vec::::new())?; + + std::io::copy(&mut&content[..], &mut lz4_encoder)?; + let (output, result) = lz4_encoder.finish(); + + match result { + Ok(()) => println!("Wuff: {}", output.len()), + Err(error) => { + return Err(Error::from_error(error)); + } + } Err(Error::not_implemented("load_from overlay")) } \ No newline at end of file