summaryrefslogtreecommitdiff
path: root/src/reader.rs
diff options
context:
space:
mode:
authorDylan <boss@tehbox.org>2026-08-26 23:58:16 +1200
committerDylan <boss@tehbox.org>2026-08-26 23:58:16 +1200
commit7c640bfeaf2a0fbc8c3550b4c19790a800a7f6a2 (patch)
tree60ef598fa415b6a01bed7b1c1f62c1c696111c8f /src/reader.rs
parentf8ffb92f2857677e4a9986ef154800ddb2e233fd (diff)
downloadtehimage-rs-master.tar.gz
tehimage-rs-master.zip
feat: Added a bunch of stuffHEADmaster
Added derive macro for byte encode Added start for PNG reading Added BMP writing
Diffstat (limited to 'src/reader.rs')
-rw-r--r--src/reader.rs69
1 files changed, 65 insertions, 4 deletions
diff --git a/src/reader.rs b/src/reader.rs
index 6f18e0b..2871cae 100644
--- a/src/reader.rs
+++ b/src/reader.rs
@@ -4,7 +4,11 @@ use crate::byte_encode::ByteEncode;
pub struct FileReader
{
- buf_reader: BufReader<File>
+ buf_reader: BufReader<File>,
+ le: bool,
+ checksum_func: Option<fn(&mut u32, &[u8]) -> ()>,
+ curr_checksum: u32,
+ checksum_start: u32,
}
impl FileReader {
@@ -12,7 +16,11 @@ impl FileReader {
{
Self
{
- buf_reader
+ buf_reader,
+ le: true,
+ checksum_func: None,
+ curr_checksum: 0,
+ checksum_start: 0
}
}
@@ -25,10 +33,63 @@ impl FileReader {
std::array::from_fn(|_| self.read())
}
- pub fn read<const N: usize, T: ByteEncode<N>>(&mut self) -> T
+ pub fn get_bytes(&mut self, n: usize) -> Vec<u8>
+ {
+ let mut buff = vec![0u8; n];
+ self.buf_reader.read_exact(&mut buff).expect("get_bytes failed to read");
+ if let Some(ref f) = self.checksum_func
+ {
+ f(&mut self.curr_checksum, buff.as_slice());
+ }
+ buff
+ }
+
+ pub fn read_bytes<const N: usize>(&mut self) -> [u8; N]
{
let mut data = [0u8; N];
self.buf_reader.read_exact(&mut data).expect("Bad read");
- T::from_le_bytes(&data)
+ if let Some(ref f) = self.checksum_func
+ {
+ f(&mut self.curr_checksum, &data);
+ }
+ data
+ }
+
+ pub fn read<const N: usize, T: ByteEncode<N>>(&mut self) -> T
+ {
+ let mut data = self.read_bytes::<N>();
+ if self.le
+ {
+ T::from_le_bytes(&data)
+ }
+ else
+ {
+ T::from_be_bytes(&mut data)
+ }
+ }
+
+ pub fn set_endianness(&mut self, le: bool)
+ {
+ self.le = le;
+ }
+
+ pub fn set_checksum_handler(&mut self, checksum_func: fn(&mut u32, &[u8]) -> (), checksum_start: u32)
+ {
+ self.checksum_func = Some(checksum_func);
+ self.checksum_start = checksum_start;
+ self.curr_checksum = checksum_start;
+
+ }
+
+ pub fn reset_checksum(&mut self) -> u32
+ {
+ let old_checksum = self.curr_checksum.clone();
+ self.curr_checksum = self.checksum_start.clone();
+ old_checksum
+ }
+
+ pub fn get_checksum(&self) -> u32
+ {
+ self.curr_checksum
}
}