From 896b9f22287fd679764b2d18959b65c89f293f5c Mon Sep 17 00:00:00 2001 From: G2-Games Date: Tue, 23 Jul 2024 15:41:52 -0500 Subject: [PATCH] Moved picture struct into new file --- Cargo.toml | 2 +- src/main.rs | 74 ++++---------------------------------------------- src/picture.rs | 68 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 75 insertions(+), 69 deletions(-) create mode 100644 src/picture.rs diff --git a/Cargo.toml b/Cargo.toml index e97c27c..e40e1df 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,4 +5,4 @@ edition = "2021" [dependencies] byteorder = "1.5.0" -image = "0.25.2" +image = { version = "0.25.2", default-features = false, features = ["png"] } diff --git a/src/main.rs b/src/main.rs index 0e844c0..fc82cb7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,17 +2,16 @@ mod compression; mod header; mod operations; mod binio; +mod picture; -use std::{fs::File, io::{Read, Write}}; - -use byteorder::{ReadBytesExt, WriteBytesExt, LE}; -use compression::{compress, decompress, ChunkInfo, CompressionInfo}; +use std::fs::File; use header::Header; +use picture::DangoPicture; + use image::RgbaImage; -use operations::{diff_line, line_diff}; fn main() { - let image_data = image::open("dripping.png").unwrap().to_rgba8(); + let image_data = image::open("test.png").unwrap().to_rgba8(); let encoded_dpf = DangoPicture { header: Header { width: image_data.width(), @@ -34,66 +33,5 @@ fn main() { decoded_dpf.header.height, decoded_dpf.bitmap ).unwrap(); - out_image.save("test2.png").unwrap(); -} - -struct DangoPicture { - header: Header, - bitmap: Vec, -} - -impl DangoPicture { - fn encode(&self, mut output: O) { - let header = Header { - width: self.header.width, - height: self.header.height, - - ..Default::default() - }; - - // Write out the header - output.write_all(&header.to_bytes()).unwrap(); - - let modified_data = diff_line(header.width, header.height, &self.bitmap); - - // Compress the image data - let (compressed_data, compression_info) = compress(&modified_data); - - // Write out compression info - compression_info.write_into(&mut output).unwrap(); - - // Write out compressed data - output.write_all(&compressed_data).unwrap(); - } - - fn decode(mut input: I) -> DangoPicture { - let mut magic = [0u8; 8]; - input.read_exact(&mut magic).unwrap(); - - let header = Header { - magic, - width: input.read_u32::().unwrap(), - height: input.read_u32::().unwrap(), - }; - - let mut compression_info = CompressionInfo { - chunk_count: input.read_u32::().unwrap() as usize, - chunks: Vec::new(), - }; - - for _ in 0..compression_info.chunk_count { - compression_info.chunks.push(ChunkInfo { - size_compressed: input.read_u32::().unwrap() as usize, - size_raw: input.read_u32::().unwrap() as usize, - }); - } - - let preprocessed_bitmap = decompress(&mut input, &compression_info); - let bitmap = line_diff(header.width, header.height, &preprocessed_bitmap); - - DangoPicture { - header, - bitmap - } - } + out_image.save("test.png").unwrap(); } diff --git a/src/picture.rs b/src/picture.rs new file mode 100644 index 0000000..d40e4df --- /dev/null +++ b/src/picture.rs @@ -0,0 +1,68 @@ +use std::io::{Read, Write}; + +use byteorder::{ReadBytesExt, WriteBytesExt, LE}; + +use crate::{compression::{compress, decompress, ChunkInfo, CompressionInfo}, header::Header, operations::{diff_line, line_diff}}; + +pub struct DangoPicture { + pub header: Header, + pub bitmap: Vec, +} + +impl DangoPicture { + /// Encode the image into anything that implements [Write] + pub fn encode(&self, mut output: O) { + let header = Header { + width: self.header.width, + height: self.header.height, + + ..Default::default() + }; + + // Write out the header + output.write_all(&header.to_bytes()).unwrap(); + + let modified_data = diff_line(header.width, header.height, &self.bitmap); + + // Compress the image data + let (compressed_data, compression_info) = compress(&modified_data); + + // Write out compression info + compression_info.write_into(&mut output).unwrap(); + + // Write out compressed data + output.write_all(&compressed_data).unwrap(); + } + + /// Decode the image from anything that implements [Read] + pub fn decode(mut input: I) -> DangoPicture { + let mut magic = [0u8; 8]; + input.read_exact(&mut magic).unwrap(); + + let header = Header { + magic, + width: input.read_u32::().unwrap(), + height: input.read_u32::().unwrap(), + }; + + let mut compression_info = CompressionInfo { + chunk_count: input.read_u32::().unwrap() as usize, + chunks: Vec::new(), + }; + + for _ in 0..compression_info.chunk_count { + compression_info.chunks.push(ChunkInfo { + size_compressed: input.read_u32::().unwrap() as usize, + size_raw: input.read_u32::().unwrap() as usize, + }); + } + + let preprocessed_bitmap = decompress(&mut input, &compression_info); + let bitmap = line_diff(header.width, header.height, &preprocessed_bitmap); + + DangoPicture { + header, + bitmap + } + } +}