diff options
Diffstat (limited to 'src/render_helpers')
| -rw-r--r-- | src/render_helpers/clipped_surface.rs | 29 | ||||
| -rw-r--r-- | src/render_helpers/damage.rs | 75 | ||||
| -rw-r--r-- | src/render_helpers/mod.rs | 1 |
3 files changed, 104 insertions, 1 deletions
diff --git a/src/render_helpers/clipped_surface.rs b/src/render_helpers/clipped_surface.rs index 69c2a012..43ba8594 100644 --- a/src/render_helpers/clipped_surface.rs +++ b/src/render_helpers/clipped_surface.rs @@ -6,8 +6,9 @@ use smithay::backend::renderer::gles::{ GlesError, GlesFrame, GlesRenderer, GlesTexProgram, Uniform, }; use smithay::backend::renderer::utils::{CommitCounter, DamageSet}; -use smithay::utils::{Buffer, Logical, Physical, Rectangle, Scale, Transform}; +use smithay::utils::{Buffer, Logical, Physical, Rectangle, Scale, Size, Transform}; +use super::damage::ExtraDamage; use super::renderer::{AsGlesFrame as _, NiriRenderer}; use super::shaders::{mat3_uniform, Shaders}; use crate::backend::tty::{TtyFrame, TtyRenderer, TtyRendererError}; @@ -21,6 +22,12 @@ pub struct ClippedSurfaceRenderElement<R: NiriRenderer> { input_to_geo: Mat3, } +#[derive(Debug, Default, Clone)] +pub struct RoundedCornerDamage { + damage: ExtraDamage, + corner_radius: CornerRadius, +} + impl<R: NiriRenderer> ClippedSurfaceRenderElement<R> { pub fn new( elem: WaylandSurfaceRenderElement<R>, @@ -267,3 +274,23 @@ impl<'render> RenderElement<TtyRenderer<'render>> None } } + +impl RoundedCornerDamage { + pub fn set_size(&mut self, size: Size<i32, Logical>) { + self.damage.set_size(size); + } + + pub fn set_corner_radius(&mut self, corner_radius: CornerRadius) { + if self.corner_radius == corner_radius { + return; + } + + // FIXME: make the damage granular. + self.corner_radius = corner_radius; + self.damage.damage_all(); + } + + pub fn element(&self) -> ExtraDamage { + self.damage.clone() + } +} diff --git a/src/render_helpers/damage.rs b/src/render_helpers/damage.rs new file mode 100644 index 00000000..ef7b125f --- /dev/null +++ b/src/render_helpers/damage.rs @@ -0,0 +1,75 @@ +use smithay::backend::renderer::element::{Element, Id, RenderElement}; +use smithay::backend::renderer::utils::CommitCounter; +use smithay::backend::renderer::Renderer; +use smithay::utils::{Buffer, Logical, Physical, Point, Rectangle, Scale, Size}; + +#[derive(Debug, Clone)] +pub struct ExtraDamage { + id: Id, + commit: CommitCounter, + geometry: Rectangle<i32, Logical>, +} + +impl ExtraDamage { + pub fn new() -> Self { + Self { + id: Id::new(), + commit: Default::default(), + geometry: Default::default(), + } + } + + pub fn set_size(&mut self, size: Size<i32, Logical>) { + if self.geometry.size == size { + return; + } + + self.geometry.size = size; + self.commit.increment(); + } + + pub fn damage_all(&mut self) { + self.commit.increment(); + } + + pub fn with_location(mut self, location: Point<i32, Logical>) -> Self { + self.geometry.loc = location; + self + } +} + +impl Default for ExtraDamage { + fn default() -> Self { + Self::new() + } +} + +impl Element for ExtraDamage { + fn id(&self) -> &Id { + &self.id + } + + fn current_commit(&self) -> CommitCounter { + self.commit + } + + fn src(&self) -> Rectangle<f64, Buffer> { + Rectangle::from_loc_and_size((0., 0.), (1., 1.)) + } + + fn geometry(&self, scale: Scale<f64>) -> Rectangle<i32, Physical> { + self.geometry.to_physical_precise_round(scale) + } +} + +impl<R: Renderer> RenderElement<R> for ExtraDamage { + fn draw( + &self, + _frame: &mut <R as Renderer>::Frame<'_>, + _src: Rectangle<f64, Buffer>, + _dst: Rectangle<i32, Physical>, + _damage: &[Rectangle<i32, Physical>], + ) -> Result<(), R::Error> { + Ok(()) + } +} diff --git a/src/render_helpers/mod.rs b/src/render_helpers/mod.rs index ebc4b49e..b1f8fd03 100644 --- a/src/render_helpers/mod.rs +++ b/src/render_helpers/mod.rs @@ -18,6 +18,7 @@ use self::primary_gpu_texture::PrimaryGpuTextureRenderElement; pub mod border; pub mod clipped_surface; +pub mod damage; pub mod offscreen; pub mod primary_gpu_texture; pub mod render_elements; |
