diff --git a/src/rgba.rs b/src/rgba.rs index b55d5db..2ba1669 100644 --- a/src/rgba.rs +++ b/src/rgba.rs @@ -1,5 +1,6 @@ use embedded_graphics_core::pixelcolor::*; use linfb::shape::Color; +use slint::platform::software_renderer::TargetPixel; /// Simple RGBA color wrapper. #[derive(Clone, Copy, Debug, PartialEq, Eq)] @@ -80,28 +81,45 @@ impl Blend for Rgba { } } -impl From<(u8,u8,u8,u8)> for Rgba { - fn from(value: (u8,u8,u8,u8)) -> Self { - Self( - Rgb888::new( - value.0, - value.1, - value.2, - ), - value.3, - ) +impl TargetPixel for Rgba { + fn blend(&mut self, color: slint::platform::software_renderer::PremultipliedRgbaColor) { + let a = self.a() as u32; + // if a == 0 { + // return bg; + // } + // if a == 255 { + // return self.rgb(); + // } + + let fr = self.rgb().r() as u32; + let fg = self.rgb().g() as u32; + let fb = self.rgb().b() as u32; + + let br = color.red as u32; + let bgc = color.green as u32; + let bb = color.blue as u32; + + let r = (br + mul_blend_u8(fr.wrapping_sub(br), a)) as u8; + let g = (bgc + mul_blend_u8(fg.wrapping_sub(bgc), a)) as u8; + let b = (bb + mul_blend_u8(fb.wrapping_sub(bb), a)) as u8; + + self.0 = Rgb888::new(r, g, b); + self.1 = a as u8; + } + + fn from_rgb(red: u8, green: u8, blue: u8) -> Self { + Self(Rgb888::new(red, green, blue), 255) + } +} + +impl From<(u8, u8, u8, u8)> for Rgba { + fn from(value: (u8, u8, u8, u8)) -> Self { + Self(Rgb888::new(value.0, value.1, value.2), value.3) } } impl From for Rgba { fn from(value: Color) -> Self { - Self( - Rgb888::new( - value.red, - value.green, - value.blue, - ), - value.alpha, - ) + Self(Rgb888::new(value.red, value.green, value.blue), value.alpha) } } diff --git a/src/trekstor.rs b/src/trekstor.rs index 211544f..ebd874a 100644 --- a/src/trekstor.rs +++ b/src/trekstor.rs @@ -2,11 +2,14 @@ use std::rc::Rc; use std::thread::sleep; use std::time::{Duration, Instant}; +use embedded_graphics::prelude::DrawTarget; use evdev::KeyCode; use slint::LogicalPosition; use slint::platform::software_renderer::{MinimalSoftwareWindow, RepaintBufferType}; use slint::platform::{Platform, WindowEvent}; +use crate::rgba::Rgba; + use self::input::InputState; use self::screen::Screen; @@ -50,8 +53,9 @@ impl Trekstor { } pub fn update(&mut self) { - dbg!(self.ctx.screen.width() * self.ctx.screen.height()); - let mut buffer1 = [slint::platform::software_renderer::Rgb565Pixel(0); 1]; + // dbg!(self.ctx.screen.width() * self.ctx.screen.height()); + + let mut buffer1 = [Rgba::from((0, 0, 0, 0)); 614400]; loop { self.current_time = Instant::now(); @@ -94,6 +98,11 @@ impl Trekstor { renderer.render(&mut buffer1, self.ctx.screen.width() as usize); }); + self.ctx + .screen + .fill_contiguous(&self.ctx.screen.rect(), buffer1) + .unwrap(); + self.ctx.screen.flush(); self.ctx.input.finish(); } diff --git a/src/trekstor/screen.rs b/src/trekstor/screen.rs index 54c0fe3..8b527ec 100644 --- a/src/trekstor/screen.rs +++ b/src/trekstor/screen.rs @@ -27,13 +27,26 @@ impl Screen { self.framebuffer.flush(); } + #[inline] pub fn width(&self) -> u32 { self.width } + #[inline] pub fn height(&self) -> u32 { self.height } + + #[inline] + pub fn rect(&self) -> Rectangle { + Rectangle { + top_left: Point::new(0, 0), + size: Size { + width: self.width(), + height: self.height(), + }, + } + } } impl Dimensions for Screen {