chiro 0.1.3

A curses-style terminal view that runs inside a pixel buffer (Rewrite of chiropterm)
Documentation
use std::convert::TryInto;

use crate::shared::*;

pub(crate) struct TileSet<'a> {
    pub buf: &'a [u8],
    pub overall_size: PixelSize,
}

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct Tile(pub [u8; 8]);

impl<'a> TileSet<'a> {
    pub fn tile(&self, ix: u32) -> Tile {
        let zels_sz = self.overall_size.to_zels();
        let n_tiles = zels_sz.width * zels_sz.height;

        if ix >= n_tiles { return Tile([0; 8]) }

        let value: [u8; 8] = self.buf[(ix * ZEL_PIXELS_Y) as usize..((ix + 1) * ZEL_PIXELS_Y) as usize].try_into().unwrap();
        Tile(value)
    }
}

impl Tile {
    pub fn blank() -> Self { Self([0; 8]) }

    pub(crate) fn left(&self) -> Tile {
        fn fix(row: u8) -> u8 { row << 4 }
        Tile([
            fix(self.0[0]), fix(self.0[1]), fix(self.0[2]), fix(self.0[3]),
            fix(self.0[4]), fix(self.0[5]), fix(self.0[6]), fix(self.0[7]),
        ])
    }

    pub(crate) fn right(&self) -> Tile {
        fn fix(row: u8) -> u8 { row >> 4 }
        Tile([
            fix(self.0[0]), fix(self.0[1]), fix(self.0[2]), fix(self.0[3]),
            fix(self.0[4]), fix(self.0[5]), fix(self.0[6]), fix(self.0[7]),
        ])
    }
}

impl Default for Tile {
    fn default() -> Self {
        Tile::blank()
    }
}