#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Point {
pub x: f32,
pub y: f32,
}
impl Point {
pub fn new(x: f32, y: f32) -> Self {
Self { x, y }
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Size {
pub width: f32,
pub height: f32,
}
impl Size {
pub fn new(width: f32, height: f32) -> Self {
Self { width, height }
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Rect {
pub left: f32,
pub top: f32,
pub right: f32,
pub bottom: f32,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct NativeAffine {
pub a: f32,
pub b: f32,
pub c: f32,
pub d: f32,
pub tx: f32,
pub ty: f32,
}
impl NativeAffine {
pub const IDENTITY: NativeAffine = NativeAffine {
a: 1.0,
b: 0.0,
c: 0.0,
d: 1.0,
tx: 0.0,
ty: 0.0,
};
pub fn translation(tx: f32, ty: f32) -> Self {
Self {
tx,
ty,
..Self::IDENTITY
}
}
pub fn scale(sx: f32, sy: f32) -> Self {
Self {
a: sx,
d: sy,
..Self::IDENTITY
}
}
pub fn rotation_radians(angle: f32) -> Self {
let (s, c) = angle.sin_cos();
Self {
a: c,
b: s,
c: -s,
d: c,
tx: 0.0,
ty: 0.0,
}
}
pub fn rotation_degrees(angle: f32) -> Self {
Self::rotation_radians(angle.to_radians())
}
}
impl Default for NativeAffine {
fn default() -> Self {
Self::IDENTITY
}
}
impl Rect {
pub fn from_xywh(x: f32, y: f32, width: f32, height: f32) -> Self {
Self {
left: x,
top: y,
right: x + width,
bottom: y + height,
}
}
pub fn width(&self) -> f32 {
self.right - self.left
}
pub fn height(&self) -> f32 {
self.bottom - self.top
}
pub fn is_empty(&self) -> bool {
self.width() <= 0.0 || self.height() <= 0.0
}
}