render: make surfaces own rectangles, to drop a clone

This commit is contained in:
Victoria Fischer 2024-12-14 14:48:31 +01:00
parent f180171ee7
commit e9bbdd13c2
3 changed files with 14 additions and 15 deletions

View File

@ -58,9 +58,9 @@ impl Shader for ThinkingShader {
impl<T: Surface> IdleTask<T> { impl<T: Surface> IdleTask<T> {
pub fn new<S: Surfaces<Surface = T>>(surfaces: &mut S) -> Self { pub fn new<S: Surfaces<Surface = T>>(surfaces: &mut S) -> Self {
IdleTask { IdleTask {
solid: surfaces.new_surface(&Rectangle::everything()).unwrap(), solid: surfaces.new_surface(Rectangle::everything()).unwrap(),
surface: surfaces.new_surface(&Rectangle::everything()).unwrap(), surface: surfaces.new_surface(Rectangle::everything()).unwrap(),
shimmer: surfaces.new_surface(&Rectangle::everything()).unwrap(), shimmer: surfaces.new_surface(Rectangle::everything()).unwrap(),
} }
} }
} }
@ -183,8 +183,7 @@ impl<T: Surface> Task for TestPattern<T> {
self.stepper.run(|| { self.stepper.run(|| {
self.frame = self.frame.wrapping_add(1); self.frame = self.frame.wrapping_add(1);
self.surface.set_opacity(sin8(self.frame)); self.surface.set_opacity(sin8(self.frame));
//log::info!("Step {}", self.frame); self.surface.set_rect( match self.pattern {
self.surface.set_rect( &match self.pattern {
TestShader::SweepX => Rectangle::new( TestShader::SweepX => Rectangle::new(
Coordinates::new(self.frame, 0), Coordinates::new(self.frame, 0),
Coordinates::new(self.frame, 255) Coordinates::new(self.frame, 255)

View File

@ -82,9 +82,9 @@ impl Surface for BufferedSurface {
}); });
} }
fn set_rect(&mut self, rect: &Rectangle<Virtual>) { fn set_rect(&mut self, rect: Rectangle<Virtual>) {
self.updater.push(SurfaceUpdate { self.updater.push(SurfaceUpdate {
rect: Some(rect.clone()), rect: Some(rect),
slot: self.slot, slot: self.slot,
..Default::default() ..Default::default()
}); });
@ -179,12 +179,12 @@ impl Surfaces for ShaderChain {
type Error = (); type Error = ();
type Surface = BufferedSurface; type Surface = BufferedSurface;
fn new_surface(&mut self, area: &Rectangle<Virtual>) -> Result<Self::Surface, Self::Error> { fn new_surface(&mut self, area: Rectangle<Virtual>) -> Result<Self::Surface, Self::Error> {
let next_slot = self.bindings.len(); let next_slot = self.bindings.len();
self.bindings.push(ShaderBinding { self.bindings.push(ShaderBinding {
opacity: 255, opacity: 255,
shader: None, shader: None,
rect: area.clone() rect: area
}); });
Ok(BufferedSurface { Ok(BufferedSurface {
@ -225,7 +225,7 @@ impl BufferedSurfacePool {
impl Surfaces for BufferedSurfacePool { impl Surfaces for BufferedSurfacePool {
type Error = (); type Error = ();
type Surface = <ShaderChain as Surfaces>::Surface; type Surface = <ShaderChain as Surfaces>::Surface;
fn new_surface(&mut self, area: &crate::geometry::Rectangle<crate::geometry::Virtual>) -> Result<Self::Surface, Self::Error> { fn new_surface(&mut self, area: crate::geometry::Rectangle<crate::geometry::Virtual>) -> Result<Self::Surface, Self::Error> {
self.pool.write().unwrap().new_surface(area) self.pool.write().unwrap().new_surface(area)
} }
@ -270,8 +270,8 @@ impl Surface for SharedSurface {
self.binding.lock().unwrap().shader = None; self.binding.lock().unwrap().shader = None;
} }
fn set_rect(&mut self, rect: &Rectangle<Virtual>) { fn set_rect(&mut self, rect: Rectangle<Virtual>) {
self.binding.lock().unwrap().rect = rect.clone(); self.binding.lock().unwrap().rect = rect;
} }
fn set_opacity(&mut self, opacity: u8) { fn set_opacity(&mut self, opacity: u8) {
@ -296,7 +296,7 @@ impl SurfacePool {
impl Surfaces for SurfacePool { impl Surfaces for SurfacePool {
type Surface = SharedSurface; type Surface = SharedSurface;
type Error = io::Error; type Error = io::Error;
fn new_surface(&mut self, area: &Rectangle<Virtual>) -> Result<Self::Surface, Self::Error> { fn new_surface(&mut self, area: Rectangle<Virtual>) -> Result<Self::Surface, Self::Error> {
let mut surface = SharedSurface::default(); let mut surface = SharedSurface::default();
surface.set_rect(area); surface.set_rect(area);
self.surfaces.push(surface.clone()); self.surfaces.push(surface.clone());

View File

@ -30,7 +30,7 @@ pub trait Shader: Send + Sync {
pub trait Surfaces: Send + Sync { pub trait Surfaces: Send + Sync {
type Surface: Surface; type Surface: Surface;
type Error: Debug; type Error: Debug;
fn new_surface(&mut self, area: &Rectangle<Virtual>) -> Result<Self::Surface, Self::Error>; fn new_surface(&mut self, area: Rectangle<Virtual>) -> Result<Self::Surface, Self::Error>;
fn render_to<S: Sample>(&self, output: &mut S, frame: usize); fn render_to<S: Sample>(&self, output: &mut S, frame: usize);
} }
@ -38,7 +38,7 @@ pub trait Surface: Send + Sync {
fn set_shader(&mut self, shader: Box<dyn Shader>); fn set_shader(&mut self, shader: Box<dyn Shader>);
fn clear_shader(&mut self); fn clear_shader(&mut self);
fn set_rect(&mut self, rect: &Rectangle<Virtual>); fn set_rect(&mut self, rect: Rectangle<Virtual>);
fn set_opacity(&mut self, opacity: u8); fn set_opacity(&mut self, opacity: u8);
} }