use embedded_graphics::{pixelcolor::Rgb888, prelude::*, primitives::Rectangle}; use linfb::{Framebuffer, shape::Color}; use crate::rgba::Rgba; pub struct Screen { framebuffer: Framebuffer, width: u32, height: u32, } impl Screen { pub fn new() -> Self { let framebuffer = Framebuffer::open() .expect("Failed to open framebuffer"); let width = framebuffer.screen_info.xres; let height = framebuffer.screen_info.yres; Self { framebuffer, width, height } } pub fn width(&self) -> u32 { self.width } pub fn height(&self) -> u32 { self.height } } impl Dimensions for Screen { fn bounding_box(&self) -> Rectangle { Rectangle::new( Point::new(0, 0), Size::new(self.width, self.height), ) } } impl DrawTarget for Screen { type Color = Rgba; type Error = Box; fn draw_iter(&mut self, pixels: I) -> Result<(), Self::Error> where I: IntoIterator>, { let width = self.bounding_box().size.width; let height = self.bounding_box().size.height; for p in pixels { let x = p.0.x as u32; let y = p.0.y as u32; let color = Color { red: p.1.r(), green: p.1.g(), blue: p.1.b(), alpha: p.1.a(), }; if !(0..width).contains(&x) || !(0..height).contains(&y) { continue; } self.framebuffer.set_pixel(x, y, color); } self.framebuffer.flush(); Ok(()) } }