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 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<Rgb888> for Rgba<Rgb888> {
}
}
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 TargetPixel for Rgba<Rgb888> {
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<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> {
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)
}
}

View File

@@ -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<S> Trekstor<S> {
}
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<S> Trekstor<S> {
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();
}

View File

@@ -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 {