| use crate::GraphicGroupTable; |
| pub use crate::color::*; |
| use crate::raster_types::{CPU, RasterDataTable}; |
| use crate::vector::VectorDataTable; |
| use std::fmt::Debug; |
|
|
| #[cfg(target_arch = "spirv")] |
| use spirv_std::num_traits::float::Float; |
|
|
| |
| pub mod color { |
| pub use super::*; |
| } |
|
|
| pub mod image; |
|
|
| pub use self::image::Image; |
|
|
| pub trait Bitmap { |
| type Pixel: Pixel; |
| fn width(&self) -> u32; |
| fn height(&self) -> u32; |
| fn dimensions(&self) -> (u32, u32) { |
| (self.width(), self.height()) |
| } |
| fn dim(&self) -> (u32, u32) { |
| self.dimensions() |
| } |
| fn get_pixel(&self, x: u32, y: u32) -> Option<Self::Pixel>; |
| } |
|
|
| impl<T: Bitmap> Bitmap for &T { |
| type Pixel = T::Pixel; |
|
|
| fn width(&self) -> u32 { |
| (**self).width() |
| } |
|
|
| fn height(&self) -> u32 { |
| (**self).height() |
| } |
|
|
| fn get_pixel(&self, x: u32, y: u32) -> Option<Self::Pixel> { |
| (**self).get_pixel(x, y) |
| } |
| } |
|
|
| impl<T: Bitmap> Bitmap for &mut T { |
| type Pixel = T::Pixel; |
|
|
| fn width(&self) -> u32 { |
| (**self).width() |
| } |
|
|
| fn height(&self) -> u32 { |
| (**self).height() |
| } |
|
|
| fn get_pixel(&self, x: u32, y: u32) -> Option<Self::Pixel> { |
| (**self).get_pixel(x, y) |
| } |
| } |
|
|
| pub trait BitmapMut: Bitmap { |
| fn get_pixel_mut(&mut self, x: u32, y: u32) -> Option<&mut Self::Pixel>; |
| fn set_pixel(&mut self, x: u32, y: u32, pixel: Self::Pixel) { |
| *self.get_pixel_mut(x, y).unwrap() = pixel; |
| } |
| fn map_pixels<F: Fn(Self::Pixel) -> Self::Pixel>(&mut self, map_fn: F) { |
| for y in 0..self.height() { |
| for x in 0..self.width() { |
| let pixel = self.get_pixel(x, y).unwrap(); |
| self.set_pixel(x, y, map_fn(pixel)); |
| } |
| } |
| } |
| } |
|
|
| impl<T: BitmapMut + Bitmap> BitmapMut for &mut T { |
| fn get_pixel_mut(&mut self, x: u32, y: u32) -> Option<&mut Self::Pixel> { |
| (*self).get_pixel_mut(x, y) |
| } |
| } |
|
|