diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2024-02-06 11:24:50 +0400 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2024-02-06 11:25:25 +0400 |
| commit | b2298db5c59ed2378aa56095bfdfac8523a7ef77 (patch) | |
| tree | 6afd28e7300354e32afcd48f908f115e44e36cd5 /src/render_helpers/render_elements.rs | |
| parent | baa6263cbe72562b26c37514385ddeb4247feb3e (diff) | |
| download | niri-b2298db5c59ed2378aa56095bfdfac8523a7ef77.tar.gz niri-b2298db5c59ed2378aa56095bfdfac8523a7ef77.tar.bz2 niri-b2298db5c59ed2378aa56095bfdfac8523a7ef77.zip | |
Split render_helpers.rs
Diffstat (limited to 'src/render_helpers/render_elements.rs')
| -rw-r--r-- | src/render_helpers/render_elements.rs | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/src/render_helpers/render_elements.rs b/src/render_helpers/render_elements.rs new file mode 100644 index 00000000..d6423bff --- /dev/null +++ b/src/render_helpers/render_elements.rs @@ -0,0 +1,126 @@ +// We need to implement RenderElement manually due to AsGlesFrame requirement. +// This macro does it for us. +#[macro_export] +macro_rules! niri_render_elements { + ($name:ident => { $($variant:ident = $type:ty),+ $(,)? }) => { + #[derive(Debug)] + pub enum $name<R: $crate::render_helpers::renderer::NiriRenderer> { + $($variant($type)),+ + } + + impl<R: $crate::render_helpers::renderer::NiriRenderer> smithay::backend::renderer::element::Element for $name<R> { + fn id(&self) -> &smithay::backend::renderer::element::Id { + match self { + $($name::$variant(elem) => elem.id()),+ + } + } + + fn current_commit(&self) -> smithay::backend::renderer::utils::CommitCounter { + match self { + $($name::$variant(elem) => elem.current_commit()),+ + } + } + + fn geometry(&self, scale: smithay::utils::Scale<f64>) -> Rectangle<i32, smithay::utils::Physical> { + match self { + $($name::$variant(elem) => elem.geometry(scale)),+ + } + } + + fn transform(&self) -> smithay::utils::Transform { + match self { + $($name::$variant(elem) => elem.transform()),+ + } + } + + fn src(&self) -> smithay::utils::Rectangle<f64, smithay::utils::Buffer> { + match self { + $($name::$variant(elem) => elem.src()),+ + } + } + + fn damage_since( + &self, + scale: smithay::utils::Scale<f64>, + commit: Option<smithay::backend::renderer::utils::CommitCounter>, + ) -> Vec<smithay::utils::Rectangle<i32, smithay::utils::Physical>> { + match self { + $($name::$variant(elem) => elem.damage_since(scale, commit)),+ + } + } + + fn opaque_regions(&self, scale: smithay::utils::Scale<f64>) -> Vec<smithay::utils::Rectangle<i32, smithay::utils::Physical>> { + match self { + $($name::$variant(elem) => elem.opaque_regions(scale)),+ + } + } + + fn alpha(&self) -> f32 { + match self { + $($name::$variant(elem) => elem.alpha()),+ + } + } + + fn kind(&self) -> smithay::backend::renderer::element::Kind { + match self { + $($name::$variant(elem) => elem.kind()),+ + } + } + } + + impl smithay::backend::renderer::element::RenderElement<smithay::backend::renderer::gles::GlesRenderer> for $name<smithay::backend::renderer::gles::GlesRenderer> { + fn draw( + &self, + frame: &mut smithay::backend::renderer::gles::GlesFrame<'_>, + src: smithay::utils::Rectangle<f64, smithay::utils::Buffer>, + dst: smithay::utils::Rectangle<i32, smithay::utils::Physical>, + damage: &[smithay::utils::Rectangle<i32, smithay::utils::Physical>], + ) -> Result<(), smithay::backend::renderer::gles::GlesError> { + match self { + $($name::$variant(elem) => { + smithay::backend::renderer::element::RenderElement::<smithay::backend::renderer::gles::GlesRenderer>::draw(elem, frame, src, dst, damage) + })+ + } + } + + fn underlying_storage(&self, renderer: &mut smithay::backend::renderer::gles::GlesRenderer) -> Option<smithay::backend::renderer::element::UnderlyingStorage> { + match self { + $($name::$variant(elem) => elem.underlying_storage(renderer)),+ + } + } + } + + impl<'render, 'alloc> smithay::backend::renderer::element::RenderElement<$crate::backend::tty::TtyRenderer<'render, 'alloc>> + for $name<$crate::backend::tty::TtyRenderer<'render, 'alloc>> + { + fn draw( + &self, + frame: &mut $crate::backend::tty::TtyFrame<'render, 'alloc, '_>, + src: smithay::utils::Rectangle<f64, smithay::utils::Buffer>, + dst: smithay::utils::Rectangle<i32, smithay::utils::Physical>, + damage: &[smithay::utils::Rectangle<i32, smithay::utils::Physical>], + ) -> Result<(), $crate::backend::tty::TtyRendererError<'render, 'alloc>> { + match self { + $($name::$variant(elem) => { + smithay::backend::renderer::element::RenderElement::<$crate::backend::tty::TtyRenderer<'render, 'alloc>>::draw(elem, frame, src, dst, damage) + })+ + } + } + + fn underlying_storage( + &self, + renderer: &mut $crate::backend::tty::TtyRenderer<'render, 'alloc>, + ) -> Option<smithay::backend::renderer::element::UnderlyingStorage> { + match self { + $($name::$variant(elem) => elem.underlying_storage(renderer)),+ + } + } + } + + $(impl<R: $crate::render_helpers::renderer::NiriRenderer> From<$type> for $name<R> { + fn from(x: $type) -> Self { + Self::$variant(x) + } + })+ + }; +} |
