From 0fcd981b86029ce4a554bf4805221a104a9228a7 Mon Sep 17 00:00:00 2001 From: Ivan Molodetskikh Date: Thu, 18 Apr 2024 21:39:27 +0400 Subject: Fix crop + crossfade artifacts --- src/render_helpers/crossfade.rs | 6 ++++++ .../primary_gpu_pixel_shader_with_textures.rs | 23 ++++++++++++++-------- 2 files changed, 21 insertions(+), 8 deletions(-) (limited to 'src/render_helpers') diff --git a/src/render_helpers/crossfade.rs b/src/render_helpers/crossfade.rs index 65f96482..62d72cb2 100644 --- a/src/render_helpers/crossfade.rs +++ b/src/render_helpers/crossfade.rs @@ -36,6 +36,11 @@ impl CrossfadeRenderElement { let tex_to_geo = texture_to_geo.to_f64().upscale(scale_to); let combined_geo = tex_from_geo.merge(tex_to_geo); + let size = combined_geo + .size + .to_logical(1.) + .to_buffer(1., Transform::Normal); + let area = Rectangle::from_loc_and_size( area.loc + combined_geo.loc.to_logical(scale).to_i32_round(), combined_geo.size.to_logical(scale).to_i32_round(), @@ -57,6 +62,7 @@ impl CrossfadeRenderElement { (String::from("tex_to"), texture_to), ]), area, + size, None, result_alpha, vec![ diff --git a/src/render_helpers/primary_gpu_pixel_shader_with_textures.rs b/src/render_helpers/primary_gpu_pixel_shader_with_textures.rs index 9f17cfdb..3037d731 100644 --- a/src/render_helpers/primary_gpu_pixel_shader_with_textures.rs +++ b/src/render_helpers/primary_gpu_pixel_shader_with_textures.rs @@ -9,7 +9,7 @@ use smithay::backend::renderer::gles::{ UniformDesc, UniformName, }; use smithay::backend::renderer::utils::CommitCounter; -use smithay::utils::{Buffer, Logical, Physical, Rectangle, Scale, Transform}; +use smithay::utils::{Buffer, Logical, Physical, Rectangle, Scale, Size}; use super::renderer::AsGlesFrame; use super::resources::Resources; @@ -25,6 +25,7 @@ pub struct PrimaryGpuPixelShaderWithTexturesRenderElement { id: Id, commit_counter: CommitCounter, area: Rectangle, + size: Size, opaque_regions: Vec>, alpha: f32, additional_uniforms: Vec>, @@ -122,10 +123,12 @@ impl PixelWithTexturesProgram { } impl PrimaryGpuPixelShaderWithTexturesRenderElement { + #[allow(clippy::too_many_arguments)] pub fn new( shader: PixelWithTexturesProgram, textures: HashMap, area: Rectangle, + size: Size, opaque_regions: Option>>, alpha: f32, additional_uniforms: Vec>, @@ -137,6 +140,7 @@ impl PrimaryGpuPixelShaderWithTexturesRenderElement { id: Id::new(), commit_counter: CommitCounter::default(), area, + size, opaque_regions: opaque_regions.unwrap_or_default(), alpha, additional_uniforms: additional_uniforms @@ -158,9 +162,7 @@ impl Element for PrimaryGpuPixelShaderWithTexturesRenderElement { } fn src(&self) -> Rectangle { - self.area - .to_f64() - .to_buffer(1.0, Transform::Normal, &self.area.size.to_f64()) + Rectangle::from_loc_and_size((0., 0.), self.size.to_f64()) } fn geometry(&self, scale: Scale) -> Rectangle { @@ -187,7 +189,7 @@ impl RenderElement for PrimaryGpuPixelShaderWithTexturesRenderElem fn draw( &self, frame: &mut GlesFrame<'_>, - _src: Rectangle, + src: Rectangle, dest: Rectangle, damage: &[Rectangle], ) -> Result<(), GlesError> { @@ -253,10 +255,15 @@ impl RenderElement for PrimaryGpuPixelShaderWithTexturesRenderElem // dest position and scale let mut matrix = Mat3::from_translation(Vec2::new(dest.loc.x as f32, dest.loc.y as f32)); + + let scale = src.size.to_f64() / dest.size.to_f64(); + let tex_matrix = Mat3::from_scale(Vec2::new(scale.x as f32, scale.y as f32)); + let tex_matrix = + Mat3::from_translation(Vec2::new(src.loc.x as f32, src.loc.y as f32)) * tex_matrix; let tex_matrix = Mat3::from_scale(Vec2::new( - (1.0f64 / dest.size.w as f64) as f32, - (1.0f64 / dest.size.h as f64) as f32, - )); + (1.0f64 / self.size.w) as f32, + (1.0f64 / self.size.h) as f32, + )) * tex_matrix; //apply output transformation matrix = Mat3::from_cols_array(frame.projection()) * matrix; -- cgit