1 use embedded_graphics::{
3 geometry::{Point, Size},
5 raw::{RawData, RawU16},
9 style::{PrimitiveStyle, Styled},
13 pub struct FrameBuffer<'a> {
14 buf: &'a mut [[u16; 320]; 240],
18 impl<'a> FrameBuffer<'a> {
19 pub fn new(raw: &'a mut [[u16; 320]; 240]) -> Self {
20 Self { buf: raw, dirty: false }
23 pub fn inner(&mut self) -> Option<&[u16]> {
27 core::slice::from_raw_parts(
28 self.buf.as_ptr().cast::<u16>(),
29 (self.width() * self.height()) as usize,
37 fn width(&self) -> u32 {
38 self.buf[0].len() as u32
41 fn height(&self) -> u32 {
46 impl<'a> DrawTarget<Rgb565> for FrameBuffer<'a> {
49 fn size(&self) -> Size {
50 Size::new(self.width(), self.height())
53 fn draw_pixel(&mut self, pixel: Pixel<Rgb565>) -> Result<(), Self::Error> {
54 let Pixel(pos, color) = pixel;
56 if pos.x < 0 || pos.y < 0 || pos.x >= self.width() as i32 || pos.y >= self.height() as i32 {
60 self.buf[pos.y as usize][pos.x as usize] = swap(RawU16::from(color).into_inner());
65 const fn swap(inp: u16) -> u16 {
66 (inp & 0x00FF) << 8 | (inp & 0xFF00) >> 8