diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2024-05-01 19:06:08 +0400 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2024-05-02 14:27:53 +0400 |
| commit | 42cef79c699c0f03b4bb99c4278169c48d9a5bd0 (patch) | |
| tree | 630d18b49f3d93603a79bcfc5734dc773c6d0cb6 /src/render_helpers/resize.rs | |
| parent | d86df5025cfd26ef4a3c48acd8ee80555265ee53 (diff) | |
| download | niri-42cef79c699c0f03b4bb99c4278169c48d9a5bd0.tar.gz niri-42cef79c699c0f03b4bb99c4278169c48d9a5bd0.tar.bz2 niri-42cef79c699c0f03b4bb99c4278169c48d9a5bd0.zip | |
Implement rounded window corners
Diffstat (limited to 'src/render_helpers/resize.rs')
| -rw-r--r-- | src/render_helpers/resize.rs | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/src/render_helpers/resize.rs b/src/render_helpers/resize.rs index 9641c8d8..8ba897ef 100644 --- a/src/render_helpers/resize.rs +++ b/src/render_helpers/resize.rs @@ -1,25 +1,24 @@ use std::collections::HashMap; use glam::{Mat3, Vec2}; +use niri_config::CornerRadius; use smithay::backend::renderer::element::{Element, Id, Kind, RenderElement, UnderlyingStorage}; use smithay::backend::renderer::gles::{GlesError, GlesFrame, GlesRenderer, GlesTexture, Uniform}; use smithay::backend::renderer::utils::{CommitCounter, DamageSet}; use smithay::utils::{Buffer, Logical, Physical, Rectangle, Scale, Size, Transform}; -use super::primary_gpu_pixel_shader_with_textures::{ - PixelWithTexturesProgram, PrimaryGpuPixelShaderWithTexturesRenderElement, -}; use super::renderer::{AsGlesFrame, NiriRenderer}; +use super::shader_element::{ShaderProgram, ShaderRenderElement}; use super::shaders::{mat3_uniform, Shaders}; use crate::backend::tty::{TtyFrame, TtyRenderer, TtyRendererError}; #[derive(Debug)] -pub struct ResizeRenderElement(PrimaryGpuPixelShaderWithTexturesRenderElement); +pub struct ResizeRenderElement(ShaderRenderElement); impl ResizeRenderElement { #[allow(clippy::too_many_arguments)] pub fn new( - shader: PixelWithTexturesProgram, + shader: ShaderProgram, area: Rectangle<i32, Logical>, scale: Scale<f64>, texture_prev: (GlesTexture, Rectangle<i32, Physical>), @@ -28,6 +27,8 @@ impl ResizeRenderElement { size_next: Size<i32, Logical>, progress: f32, clamped_progress: f32, + corner_radius: CornerRadius, + clip_to_geometry: bool, result_alpha: f32, ) -> Self { let curr_geo = area; @@ -84,9 +85,13 @@ impl ResizeRenderElement { * Mat3::from_scale(size_next / tex_next_geo_size * scale); let curr_geo_size = curr_geo_size * scale; + let corner_radius = corner_radius + .scaled_by(scale.x) + .fit_to(curr_geo_size.x, curr_geo_size.y); + let clip_to_geometry = if clip_to_geometry { 1. } else { 0. }; // Create the shader. - Self(PrimaryGpuPixelShaderWithTexturesRenderElement::new( + Self(ShaderRenderElement::new( shader, HashMap::from([ (String::from("niri_tex_prev"), texture_prev), @@ -105,12 +110,14 @@ impl ResizeRenderElement { mat3_uniform("niri_geo_to_tex_next", geo_to_tex_next), Uniform::new("niri_progress", progress), Uniform::new("niri_clamped_progress", clamped_progress), + Uniform::new("niri_corner_radius", <[f32; 4]>::from(corner_radius)), + Uniform::new("niri_clip_to_geometry", clip_to_geometry), ], Kind::Unspecified, )) } - pub fn shader(renderer: &mut impl NiriRenderer) -> Option<PixelWithTexturesProgram> { + pub fn shader(renderer: &mut impl NiriRenderer) -> Option<ShaderProgram> { Shaders::get(renderer).resize() } } |
