1786012991

This commit is contained in:
2026-08-06 12:43:11 +02:00
parent dbe3f879a2
commit 86f391fc78
3 changed files with 60 additions and 20 deletions

View File

@@ -1,5 +1,6 @@
use embedded_graphics_core::pixelcolor::*; use embedded_graphics_core::pixelcolor::*;
use linfb::shape::Color; use linfb::shape::Color;
use slint::platform::software_renderer::TargetPixel;
/// Simple RGBA color wrapper. /// Simple RGBA color wrapper.
#[derive(Clone, Copy, Debug, PartialEq, Eq)] #[derive(Clone, Copy, Debug, PartialEq, Eq)]
@@ -80,28 +81,45 @@ impl Blend<Rgb888> for Rgba<Rgb888> {
} }
} }
impl From<(u8,u8,u8,u8)> for Rgba<Rgb888> { impl TargetPixel for Rgba<Rgb888> {
fn from(value: (u8,u8,u8,u8)) -> Self { fn blend(&mut self, color: slint::platform::software_renderer::PremultipliedRgbaColor) {
Self( let a = self.a() as u32;
Rgb888::new( // if a == 0 {
value.0, // return bg;
value.1, // }
value.2, // if a == 255 {
), // return self.rgb();
value.3, // }
)
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<Rgb888> {
fn from(value: (u8, u8, u8, u8)) -> Self {
Self(Rgb888::new(value.0, value.1, value.2), value.3)
} }
} }
impl From<Color> for Rgba<Rgb888> { impl From<Color> for Rgba<Rgb888> {
fn from(value: Color) -> Self { fn from(value: Color) -> Self {
Self( Self(Rgb888::new(value.red, value.green, value.blue), value.alpha)
Rgb888::new(
value.red,
value.green,
value.blue,
),
value.alpha,
)
} }
} }

View File

@@ -2,11 +2,14 @@ use std::rc::Rc;
use std::thread::sleep; use std::thread::sleep;
use std::time::{Duration, Instant}; use std::time::{Duration, Instant};
use embedded_graphics::prelude::DrawTarget;
use evdev::KeyCode; use evdev::KeyCode;
use slint::LogicalPosition; use slint::LogicalPosition;
use slint::platform::software_renderer::{MinimalSoftwareWindow, RepaintBufferType}; use slint::platform::software_renderer::{MinimalSoftwareWindow, RepaintBufferType};
use slint::platform::{Platform, WindowEvent}; use slint::platform::{Platform, WindowEvent};
use crate::rgba::Rgba;
use self::input::InputState; use self::input::InputState;
use self::screen::Screen; use self::screen::Screen;
@@ -50,8 +53,9 @@ impl<S> Trekstor<S> {
} }
pub fn update(&mut self) { pub fn update(&mut self) {
dbg!(self.ctx.screen.width() * self.ctx.screen.height()); // dbg!(self.ctx.screen.width() * self.ctx.screen.height());
let mut buffer1 = [slint::platform::software_renderer::Rgb565Pixel(0); 1];
let mut buffer1 = [Rgba::from((0, 0, 0, 0)); 614400];
loop { loop {
self.current_time = Instant::now(); self.current_time = Instant::now();
@@ -94,6 +98,11 @@ impl<S> Trekstor<S> {
renderer.render(&mut buffer1, self.ctx.screen.width() as usize); 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.screen.flush();
self.ctx.input.finish(); self.ctx.input.finish();
} }

View File

@@ -27,13 +27,26 @@ impl Screen {
self.framebuffer.flush(); self.framebuffer.flush();
} }
#[inline]
pub fn width(&self) -> u32 { pub fn width(&self) -> u32 {
self.width self.width
} }
#[inline]
pub fn height(&self) -> u32 { pub fn height(&self) -> u32 {
self.height 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 { impl Dimensions for Screen {