subsurface: Add option to apply buffer transform

This commit is contained in:
Ian Douglas Scott 2024-12-02 15:33:19 -08:00 • committed by Ashley Wulber
parent e034001468
commit 288919958e
No known key found for this signature in database
GPG key ID: 5216D4F46A90A820

View file

@ -29,6 +29,7 @@ use cctk::sctk::{
protocol::{ protocol::{
wl_buffer::{self, WlBuffer}, wl_buffer::{self, WlBuffer},
wl_compositor::WlCompositor, wl_compositor::WlCompositor,
wl_output,
wl_shm::{self, WlShm}, wl_shm::{self, WlShm},
wl_shm_pool::{self, WlShmPool}, wl_shm_pool::{self, WlShmPool},
wl_subcompositor::WlSubcompositor, wl_subcompositor::WlSubcompositor,
@ -375,6 +376,7 @@ impl SubsurfaceState {
wp_alpha_modifier_surface, wp_alpha_modifier_surface,
wl_buffer: None, wl_buffer: None,
bounds: None, bounds: None,
transform: wl_output::Transform::Normal,
} }
} }
@ -474,6 +476,7 @@ pub(crate) struct SubsurfaceInstance {
wp_alpha_modifier_surface: Option<WpAlphaModifierSurfaceV1>, wp_alpha_modifier_surface: Option<WpAlphaModifierSurfaceV1>,
wl_buffer: Option<WlBuffer>, wl_buffer: Option<WlBuffer>,
bounds: Option<Rectangle<f32>>, bounds: Option<Rectangle<f32>>,
transform: wl_output::Transform,
} }
impl SubsurfaceInstance { impl SubsurfaceInstance {
@ -527,11 +530,15 @@ impl SubsurfaceInstance {
info.bounds.height as i32, info.bounds.height as i32,
); );
} }
let transform_changed = self.transform != info.transform;
if transform_changed {
self.wl_surface.set_buffer_transform(info.transform);
}
if buffer_changed { if buffer_changed {
self.wl_surface.attach(Some(&buffer), 0, 0); self.wl_surface.attach(Some(&buffer), 0, 0);
self.wl_surface.damage(0, 0, i32::MAX, i32::MAX); self.wl_surface.damage(0, 0, i32::MAX, i32::MAX);
} }
if buffer_changed || bounds_changed { if buffer_changed || bounds_changed || transform_changed {
_ = self.wl_surface.frame(&state.qh, self.wl_surface.clone()); _ = self.wl_surface.frame(&state.qh, self.wl_surface.clone());
self.wl_surface.commit(); self.wl_surface.commit();
} }
@ -544,6 +551,7 @@ impl SubsurfaceInstance {
self.wl_buffer = Some(buffer); self.wl_buffer = Some(buffer);
self.bounds = Some(info.bounds); self.bounds = Some(info.bounds);
self.transform = info.transform;
} }
pub fn unmap(&self) { pub fn unmap(&self) {
@ -567,6 +575,7 @@ pub(crate) struct SubsurfaceInfo {
pub buffer: SubsurfaceBuffer, pub buffer: SubsurfaceBuffer,
pub bounds: Rectangle<f32>, pub bounds: Rectangle<f32>,
pub alpha: f32, pub alpha: f32,
pub transform: wl_output::Transform,
} }
thread_local! { thread_local! {
@ -584,6 +593,7 @@ pub struct Subsurface {
height: Length, height: Length,
content_fit: ContentFit, content_fit: ContentFit,
alpha: f32, alpha: f32,
transform: wl_output::Transform,
} }
impl<Message, Theme, Renderer> Widget<Message, Theme, Renderer> for Subsurface impl<Message, Theme, Renderer> Widget<Message, Theme, Renderer> for Subsurface
@ -601,9 +611,18 @@ where
_renderer: &Renderer, _renderer: &Renderer,
limits: &layout::Limits, limits: &layout::Limits,
) -> layout::Node { ) -> layout::Node {
let buffer_size = let (width, height) = match self.transform {
Size::new(self.buffer.width() as f32, self.buffer.height() as f32); wl_output::Transform::_90
| wl_output::Transform::_270
| wl_output::Transform::Flipped90
| wl_output::Transform::Flipped270 => {
(self.buffer.height(), self.buffer.width())
}
_ => (self.buffer.width(), self.buffer.height()),
};
let buffer_size = Size::new(width as f32, height as f32);
// TODO apply transform
let raw_size = limits.resolve(self.width, self.height, buffer_size); let raw_size = limits.resolve(self.width, self.height, buffer_size);
let full_size = self.content_fit.fit(buffer_size, raw_size); let full_size = self.content_fit.fit(buffer_size, raw_size);
@ -639,6 +658,7 @@ where
buffer: self.buffer.clone(), buffer: self.buffer.clone(),
bounds: layout.bounds(), bounds: layout.bounds(),
alpha: self.alpha, alpha: self.alpha,
transform: self.transform,
}) })
}); });
} }
@ -653,6 +673,7 @@ impl Subsurface {
height: Length::Shrink, height: Length::Shrink,
content_fit: ContentFit::Contain, content_fit: ContentFit::Contain,
alpha: 1., alpha: 1.,
transform: wl_output::Transform::Normal,
} }
} }
@ -675,6 +696,11 @@ impl Subsurface {
self.alpha = alpha; self.alpha = alpha;
self self
} }
pub fn transform(mut self, transform: wl_output::Transform) -> Self {
self.transform = transform;
self
}
} }
impl<Message, Theme, Renderer> From<Subsurface> impl<Message, Theme, Renderer> From<Subsurface>