aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2024-02-22 08:54:35 +0400
committerIvan Molodetskikh <yalterz@gmail.com>2024-02-22 08:54:35 +0400
commitb091202d86c1d824ce0a9ba83b21e5d50f2fc291 (patch)
tree6265d4cd3564b1dccb693d1443a232c7bdeea040
parent48f0f6fb3ceb68fdb559ab38c8dcbb7b9ba3a13e (diff)
downloadniri-b091202d86c1d824ce0a9ba83b21e5d50f2fc291.tar.gz
niri-b091202d86c1d824ce0a9ba83b21e5d50f2fc291.tar.bz2
niri-b091202d86c1d824ce0a9ba83b21e5d50f2fc291.zip
visual-tests: Add gradient angle and area tests
-rw-r--r--niri-visual-tests/src/cases/gradient_angle.rs76
-rw-r--r--niri-visual-tests/src/cases/gradient_area.rs116
-rw-r--r--niri-visual-tests/src/cases/mod.rs4
-rw-r--r--niri-visual-tests/src/main.rs5
-rw-r--r--niri-visual-tests/src/smithay_view.rs9
5 files changed, 207 insertions, 3 deletions
diff --git a/niri-visual-tests/src/cases/gradient_angle.rs b/niri-visual-tests/src/cases/gradient_angle.rs
new file mode 100644
index 00000000..adbedff4
--- /dev/null
+++ b/niri-visual-tests/src/cases/gradient_angle.rs
@@ -0,0 +1,76 @@
+use std::f32::consts::{FRAC_PI_2, PI};
+use std::sync::atomic::Ordering;
+use std::time::Duration;
+
+use niri::animation::ANIMATION_SLOWDOWN;
+use niri::render_helpers::gradient::GradientRenderElement;
+use smithay::backend::renderer::element::RenderElement;
+use smithay::backend::renderer::gles::GlesRenderer;
+use smithay::utils::{Logical, Physical, Rectangle, Scale, Size};
+
+use super::TestCase;
+
+pub struct GradientAngle {
+ angle: f32,
+ prev_time: Duration,
+}
+
+impl GradientAngle {
+ pub fn new(_size: Size<i32, Logical>) -> Self {
+ Self {
+ angle: 0.,
+ prev_time: Duration::ZERO,
+ }
+ }
+}
+
+impl TestCase for GradientAngle {
+ fn are_animations_ongoing(&self) -> bool {
+ true
+ }
+
+ fn advance_animations(&mut self, current_time: Duration) {
+ let mut delta = if self.prev_time.is_zero() {
+ Duration::ZERO
+ } else {
+ current_time.saturating_sub(self.prev_time)
+ };
+ self.prev_time = current_time;
+
+ let slowdown = ANIMATION_SLOWDOWN.load(Ordering::SeqCst);
+ if slowdown == 0. {
+ delta = Duration::ZERO
+ } else {
+ delta = delta.div_f64(slowdown);
+ }
+
+ self.angle += delta.as_secs_f32() * PI;
+
+ if self.angle >= PI * 2. {
+ self.angle -= PI * 2.
+ }
+ }
+
+ fn render(
+ &mut self,
+ renderer: &mut GlesRenderer,
+ size: Size<i32, Physical>,
+ ) -> Vec<Box<dyn RenderElement<GlesRenderer>>> {
+ let (a, b) = (size.w / 4, size.h / 4);
+ let size = (size.w - a * 2, size.h - b * 2);
+ let area = Rectangle::from_loc_and_size((a, b), size);
+
+ GradientRenderElement::new(
+ renderer,
+ Scale::from(1.),
+ area,
+ area,
+ [1., 0., 0., 1.],
+ [0., 1., 0., 1.],
+ self.angle - FRAC_PI_2,
+ )
+ .into_iter()
+ .map(|elem| Box::new(elem) as _)
+ .collect()
+ }
+}
diff --git a/niri-visual-tests/src/cases/gradient_area.rs b/niri-visual-tests/src/cases/gradient_area.rs
new file mode 100644
index 00000000..d47fb2ce
--- /dev/null
+++ b/niri-visual-tests/src/cases/gradient_area.rs
@@ -0,0 +1,116 @@
+use std::f32::consts::{FRAC_PI_4, PI};
+use std::sync::atomic::Ordering;
+use std::time::Duration;
+
+use niri::animation::ANIMATION_SLOWDOWN;
+use niri::layout::focus_ring::FocusRing;
+use niri::render_helpers::gradient::GradientRenderElement;
+use niri_config::Color;
+use smithay::backend::renderer::element::RenderElement;
+use smithay::backend::renderer::gles::GlesRenderer;
+use smithay::utils::{Logical, Physical, Point, Rectangle, Scale, Size};
+
+use super::TestCase;
+
+pub struct GradientArea {
+ progress: f32,
+ border: FocusRing,
+ prev_time: Duration,
+}
+
+impl GradientArea {
+ pub fn new(_size: Size<i32, Logical>) -> Self {
+ let mut border = FocusRing::new(niri_config::FocusRing {
+ off: false,
+ width: 1,
+ active_color: Color::new(255, 255, 255, 128),
+ inactive_color: Color::default(),
+ active_gradient: None,
+ inactive_gradient: None,
+ });
+ border.set_active(true);
+
+ Self {
+ progress: 0.,
+ border,
+ prev_time: Duration::ZERO,
+ }
+ }
+}
+
+impl TestCase for GradientArea {
+ fn are_animations_ongoing(&self) -> bool {
+ true
+ }
+
+ fn advance_animations(&mut self, current_time: Duration) {
+ let mut delta = if self.prev_time.is_zero() {
+ Duration::ZERO
+ } else {
+ current_time.saturating_sub(self.prev_time)
+ };
+ self.prev_time = current_time;
+
+ let slowdown = ANIMATION_SLOWDOWN.load(Ordering::SeqCst);
+ if slowdown == 0. {
+ delta = Duration::ZERO
+ } else {
+ delta = delta.div_f64(slowdown);
+ }
+
+ self.progress += delta.as_secs_f32() * PI;
+
+ if self.progress >= PI * 2. {
+ self.progress -= PI * 2.
+ }
+ }
+
+ fn render(
+ &mut self,
+ renderer: &mut GlesRenderer,
+ size: Size<i32, Physical>,
+ ) -> Vec<Box<dyn RenderElement<GlesRenderer>>> {
+ let mut rv = Vec::new();
+
+ let f = (self.progress.sin() + 1.) / 2.;
+
+ let (a, b) = (size.w / 4, size.h / 4);
+ let rect_size = (size.w - a * 2, size.h - b * 2);
+ let area = Rectangle::from_loc_and_size((a, b), rect_size);
+
+ let g_size = Size::from((
+ (size.w as f32 / 8. + size.w as f32 / 8. * 7. * f).round() as i32,
+ (size.h as f32 / 8. + size.h as f32 / 8. * 7. * f).round() as i32,
+ ));
+ let g_loc = ((size.w - g_size.w) / 2, (size.h - g_size.h) / 2);
+ let g_area = Rectangle::from_loc_and_size(g_loc, g_size);
+
+ self.border.update(g_size, true);
+ rv.extend(
+ self.border
+ .render(
+ renderer,
+ Point::from(g_loc),
+ Scale::from(1.),
+ size.to_logical(1),
+ )
+ .map(|elem| Box::new(elem) as _),
+ );
+
+ rv.extend(
+ GradientRenderElement::new(
+ renderer,
+ Scale::from(1.),
+ area,
+ g_area,
+ [1., 0., 0., 1.],
+ [0., 1., 0., 1.],
+ FRAC_PI_4,
+ )
+ .into_iter()
+ .map(|elem| Box::new(elem) as _),
+ );
+
+ rv
+ }
+}
diff --git a/niri-visual-tests/src/cases/mod.rs b/niri-visual-tests/src/cases/mod.rs
index 6f732f6f..25aa1e30 100644
--- a/niri-visual-tests/src/cases/mod.rs
+++ b/niri-visual-tests/src/cases/mod.rs
@@ -4,12 +4,14 @@ use smithay::backend::renderer::element::RenderElement;
use smithay::backend::renderer::gles::GlesRenderer;
use smithay::utils::{Physical, Size};
+pub mod gradient_angle;
+pub mod gradient_area;
pub mod layout;
pub mod tile;
pub mod window;
pub trait TestCase {
- fn resize(&mut self, width: i32, height: i32);
+ fn resize(&mut self, _width: i32, _height: i32) {}
fn are_animations_ongoing(&self) -> bool {
false
}
diff --git a/niri-visual-tests/src/main.rs b/niri-visual-tests/src/main.rs
index 32911b55..771c501c 100644
--- a/niri-visual-tests/src/main.rs
+++ b/niri-visual-tests/src/main.rs
@@ -16,6 +16,8 @@ use smithay::utils::{Logical, Size};
use smithay_view::SmithayView;
use tracing_subscriber::EnvFilter;
+use crate::cases::gradient_angle::GradientAngle;
+use crate::cases::gradient_area::GradientArea;
use crate::cases::layout::Layout;
use crate::cases::TestCase;
@@ -108,6 +110,9 @@ fn build_ui(app: &adw::Application) {
"Layout - Open To The Left - Big",
);
+ s.add(GradientAngle::new, "Gradient - Angle");
+ s.add(GradientArea::new, "Gradient - Area");
+
let content_headerbar = adw::HeaderBar::new();
let anim_adjustment = gtk::Adjustment::new(1., 0., 10., 0.1, 0.5, 0.);
diff --git a/niri-visual-tests/src/smithay_view.rs b/niri-visual-tests/src/smithay_view.rs
index db8eb9ec..0dcd3935 100644
--- a/niri-visual-tests/src/smithay_view.rs
+++ b/niri-visual-tests/src/smithay_view.rs
@@ -11,6 +11,7 @@ mod imp {
use anyhow::{ensure, Context};
use gtk::gdk;
use gtk::prelude::*;
+ use niri::render_helpers::shaders;
use niri::utils::get_monotonic_time;
use smithay::backend::egl::ffi::egl;
use smithay::backend::egl::EGLContext;
@@ -190,8 +191,12 @@ mod imp {
.into_iter()
.filter(|c| *c != Capability::ColorTransformations);
- GlesRenderer::with_capabilities(egl_context, capabilities)
- .context("error creating GlesRenderer")
+ let mut renderer = GlesRenderer::with_capabilities(egl_context, capabilities)
+ .context("error creating GlesRenderer")?;
+
+ shaders::init(&mut renderer);
+
+ Ok(renderer)
}
unsafe fn with_framebuffer_save_restore<T>(