use crate::{sys::NcVisualGeometry, visual::Blitter, Position, Size};
#[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 core_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))).swapped(),
rendered_pixels: Size::from(nc.rpix_yx.unwrap_or((0, 0))).swapped(),
rendered_cells: Size::from(nc.rcell_yx.unwrap_or((0, 0))).swapped(),
pixels_per_cell: Size::from(nc.cdim_yx.unwrap_or((0, 0))).swapped(),
region_position: Position::from(nc.beg_yx.unwrap_or((0, 0))).swapped(),
region_size: Size::from(nc.len_yx.unwrap_or((0, 0))).swapped(),
max_bitmap_pixels: nc.maxpixel_yx.map(|s| Size::from(s).swapped()),
}
}
}
}
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::new(
self.blitter.cell_width().unwrap_or(0) as i32,
self.blitter.cell_height().unwrap_or(0) as i32,
)
}
}
#[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(|(w, h)| max * Size::new(w as i32, h as i32)),
}
} else {
None
}
}
}