small software-rendered rust tty
Diffstat (limited to 'src/term/cells.rs')
-rw-r--r--src/term/cells.rs86
1 files changed, 86 insertions, 0 deletions
diff --git a/src/term/cells.rs b/src/term/cells.rs
new file mode 100644
index 0000000..06f0415
--- /dev/null
+++ b/src/term/cells.rs
@@ -0,0 +1,86 @@
+// one-indexed cell array
+pub struct Cells {
+ pub size: (u16, u16),
+ pub cells: Vec<Cell>,
+ pub row: u16,
+}
+#[derive(Clone, Copy)]
+pub struct Style {
+ pub bg: [u8; 3],
+ pub color: [u8; 3],
+ pub flags: u8,
+}
+use std::iter::repeat_n;
+
+use crate::colors;
+impl std::default::Default for Style {
+ fn default() -> Self {
+ Self {
+ bg: colors::BACKGROUND,
+ flags: 0,
+ color: colors::FOREGROUND,
+ }
+ }
+}
+
+#[derive(Clone, Copy, Default)]
+pub struct Cell {
+ pub style: Style,
+ pub letter: Option<char>,
+}
+
+impl Cells {
+ pub fn new((c, r): (u16, u16)) -> Self {
+ Self {
+ size: (c + 1, r + 1),
+ cells: vec![
+ Cell::default();
+ (c as usize + 1) * (r as usize + 1)
+ ],
+ row: 0,
+ }
+ }
+ pub fn cells(&mut self) -> &mut [Cell] {
+ assert!(
+ self.cells.len()
+ == self.row as usize * (self.size.0 as usize)
+ + (self.size.0 as usize) * (self.size.1 as usize)
+ );
+ assert!(
+ self.cells[self.row as usize * self.size.0 as usize..].len()
+ == self.size.0 as usize * self.size.1 as usize
+ );
+ &mut self.cells[self.row as usize * self.size.0 as usize..]
+ }
+ pub fn r(&mut self) -> u16 {
+ self.size.1
+ }
+ pub fn c(&mut self) -> u16 {
+ self.size.0
+ }
+ #[track_caller]
+ pub fn get_at(&mut self, (x, y): (u16, u16)) -> &mut Cell {
+ let w = self.c();
+ assert!(x < self.c() && y < self.r(), "out of bounds");
+ &mut self.cells()[((y - 1) * w + x - 1) as usize]
+ }
+ pub fn rows(&mut self) -> impl Iterator<Item = &mut [Cell]> {
+ let w = self.c();
+ self.cells().chunks_exact_mut(w as _)
+ }
+ pub fn row(&mut self, row: u16) -> &mut [Cell] {
+ let w = self.c();
+ &mut self.cells()
+ [(row as usize - 1) * w as usize..row as usize * w as usize]
+ }
+ pub fn past(&mut self, (x, row): (u16, u16)) -> &mut [Cell] {
+ &mut self.rows().nth(row as usize - 1).unwrap()[x as usize - 1..]
+ }
+ pub fn grow(&mut self, by: u16) {
+ self.row += by;
+ self.cells.extend(repeat_n(
+ Cell::default(),
+ by as usize * (self.size.0) as usize,
+ ));
+ }
+}