use crate::NcBlitter;
#[derive(Debug, Clone, Copy, Default)]
pub struct NcVisualGeometry {
pub pix_yx: Option<(u32, u32)>,
pub cdim_yx: Option<(u32, u32)>,
pub rpix_yx: Option<(u32, u32)>,
pub rcell_yx: Option<(u32, u32)>,
pub scale_yx: Option<(u32, u32)>,
pub maxpixel_yx: Option<(u32, u32)>,
pub beg_yx: Option<(u32, u32)>,
pub len_yx: Option<(u32, u32)>,
pub blitter: NcBlitter,
}
impl NcVisualGeometry {
pub fn blitter_name(&self) -> String {
crate::Nc::str_blitter(self.blitter)
}
}
impl NcVisualGeometry {
pub fn pixy(&self) -> u32 {
self.pix_yx.unwrap_or((0, 0)).0
}
pub fn pixx(&self) -> u32 {
self.pix_yx.unwrap_or((0, 0)).1
}
pub fn cdimy(&self) -> u32 {
self.cdim_yx.unwrap_or((0, 0)).0
}
pub fn cdimx(&self) -> u32 {
self.cdim_yx.unwrap_or((0, 0)).1
}
pub fn rpixy(&self) -> u32 {
self.rpix_yx.unwrap_or((0, 0)).0
}
pub fn rpixx(&self) -> u32 {
self.rpix_yx.unwrap_or((0, 0)).1
}
pub fn rcelly(&self) -> u32 {
self.rcell_yx.unwrap_or((0, 0)).0
}
pub fn rcellx(&self) -> u32 {
self.rcell_yx.unwrap_or((0, 0)).1
}
pub fn scaley(&self) -> u32 {
self.scale_yx.unwrap_or((0, 0)).0
}
pub fn scalex(&self) -> u32 {
self.scale_yx.unwrap_or((0, 0)).1
}
pub fn maxpixely(&self) -> u32 {
self.maxpixel_yx.unwrap_or((0, 0)).0
}
pub fn maxpixelx(&self) -> u32 {
self.maxpixel_yx.unwrap_or((0, 0)).1
}
pub fn begy(&self) -> u32 {
self.beg_yx.unwrap_or((0, 0)).0
}
pub fn begx(&self) -> u32 {
self.beg_yx.unwrap_or((0, 0)).1
}
pub fn leny(&self) -> u32 {
self.len_yx.unwrap_or((0, 0)).0
}
pub fn lenx(&self) -> u32 {
self.len_yx.unwrap_or((0, 0)).1
}
}
mod std_impls {
use super::{c_api::NcVGeom, NcBlitter, NcVisualGeometry};
impl From<NcVGeom> for NcVisualGeometry {
fn from(vg: NcVGeom) -> Self {
let (pix_yx, cdim_yx, rpix_yx, rcell_yx, scale_yx, maxpixel_yx);
if vg.pixy == 0 || vg.pixx == 0 {
pix_yx = None;
} else {
pix_yx = Some((vg.pixy as u32, vg.pixx as u32));
}
if vg.cdimy == 0 || vg.cdimx == 0 {
cdim_yx = None;
} else {
cdim_yx = Some((vg.cdimy as u32, vg.cdimx as u32));
}
if vg.rpixy == 0 || vg.rpixx == 0 {
rpix_yx = None;
} else {
rpix_yx = Some((vg.rpixy as u32, vg.rpixx as u32));
}
if vg.rcelly == 0 || vg.rcellx == 0 {
rcell_yx = None;
} else {
rcell_yx = Some((vg.rcelly as u32, vg.rcellx as u32));
}
if vg.scaley == 0 || vg.scalex == 0 {
scale_yx = None;
} else {
scale_yx = Some((vg.scaley as u32, vg.scalex as u32));
}
if vg.blitter == NcBlitter::Pixel.into() {
maxpixel_yx = Some((vg.maxpixely as u32, vg.maxpixelx as u32));
} else {
maxpixel_yx = None;
}
NcVisualGeometry {
pix_yx,
cdim_yx,
rpix_yx,
rcell_yx,
scale_yx,
maxpixel_yx,
len_yx: Some((vg.leny as u32, vg.lenx as u32)),
beg_yx: Some((vg.begy as u32, vg.begx as u32)),
blitter: vg.blitter.into(),
}
}
}
}
pub(crate) mod c_api {
use crate::{c_api::ffi, NcBlitter};
pub type NcVGeom = ffi::ncvgeom;
impl NcVGeom {
pub fn new() -> Self {
Self {
pixy: 0,
pixx: 0,
cdimy: 0,
cdimx: 0,
rpixy: 0,
rpixx: 0,
rcelly: 0,
rcellx: 0,
scaley: 0,
scalex: 0,
maxpixely: 0,
maxpixelx: 0,
begy: 0,
begx: 0,
leny: 0,
lenx: 0,
blitter: NcBlitter::Default.into(),
}
}
}
}