LZ7 compress
This commit is contained in:
parent
29511f3bdc
commit
95026f426b
|
@ -9,6 +9,7 @@ edition = "2021"
|
||||||
byteorder = "*"
|
byteorder = "*"
|
||||||
cdtypes = {path = "../cdtypes"}
|
cdtypes = {path = "../cdtypes"}
|
||||||
clap = {version = "*", features = ["derive"]}
|
clap = {version = "*", features = ["derive"]}
|
||||||
|
lz4 = "*"
|
||||||
paste = "*"
|
paste = "*"
|
||||||
roxmltree = "*"
|
roxmltree = "*"
|
||||||
tool_helper = {path = "../tool_helper"}
|
tool_helper = {path = "../tool_helper"}
|
|
@ -1,6 +1,7 @@
|
||||||
use super::File;
|
use super::File;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use byteorder::{ByteOrder, BigEndian, LittleEndian};
|
use byteorder::{ByteOrder, BigEndian, LittleEndian};
|
||||||
|
use lz4::EncoderBuilder;
|
||||||
use tool_helper::{Error, format_if_error, read_file};
|
use tool_helper::{Error, format_if_error, read_file};
|
||||||
|
|
||||||
#[repr(packed)]
|
#[repr(packed)]
|
||||||
|
@ -17,14 +18,38 @@ impl OverlayHeader {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn load_from(file_path: PathBuf) -> Result<File, Error> {
|
pub fn load_from(file_path: PathBuf) -> Result<File, Error> {
|
||||||
let content = read_file(&file_path)?;
|
let overlay_header_size = std::mem::size_of::<OverlayHeader>();
|
||||||
|
let mut content = read_file(&file_path)?;
|
||||||
|
|
||||||
if content.len() < std::mem::size_of::<OverlayHeader>() {
|
if content.len() < overlay_header_size {
|
||||||
return Err(Error::from_text(format!("Overlay {} has no header!", file_path.to_string_lossy())));
|
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()..]);
|
let lba_count = LittleEndian::read_u16(&content[OverlayHeader::lba_count_offset()..]) as usize;
|
||||||
println!("Dino: {}", lba_count);
|
let lba_header_size = lba_count*std::mem::size_of::<u32>();
|
||||||
|
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::<u8>::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"))
|
Err(Error::not_implemented("load_from overlay"))
|
||||||
}
|
}
|
Loading…
Reference in New Issue