X-Git-Url: https://git.patrickod.com/tor.noisebridge.net/tree/src/App.css?a=blobdiff_plain;f=keywing%2Fsrc%2Fbuffer.rs;fp=keywing%2Fsrc%2Fbuffer.rs;h=f334eb4d5d5338e97cb2158c07a5ff1414beba40;hb=fdaa0cd104dcde008b93d7dadb830508084c45c3;hp=da912ad88afcf4876ac81d64537bbc888583c6b7;hpb=f0c087b3c6464eab7d19a3a7b8c8835aff3cc6c1;p=keywing-rs.git diff --git a/keywing/src/buffer.rs b/keywing/src/buffer.rs index da912ad..f334eb4 100644 --- a/keywing/src/buffer.rs +++ b/keywing/src/buffer.rs @@ -12,32 +12,38 @@ use embedded_graphics::{ pub struct FrameBuffer<'a> { buf: &'a mut [[u16; 320]; 240], + dirty: bool, } impl<'a> FrameBuffer<'a> { pub fn new(raw: &'a mut [[u16; 320]; 240]) -> Self { - Self { - buf: raw - } + Self { buf: raw, dirty: false } } - pub fn inner(&self) -> &[u16] { - unsafe { - core::slice::from_raw_parts(self.buf.as_ptr().cast::(), (self.width() * self.height()) as usize) + pub fn inner(&mut self) -> Option<&[u16]> { + if self.dirty { + self.dirty = false; + Some(unsafe { + core::slice::from_raw_parts( + self.buf.as_ptr().cast::(), + (self.width() * self.height()) as usize, + ) + }) + } else { + None } } fn width(&self) -> u32 { - self.buf.len() as u32 + self.buf[0].len() as u32 } fn height(&self) -> u32 { - self.buf[0].len() as u32 + self.buf.len() as u32 } } -impl<'a> DrawTarget for FrameBuffer<'a> -{ +impl<'a> DrawTarget for FrameBuffer<'a> { type Error = (); fn size(&self) -> Size { @@ -50,13 +56,12 @@ impl<'a> DrawTarget for FrameBuffer<'a> if pos.x < 0 || pos.y < 0 || pos.x >= self.width() as i32 || pos.y >= self.height() as i32 { return Ok(()); } - + self.dirty = true; self.buf[pos.y as usize][pos.x as usize] = swap(RawU16::from(color).into_inner()); Ok(()) } } const fn swap(inp: u16) -> u16 { - (inp & 0x00FF) << 8 | - (inp & 0xFF00) >> 8 + (inp & 0x00FF) << 8 | (inp & 0xFF00) >> 8 }