mirror of
https://github.com/G2-Games/lbee-utils.git
synced 2025-04-19 07:12:55 -05:00
Moved more functions into dynamic
This commit is contained in:
parent
73184837af
commit
3a5e27de4e
4 changed files with 92 additions and 32 deletions
|
@ -66,7 +66,7 @@ pub trait CzHeader {
|
||||||
fn common(&self) -> &CommonHeader;
|
fn common(&self) -> &CommonHeader;
|
||||||
|
|
||||||
/// Turn the header into bytes equivalent to the original header from the file
|
/// Turn the header into bytes equivalent to the original header from the file
|
||||||
fn to_bytes(&self) -> Result<Vec<u8>, io::Error>;
|
fn write_into<T: Seek + WriteBytesExt + Write>(&self, output: &mut T) -> Result<usize, io::Error>;
|
||||||
|
|
||||||
/// The version of the image
|
/// The version of the image
|
||||||
fn version(&self) -> CzVersion;
|
fn version(&self) -> CzVersion;
|
||||||
|
@ -198,18 +198,21 @@ impl CzHeader for CommonHeader {
|
||||||
self.unknown
|
self.unknown
|
||||||
}
|
}
|
||||||
|
|
||||||
fn to_bytes(&self) -> Result<Vec<u8>, io::Error> {
|
fn write_into<T: Seek + WriteBytesExt + Write>(
|
||||||
let mut buf = vec![];
|
&self,
|
||||||
|
output: &mut T,
|
||||||
|
) -> Result<usize, io::Error> {
|
||||||
|
let pos = output.stream_position()?;
|
||||||
let magic_bytes = [b'C', b'Z', b'0' + self.version as u8, b'\0'];
|
let magic_bytes = [b'C', b'Z', b'0' + self.version as u8, b'\0'];
|
||||||
buf.write_all(&magic_bytes)?;
|
|
||||||
buf.write_u32::<LittleEndian>(self.length() as u32)?;
|
|
||||||
buf.write_u16::<LittleEndian>(self.width())?;
|
|
||||||
buf.write_u16::<LittleEndian>(self.height())?;
|
|
||||||
buf.write_u16::<LittleEndian>(self.depth())?;
|
|
||||||
buf.write_u8(self.color_block())?;
|
|
||||||
|
|
||||||
Ok(buf)
|
output.write_all(&magic_bytes)?;
|
||||||
|
output.write_u32::<LittleEndian>(self.length() as u32)?;
|
||||||
|
output.write_u16::<LittleEndian>(self.width())?;
|
||||||
|
output.write_u16::<LittleEndian>(self.height())?;
|
||||||
|
output.write_u16::<LittleEndian>(self.depth())?;
|
||||||
|
output.write_u8(self.color_block())?;
|
||||||
|
|
||||||
|
Ok((output.stream_position()? - pos) as usize)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -279,22 +282,25 @@ impl ExtendedHeader {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn as_bytes(&self) -> Result<Vec<u8>, io::Error> {
|
pub fn write_into<T: Seek + WriteBytesExt + Write>(
|
||||||
let mut buf = vec![];
|
&self,
|
||||||
|
output: &mut T
|
||||||
|
) -> Result<usize, io::Error> {
|
||||||
|
let pos = output.stream_position()?;
|
||||||
|
|
||||||
buf.write_all(&self.unknown_1)?;
|
output.write_all(&self.unknown_1)?;
|
||||||
buf.write_u16::<LittleEndian>(self.crop_width)?;
|
output.write_u16::<LittleEndian>(self.crop_width)?;
|
||||||
buf.write_u16::<LittleEndian>(self.crop_height)?;
|
output.write_u16::<LittleEndian>(self.crop_height)?;
|
||||||
buf.write_u16::<LittleEndian>(self.bounds_width)?;
|
output.write_u16::<LittleEndian>(self.bounds_width)?;
|
||||||
buf.write_u16::<LittleEndian>(self.bounds_height)?;
|
output.write_u16::<LittleEndian>(self.bounds_height)?;
|
||||||
|
|
||||||
if self.offset_width.is_some() {
|
if self.offset_width.is_some() {
|
||||||
buf.write_u16::<LittleEndian>(self.offset_width.unwrap())?;
|
output.write_u16::<LittleEndian>(self.offset_width.unwrap())?;
|
||||||
buf.write_u16::<LittleEndian>(self.offset_height.unwrap())?;
|
output.write_u16::<LittleEndian>(self.offset_height.unwrap())?;
|
||||||
buf.write_u32::<LittleEndian>(self.unknown_2.unwrap())?;
|
output.write_u32::<LittleEndian>(self.unknown_2.unwrap())?;
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(buf)
|
Ok((output.stream_position()? - pos) as usize)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -330,3 +336,13 @@ pub fn apply_palette(
|
||||||
|
|
||||||
Ok(output_map)
|
Ok(output_map)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn rgba_to_indexed(input: &[u8], palette: &[[u8; 4]]) -> Result<Vec<u8>, CzError> {
|
||||||
|
let mut output_map = Vec::new();
|
||||||
|
|
||||||
|
for rgba in input.windows(4).step_by(4) {
|
||||||
|
dbg!(rgba);
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(output_map)
|
||||||
|
}
|
||||||
|
|
|
@ -1,11 +1,10 @@
|
||||||
use std::{
|
use std::{
|
||||||
io::{BufReader, Read, Seek, SeekFrom},
|
fs::File, io::{BufReader, Cursor, Read, Seek, SeekFrom, Write}, path::Path
|
||||||
path::Path
|
|
||||||
};
|
};
|
||||||
use byteorder::ReadBytesExt;
|
use byteorder::ReadBytesExt;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
common::{apply_palette, get_palette, CommonHeader, CzError, CzHeader, CzVersion, ExtendedHeader},
|
common::{apply_palette, get_palette, rgba_to_indexed, CommonHeader, CzError, CzHeader, CzVersion, ExtendedHeader},
|
||||||
formats::{cz0, cz1, cz2, cz3, cz4},
|
formats::{cz0, cz1, cz2, cz3, cz4},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -89,7 +88,32 @@ impl DynamicCz {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn save_as_cz<T: Into<std::path::PathBuf>>(&self, path: T) -> Result<(), CzError> {
|
pub fn save_as_cz<T: Into<std::path::PathBuf>>(&self, path: T) -> Result<(), CzError> {
|
||||||
todo!()
|
let mut out_file = File::create(path.into())?;
|
||||||
|
|
||||||
|
self.header_common.write_into(&mut out_file)?;
|
||||||
|
|
||||||
|
if let Some(ext) = self.header_extended {
|
||||||
|
ext.write_into(&mut out_file)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
let output_bitmap;
|
||||||
|
match &self.palette {
|
||||||
|
Some(pal) if self.header_common.depth() <= 8 => {
|
||||||
|
output_bitmap = rgba_to_indexed(&self.bitmap(), &pal)?
|
||||||
|
},
|
||||||
|
_ => output_bitmap = self.bitmap().clone()
|
||||||
|
}
|
||||||
|
|
||||||
|
match self.header_common.version() {
|
||||||
|
CzVersion::CZ0 => cz0::encode(&mut out_file, &self.bitmap)?,
|
||||||
|
CzVersion::CZ1 => todo!(),
|
||||||
|
CzVersion::CZ2 => todo!(),
|
||||||
|
CzVersion::CZ3 => todo!(),
|
||||||
|
CzVersion::CZ4 => todo!(),
|
||||||
|
CzVersion::CZ5 => todo!(),
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn header(&self) -> &CommonHeader {
|
pub fn header(&self) -> &CommonHeader {
|
||||||
|
|
|
@ -1,12 +1,23 @@
|
||||||
use std::io::{Read, Seek};
|
use std::io::{Read, Write, Seek};
|
||||||
use byteorder::ReadBytesExt;
|
use byteorder::{ReadBytesExt, WriteBytesExt};
|
||||||
|
|
||||||
use crate::common::CzError;
|
use crate::common::CzError;
|
||||||
|
|
||||||
pub fn decode<T: Seek + ReadBytesExt + Read>(bytes: &mut T) -> Result<Vec<u8>, CzError> {
|
pub fn decode<T: Seek + ReadBytesExt + Read>(
|
||||||
|
input: &mut T
|
||||||
|
) -> Result<Vec<u8>, CzError> {
|
||||||
// Get the rest of the file, which is the bitmap
|
// Get the rest of the file, which is the bitmap
|
||||||
let mut bitmap = vec![];
|
let mut bitmap = vec![];
|
||||||
bytes.read_to_end(&mut bitmap)?;
|
input.read_to_end(&mut bitmap)?;
|
||||||
|
|
||||||
Ok(bitmap)
|
Ok(bitmap)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn encode<T: WriteBytesExt + Write>(
|
||||||
|
output: &mut T,
|
||||||
|
bitmap: &[u8]
|
||||||
|
) -> Result<(), CzError> {
|
||||||
|
output.write_all(bitmap)?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
use byteorder::ReadBytesExt;
|
use byteorder::{ReadBytesExt, WriteBytesExt};
|
||||||
use std::io::{Read, Seek, SeekFrom};
|
use std::io::{Read, Seek, SeekFrom, Write};
|
||||||
|
|
||||||
use crate::common::CzError;
|
use crate::common::CzError;
|
||||||
use crate::compression::{decompress, get_chunk_info};
|
use crate::compression::{decompress, get_chunk_info};
|
||||||
|
@ -14,3 +14,12 @@ pub fn decode<T: Seek + ReadBytesExt + Read>(bytes: &mut T) -> Result<Vec<u8>, C
|
||||||
|
|
||||||
Ok(bitmap)
|
Ok(bitmap)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn encode<T: WriteBytesExt + Write>(
|
||||||
|
output: &mut T,
|
||||||
|
bitmap: &[u8]
|
||||||
|
) -> Result<(), CzError> {
|
||||||
|
output.write_all(bitmap)?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue