diff options
Diffstat (limited to 'src/render_helpers')
| -rw-r--r-- | src/render_helpers/border.rs | 43 | ||||
| -rw-r--r-- | src/render_helpers/shaders/border.frag | 174 | ||||
| -rw-r--r-- | src/render_helpers/shaders/mod.rs | 2 |
3 files changed, 209 insertions, 10 deletions
diff --git a/src/render_helpers/border.rs b/src/render_helpers/border.rs index c3442425..c0ab6663 100644 --- a/src/render_helpers/border.rs +++ b/src/render_helpers/border.rs @@ -1,7 +1,9 @@ use std::collections::HashMap; use glam::{Mat3, Vec2}; -use niri_config::CornerRadius; +use niri_config::{ + Color, CornerRadius, GradientColorSpace, GradientInterpolation, HueInterpolation, +}; use smithay::backend::renderer::element::{Element, Id, Kind, RenderElement, UnderlyingStorage}; use smithay::backend::renderer::gles::{GlesError, GlesFrame, GlesRenderer, Uniform}; use smithay::backend::renderer::utils::{CommitCounter, DamageSet, OpaqueRegions}; @@ -28,8 +30,9 @@ pub struct BorderRenderElement { struct Parameters { size: Size<f64, Logical>, gradient_area: Rectangle<f64, Logical>, - color_from: [f32; 4], - color_to: [f32; 4], + gradient_format: GradientInterpolation, + color_from: Color, + color_to: Color, angle: f32, geometry: Rectangle<f64, Logical>, border_width: f32, @@ -43,8 +46,9 @@ impl BorderRenderElement { pub fn new( size: Size<f64, Logical>, gradient_area: Rectangle<f64, Logical>, - color_from: [f32; 4], - color_to: [f32; 4], + gradient_format: GradientInterpolation, + color_from: Color, + color_to: Color, angle: f32, geometry: Rectangle<f64, Logical>, border_width: f32, @@ -57,6 +61,7 @@ impl BorderRenderElement { params: Parameters { size, gradient_area, + gradient_format, color_from, color_to, angle, @@ -77,6 +82,7 @@ impl BorderRenderElement { params: Parameters { size: Default::default(), gradient_area: Default::default(), + gradient_format: GradientInterpolation::default(), color_from: Default::default(), color_to: Default::default(), angle: 0., @@ -97,8 +103,9 @@ impl BorderRenderElement { &mut self, size: Size<f64, Logical>, gradient_area: Rectangle<f64, Logical>, - color_from: [f32; 4], - color_to: [f32; 4], + gradient_format: GradientInterpolation, + color_from: Color, + color_to: Color, angle: f32, geometry: Rectangle<f64, Logical>, border_width: f32, @@ -108,6 +115,7 @@ impl BorderRenderElement { let params = Parameters { size, gradient_area, + gradient_format, color_from, color_to, angle, @@ -128,6 +136,7 @@ impl BorderRenderElement { let Parameters { size, gradient_area, + gradient_format, color_from, color_to, angle, @@ -162,13 +171,29 @@ impl BorderRenderElement { let input_to_geo = Mat3::from_scale(area_size) * Mat3::from_translation(-geo_loc / area_size); + let colorspace = match gradient_format.color_space { + GradientColorSpace::Srgb => 0., + GradientColorSpace::SrgbLinear => 1., + GradientColorSpace::Oklab => 2., + GradientColorSpace::Oklch => 3., + }; + + let hue_interpolation = match gradient_format.hue_interpolation { + HueInterpolation::Shorter => 0., + HueInterpolation::Longer => 1., + HueInterpolation::Increasing => 2., + HueInterpolation::Decreasing => 3., + }; + self.inner.update( size, None, scale, vec