geometry: Add new private Client coordinate space

This commit is contained in:
Victoria Brekenfeld 2024-08-21 17:54:05 +02:00 committed by Victoria Brekenfeld
parent dd23282222
commit 81ef4d5ddd
2 changed files with 77 additions and 0 deletions

View file

@ -8,6 +8,11 @@ use wayland_server::protocol::wl_output::Transform as WlTransform;
#[derive(Debug)] #[derive(Debug)]
pub struct Logical; pub struct Logical;
/// Type-level marker for the client logical coordinate space
#[derive(Debug)]
#[cfg(feature = "wayland_frontend")]
pub(crate) struct Client;
/// Type-level marker for the physical coordinate space /// Type-level marker for the physical coordinate space
#[derive(Debug)] #[derive(Debug)]
pub struct Physical; pub struct Physical;
@ -453,6 +458,17 @@ impl<N: fmt::Debug, S> fmt::Debug for Point<N, S> {
} }
impl<N: Coordinate> Point<N, Logical> { impl<N: Coordinate> Point<N, Logical> {
#[inline]
#[cfg(feature = "wayland_frontend")]
pub(crate) fn to_client(self, scale: impl Into<Scale<N>>) -> Point<N, Client> {
let scale: Scale<N> = scale.into();
Point {
x: self.x.upscale(scale.x),
y: self.y.upscale(scale.y),
_kind: std::marker::PhantomData,
}
}
#[inline] #[inline]
/// Convert this logical point to physical coordinate space according to given scale factor /// Convert this logical point to physical coordinate space according to given scale factor
pub fn to_physical(self, scale: impl Into<Scale<N>>) -> Point<N, Physical> { pub fn to_physical(self, scale: impl Into<Scale<N>>) -> Point<N, Physical> {
@ -512,6 +528,19 @@ impl<N: Coordinate> Point<N, Logical> {
} }
} }
#[cfg(feature = "wayland_frontend")]
impl<N: Coordinate> Point<N, Client> {
#[inline]
pub(crate) fn to_logical(self, scale: impl Into<Scale<N>>) -> Point<N, Logical> {
let scale = scale.into();
Point {
x: self.x.downscale(scale.x),
y: self.y.downscale(scale.y),
_kind: std::marker::PhantomData,
}
}
}
impl<N: Coordinate> Point<N, Physical> { impl<N: Coordinate> Point<N, Physical> {
#[inline] #[inline]
/// Convert this physical point to logical coordinate space according to given scale factor /// Convert this physical point to logical coordinate space according to given scale factor
@ -768,6 +797,17 @@ impl<N: fmt::Debug, S> fmt::Debug for Size<N, S> {
} }
impl<N: Coordinate> Size<N, Logical> { impl<N: Coordinate> Size<N, Logical> {
#[inline]
#[cfg(feature = "wayland_frontend")]
pub(crate) fn to_client(self, scale: impl Into<Scale<N>>) -> Size<N, Client> {
let scale = scale.into();
Size {
w: self.w.upscale(scale.x),
h: self.h.upscale(scale.y),
_kind: std::marker::PhantomData,
}
}
#[inline] #[inline]
/// Convert this logical size to physical coordinate space according to given scale factor /// Convert this logical size to physical coordinate space according to given scale factor
pub fn to_physical(self, scale: impl Into<Scale<N>>) -> Size<N, Physical> { pub fn to_physical(self, scale: impl Into<Scale<N>>) -> Size<N, Physical> {
@ -821,6 +861,19 @@ impl<N: Coordinate> Size<N, Logical> {
} }
} }
#[cfg(feature = "wayland_frontend")]
impl<N: Coordinate> Size<N, Client> {
#[inline]
pub(crate) fn to_logical(self, scale: impl Into<Scale<N>>) -> Size<N, Logical> {
let scale = scale.into();
Size {
w: self.w.downscale(scale.x),
h: self.h.downscale(scale.y),
_kind: std::marker::PhantomData,
}
}
}
impl<N: Coordinate> Size<N, Physical> { impl<N: Coordinate> Size<N, Physical> {
#[inline] #[inline]
/// Convert this physical point to logical coordinate space according to given scale factor /// Convert this physical point to logical coordinate space according to given scale factor
@ -1273,6 +1326,16 @@ impl<N: Coordinate, Kind> Rectangle<N, Kind> {
} }
impl<N: Coordinate> Rectangle<N, Logical> { impl<N: Coordinate> Rectangle<N, Logical> {
#[inline]
#[cfg(feature = "xwayland")]
pub(crate) fn to_client(self, scale: impl Into<Scale<N>>) -> Rectangle<N, Client> {
let scale = scale.into();
Rectangle {
loc: self.loc.to_client(scale),
size: self.size.to_client(scale),
}
}
/// Convert this logical rectangle to physical coordinate space according to given scale factor /// Convert this logical rectangle to physical coordinate space according to given scale factor
#[inline] #[inline]
pub fn to_physical(self, scale: impl Into<Scale<N>>) -> Rectangle<N, Physical> { pub fn to_physical(self, scale: impl Into<Scale<N>>) -> Rectangle<N, Physical> {
@ -1342,6 +1405,18 @@ impl<N: Coordinate> Rectangle<N, Logical> {
} }
} }
#[cfg(feature = "wayland_frontend")]
impl<N: Coordinate> Rectangle<N, Client> {
#[inline]
pub(crate) fn to_logical(self, scale: impl Into<Scale<N>>) -> Rectangle<N, Logical> {
let scale = scale.into();
Rectangle {
loc: self.loc.to_logical(scale),
size: self.size.to_logical(scale),
}
}
}
impl<N: Coordinate> Rectangle<N, Physical> { impl<N: Coordinate> Rectangle<N, Physical> {
/// Convert this physical rectangle to logical coordinate space according to given scale factor /// Convert this physical rectangle to logical coordinate space according to given scale factor
#[inline] #[inline]

View file

@ -18,6 +18,8 @@ pub use fd::*;
#[cfg(feature = "wayland_frontend")] #[cfg(feature = "wayland_frontend")]
pub(crate) mod sealed_file; pub(crate) mod sealed_file;
#[cfg(feature = "wayland_frontend")]
pub(crate) use self::geometry::Client;
pub use self::geometry::{ pub use self::geometry::{
Buffer, Coordinate, Logical, Physical, Point, Raw, Rectangle, Scale, Size, Transform, Buffer, Coordinate, Logical, Physical, Point, Raw, Rectangle, Scale, Size, Transform,
}; };