summaryrefslogtreecommitdiff
path: root/src/bmp.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/bmp.rs
parentf8ffb92f2857677e4a9986ef154800ddb2e233fd (diff)
downloadtehimage-rs-7c640bfeaf2a0fbc8c3550b4c19790a800a7f6a2.tar.gz
tehimage-rs-7c640bfeaf2a0fbc8c3550b4c19790a800a7f6a2.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/bmp.rs')
-rw-r--r--src/bmp.rs83
1 files changed, 59 insertions, 24 deletions
diff --git a/src/bmp.rs b/src/bmp.rs
index 8592894..2833686 100644
--- a/src/bmp.rs
+++ b/src/bmp.rs
@@ -1,13 +1,53 @@
-use crate::{image::{ColorType, Image, ImageBase, PixelArr, RGB, RGBA}, reader::FileReader, writer::FileWriter};
+use crate::{byte_encode::ByteEncode, image::{ColorType, Image, ImageBase, PixelArr, RGB, RGBA}, reader::FileReader, writer::FileWriter};
+
+// extern crate byte_encode_derive;
+use byte_encode_derive::ByteEncode;
+
+
+trait BitmapHeader
+{
+ fn get_width(&self) -> u32;
+ fn get_height(&self) -> u32;
+ fn get_bpp(&self) -> u8;
+}
+
+#[derive(Clone, ByteEncode)]
+struct BITMAPINFOHEADER
+{
+ width: u32,
+ height: u32,
+ _color_planes: u16,
+ bpp: u16,
+ compression_method: u32,
+ _image_size: u32,
+ _horr_res: u32,
+ _vert_res: u32,
+ _palette_size: u32,
+ _important_colors: u32
+}
+
+impl BitmapHeader for BITMAPINFOHEADER
+{
+ fn get_width(&self) -> u32 {
+ self.width
+ }
+ fn get_height(&self) -> u32 {
+ self.height
+ }
+ fn get_bpp(&self) -> u8 {
+ self.bpp as u8
+ }
+}
+
impl<T: ColorType> Image<T> for BMPImage
{
- fn read_image(reader: &mut FileReader) -> Result<ImageBase<T>, &'static str>
+ fn read_image(reader: &mut FileReader) -> Result<ImageBase<T>, String>
{
let magic: [u8; 2] = reader.read_array();
if magic != [0x42, 0x4d]
{
- return Err("Not a bitmap!");
+ return Err("Not a bitmap!".to_owned());
}
let _file_size: u32 = reader.read();
@@ -22,39 +62,34 @@ impl<T: ColorType> Image<T> for BMPImage
let height: u32;
let bpp: u8;
- if header_size == 40
+
+ if header_size == 12 // BITMAPCOREHEADER
{
- width = reader.read();
- height = reader.read();
+ width = reader.read::<2, u16>() as u32;
+ height = reader.read::<2, u16>() as u32;
let _color_planes: u16 = reader.read();
bpp = reader.read::<2, u16>() as u8;
- let compression_method: u32 = reader.read();
- let _image_size: u32 = reader.read();
- let _horr_res: u32 = reader.read();
- let _vert_res: u32 = reader.read();
- let _color_count: u32 = reader.read();
- let _impotant_color_count: u32 = reader.read();
+ }
+ else if header_size == 40 // BITMAPINFOHEADER
+ {
+ let header: BITMAPINFOHEADER = reader.read();
+ width = header.get_width();
+ height = header.get_height();
+ bpp = header.get_bpp();
- if compression_method != 0
+ if header.compression_method != 0
{
- return Err("Compresssion method not supported");
+ return Err(format!("Bitmap compresssion method {0} not supported", header.compression_method));
}
}
- else if header_size == 12
- {
- width = reader.read::<2, u16>() as u32;
- height = reader.read::<2, u16>() as u32;
- let _color_planes: u16 = reader.read();
- bpp = reader.read::<2, u16>() as u8;
- }
else
{
- return Err("Header size not supported yet");
+ return Err(format!("Bitmap header size {header_size} not supported yet"));
}
if bpp != 24
{
- return Err("Only bpp of 24 is supported so far");
+ return Err(format!("bpp {bpp} not supported yet, only 24 is supported"));
}
let row_size = (((bpp as u32) * width + 31)/32) * 4;
@@ -76,7 +111,7 @@ impl<T: ColorType> Image<T> for BMPImage
return Ok(ImageBase
{
- bit_depth: bpp,
+ bpp,
pixels: pixel_arr,
})
}