use std::ops; use crate::{reader::FileReader, writer::FileWriter}; pub trait ColorDepth: Clone { const DEFAULT: Self; } impl ColorDepth for u8 { const DEFAULT: Self = 0; } impl ColorDepth for u16 { const DEFAULT: Self = 0; } impl ColorDepth for u32 { const DEFAULT: Self = 0; } #[derive(Debug, Clone, Copy)] pub struct RGBA { pub r: T, pub g: T, pub b: T, pub a: T } #[derive(Debug, Clone, Copy)] pub struct RGB { pub r: T, pub g: T, pub b: T, } pub trait ColorType: Clone { const DEFAULT: Self; } impl ColorType for RGBA { const DEFAULT: Self = Self { r: T::DEFAULT, g: T::DEFAULT, b: T::DEFAULT, a: T::DEFAULT }; } impl ColorType for RGB { const DEFAULT: Self = Self { r: T::DEFAULT, g: T::DEFAULT, b: T::DEFAULT}; } #[derive(Debug)] pub struct PixelArr { pub width: u32, pub height: u32, raw: Vec } impl PixelArr { pub fn new(width: u32, height: u32) -> Self { let raw = vec![T::DEFAULT;(width*height) as usize]; Self { width, height, raw } } } impl ops::Index<(usize, usize)> for PixelArr { type Output = T; fn index(&self, index: (usize, usize)) -> &Self::Output { let (x, y) = index; &self.raw[x + y*(self.width as usize)] } } impl ops::IndexMut<(usize, usize)> for PixelArr { fn index_mut(&mut self, index: (usize, usize)) -> &mut T { let (x, y) = index; &mut self.raw[x + y*(self.width as usize)] } } #[derive(Debug)] pub struct ImageBase { pub bit_depth: u8, pub pixels: PixelArr> } pub trait Image { fn read_image(reader: &mut FileReader) -> Result; fn write_image(image: &ImageBase, writer: &mut FileWriter)-> (); }