use crate::{
plane::{Position, Size},
sys::NcVisualGeometry,
visual::Blitter,
};
#[derive(Clone, Copy, Default, PartialEq, Eq, Debug)]
pub struct VisualGeometry {
pub blitter: Blitter,
pub pixels: Size,
pub rendered_pixels: Size,
pub rendered_cells: Size,
pub pixels_per_cell: Size,
pub region_position: Position,
pub region_size: Size,
pub max_bitmap_pixels: Option<Size>,
}
mod std_impls {
use super::{NcVisualGeometry, Position, Size, VisualGeometry};
impl From<NcVisualGeometry> for VisualGeometry {
fn from(nc: NcVisualGeometry) -> VisualGeometry {
Self {
blitter: nc.blitter.into(),
pixels: Size::from(nc.pix_yx.unwrap_or((0, 0))).swap(),
rendered_pixels: Size::from(nc.rpix_yx.unwrap_or((0, 0))).swap(),
rendered_cells: Size::from(nc.rcell_yx.unwrap_or((0, 0))).swap(),
pixels_per_cell: Size::from(nc.cdim_yx.unwrap_or((0, 0))).swap(),
region_position: Position::from(nc.beg_yx.unwrap_or((0, 0))).swap(),
region_size: Size::from(nc.len_yx.unwrap_or((0, 0))).swap(),
max_bitmap_pixels: nc.maxpixel_yx.map(|s| Size::from(s).swap()),
}
}
}
}
impl VisualGeometry {
#[inline]
pub const fn blitter(&self) -> Blitter {
self.blitter
}
#[inline]
pub const fn pixels(&self) -> Size {
self.pixels
}
#[inline]
pub fn cells(&self) -> Size {
self.pixels * self.pixels_per_cell
}
#[inline]
pub fn blits(&self) -> Size {
self.pixels * self.blits_per_cell()
}
#[inline]
pub const fn rendered_pixels(&self) -> Size {
self.rendered_pixels
}
#[inline]
pub const fn rendered_cells(&self) -> Size {
self.rendered_cells
}
pub fn rendered_blits(&self) -> Size {
self.rendered_cells * self.blits_per_cell()
}
#[inline]
pub const fn pixels_per_cell(&self) -> Size {
self.pixels_per_cell
}
#[inline]
pub fn blits_per_cell(&self) -> Size {
if self.blitter == Blitter::Pixel {
self.pixels_per_cell
} else {
Size::from((
self.blitter.cell_width().unwrap_or(0),
self.blitter.cell_height().unwrap_or(0),
))
}
}
#[inline]
pub const fn max_bitmap_pixels(&self) -> Option<Size> {
self.max_bitmap_pixels
}
#[inline]
pub fn max_bitmap_cells(&self) -> Option<Size> {
self.max_bitmap_pixels
.map(|size| size / self.pixels_per_cell)
}
pub fn max_bitmap_blits(&self) -> Option<Size> {
self.max_bitmap_blitter(self.blitter)
}
#[inline]
pub fn max_bitmap_blitter(&self, blitter: Blitter) -> Option<Size> {
if let Some(max) = self.max_bitmap_cells() {
match blitter {
Blitter::Pixel => self.max_bitmap_pixels,
Blitter::Default => None, _ => blitter.cell_size().map(|cs| max * Size::from(cs)),
}
} else {
None
}
}
}