]> patrickod personal git archive - keywing-rs.git/blob - keywing/src/buffer.rs
Working little text editor
[keywing-rs.git] / keywing / src / buffer.rs
1 use embedded_graphics::{
2     drawable::Pixel,
3     geometry::{Point, Size},
4     pixelcolor::{
5         raw::{RawData, RawU16},
6         Rgb565,
7     },
8     primitives::Rectangle,
9     style::{PrimitiveStyle, Styled},
10     DrawTarget,
11 };
12
13 pub struct FrameBuffer<'a> {
14     buf: &'a mut [[u16; 320]; 240],
15     dirty: bool,
16 }
17
18 impl<'a> FrameBuffer<'a> {
19     pub fn new(raw: &'a mut [[u16; 320]; 240]) -> Self {
20         Self { buf: raw, dirty: false }
21     }
22
23     pub fn inner(&mut self) -> Option<&[u16]> {
24         if self.dirty {
25             self.dirty = false;
26             Some(unsafe {
27                 core::slice::from_raw_parts(
28                     self.buf.as_ptr().cast::<u16>(),
29                     (self.width() * self.height()) as usize,
30                 )
31             })
32         } else {
33             None
34         }
35     }
36
37     fn width(&self) -> u32 {
38         self.buf[0].len() as u32
39     }
40
41     fn height(&self) -> u32 {
42         self.buf.len() as u32
43     }
44 }
45
46 impl<'a> DrawTarget<Rgb565> for FrameBuffer<'a> {
47     type Error = ();
48
49     fn size(&self) -> Size {
50         Size::new(self.width(), self.height())
51     }
52
53     fn draw_pixel(&mut self, pixel: Pixel<Rgb565>) -> Result<(), Self::Error> {
54         let Pixel(pos, color) = pixel;
55
56         if pos.x < 0 || pos.y < 0 || pos.x >= self.width() as i32 || pos.y >= self.height() as i32 {
57             return Ok(());
58         }
59         self.dirty = true;
60         self.buf[pos.y as usize][pos.x as usize] = swap(RawU16::from(color).into_inner());
61         Ok(())
62     }
63 }
64
65 const fn swap(inp: u16) -> u16 {
66     (inp & 0x00FF) << 8 | (inp & 0xFF00) >> 8
67 }