blob: d0dd00cda520d9468ea83a94587bf673e7067cc9 [file] [log] [blame]
use crate::{CodingUnit, Frame, Partition, Superblock, TransformUnit};
pub trait Spatial {
fn width(&self) -> i32;
fn height(&self) -> i32;
fn x(&self) -> i32;
fn y(&self) -> i32;
fn rect(&self) -> emath::Rect {
emath::Rect::from_min_size(
emath::pos2(self.x() as f32, self.y() as f32),
emath::vec2(self.width() as f32, self.height() as f32),
)
}
fn size_name(&self) -> String {
format!("{}x{}", self.width(), self.height())
}
}
// TODO(comc): Could use a macro to implement each of these.
impl Spatial for TransformUnit {
fn width(&self) -> i32 {
// TODO(comc): This is very messy. Add derive Default to prost build script.
self.size.as_ref().map_or(0, |size| size.width)
}
fn height(&self) -> i32 {
self.size.as_ref().map_or(0, |size| size.height)
}
fn x(&self) -> i32 {
self.position.as_ref().map_or(0, |position| position.x)
}
fn y(&self) -> i32 {
self.position.as_ref().map_or(0, |position| position.y)
}
}
impl Spatial for CodingUnit {
fn width(&self) -> i32 {
self.size.as_ref().map_or(0, |size| size.width)
}
fn height(&self) -> i32 {
self.size.as_ref().map_or(0, |size| size.height)
}
fn x(&self) -> i32 {
self.position.as_ref().map_or(0, |position| position.x)
}
fn y(&self) -> i32 {
self.position.as_ref().map_or(0, |position| position.y)
}
}
impl Spatial for Partition {
fn width(&self) -> i32 {
self.size.as_ref().map_or(0, |size| size.width)
}
fn height(&self) -> i32 {
self.size.as_ref().map_or(0, |size| size.height)
}
fn x(&self) -> i32 {
self.position.as_ref().map_or(0, |position| position.x)
}
fn y(&self) -> i32 {
self.position.as_ref().map_or(0, |position| position.y)
}
}
impl Spatial for Superblock {
fn width(&self) -> i32 {
self.size.as_ref().map_or(0, |size| size.width)
}
fn height(&self) -> i32 {
self.size.as_ref().map_or(0, |size| size.height)
}
fn x(&self) -> i32 {
self.position.as_ref().map_or(0, |position| position.x)
}
fn y(&self) -> i32 {
self.position.as_ref().map_or(0, |position| position.y)
}
}
impl Spatial for Frame {
fn width(&self) -> i32 {
self.frame_params.as_ref().map_or(0, |frame_params| frame_params.width)
}
fn height(&self) -> i32 {
self.frame_params.as_ref().map_or(0, |frame_params| frame_params.height)
}
fn x(&self) -> i32 {
0
}
fn y(&self) -> i32 {
0
}
}