small software-rendered rust tty
Diffstat (limited to 'src/term/cells.rs')
-rw-r--r--src/term/cells.rs85
1 files changed, 27 insertions, 58 deletions
diff --git a/src/term/cells.rs b/src/term/cells.rs
index 707fe10..033bd52 100644
--- a/src/term/cells.rs
+++ b/src/term/cells.rs
@@ -5,38 +5,14 @@ pub struct Cells {
pub margin: (u16, u16),
pub row: usize,
}
-#[derive(Clone, Copy, Debug)]
-pub struct Style {
- pub bg: [u8; 3],
- pub color: [u8; 3],
- pub flags: u8,
-}
use std::cmp::Ordering;
use std::default::Default::default;
use std::fmt::Debug;
-use std::iter::{empty, repeat, repeat_n};
+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,
- }
- }
-}
+use dsb::Cell;
+use dsb::cell::Style;
-#[derive(Clone, Copy, Default)]
-pub struct Cell {
- pub style: Style,
- pub letter: Option<char>,
-}
-impl Debug for Cell {
- fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
- write!(f, "{}", self.letter.unwrap_or(' '))
- }
-}
impl Debug for Cells {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("Cells")
@@ -55,24 +31,20 @@ impl Debug for Cells {
.finish()
}
}
-impl Cell {
- pub fn basic(c: char) -> Self {
- Self {
- letter: Some(c),
- ..default()
- }
- }
-}
-
+pub const DSTYLE: Style = Style {
+ bg: crate::colors::BACKGROUND,
+ color: crate::colors::FOREGROUND,
+ flags: 0,
+};
+pub const DCELL: Cell = Cell { style: DSTYLE, letter: None };
impl Cells {
- pub fn new((c, r): (u16, u16)) -> Self {
+ pub fn new((c, r): (u16, u16), alternate: bool) -> Self {
let (c, r) = (c + 1, r + 1);
- Self {
- size: (c, r),
- margin: (1, r),
- cells: vec![Cell::default(); (c as usize) * (r as usize)],
- row: 0,
+ let mut cells = vec![DCELL; (c as usize) * (r as usize)];
+ if !alternate {
+ cells.reserve(1070000);
}
+ Self { size: (c, r), margin: (1, r), cells, row: 0 }
}
fn offset(&mut self) -> usize {
self.row as usize * self.size.0 as usize
@@ -86,10 +58,10 @@ impl Cells {
);
&mut self.cells[o..]
}
- pub fn r(&mut self) -> u16 {
+ pub fn r(&self) -> u16 {
self.size.1
}
- pub fn c(&mut self) -> u16 {
+ pub fn c(&self) -> u16 {
self.size.0
}
#[track_caller]
@@ -120,10 +92,7 @@ impl Cells {
+ (self.margin.1 as usize - 1) * self.size.0 as usize;
self.cells.splice(
at..at,
- repeat_n(
- Cell::default(),
- by as usize * (self.size.0) as usize,
- ),
+ repeat_n(DCELL, by as usize * (self.size.0) as usize),
);
}
@@ -154,7 +123,7 @@ impl Cells {
chunk
.iter()
.copied()
- .chain(repeat_n(default(), (c - oc) as usize))
+ .chain(repeat_n(DCELL, (c - oc) as usize))
})
.collect::<Vec<_>>();
assert!(self.cells.len() % c as usize == 0);
@@ -171,7 +140,7 @@ impl Cells {
if d < 0 {
self.row = 0;
self.cells.extend(repeat_n(
- Cell::default(),
+ DCELL,
d.abs() as usize * c as usize,
));
} else {
@@ -184,18 +153,16 @@ impl Cells {
pub fn insert_chars(&mut self, characters: u16, (x, y): (u16, u16)) {
let s = &mut self.row(y)[x as usize - 1..];
s.rotate_right(characters as usize);
- s[..characters as usize].fill(Cell::default());
+ s[..characters as usize].fill(DCELL);
let w = self.c();
- self.row(y)[w as usize - characters as usize..]
- .fill(Cell::default());
+ self.row(y)[w as usize - characters as usize..].fill(DCELL);
}
pub fn delete_chars(&mut self, characters: u16, (x, y): (u16, u16)) {
let s = &mut self.row(y)[x as usize - 1..];
s.rotate_left(characters as usize);
- s[..characters as usize].fill(Cell::default());
+ s[..characters as usize].fill(DCELL);
let w = self.c();
- self.row(y)[w as usize - characters as usize..]
- .fill(Cell::default());
+ self.row(y)[w as usize - characters as usize..].fill(DCELL);
}
pub fn insert_lines(&mut self, lines: u16, below: u16) {
let c = self.c();
@@ -219,7 +186,7 @@ mod test {
#[test]
fn grow() {
- let mut cells = Cells::new((4, 4));
+ let mut cells = Cells::new((4, 4), false);
cells.row(1).fill(Cell::basic('1'));
cells.row(2).fill(Cell::basic('2'));
cells.row(3).fill(Cell::basic('3'));
@@ -232,7 +199,9 @@ mod test {
dbg!(&cells);
assert_eq!(
format!("{cells:?}"),
- "Cells { size: (5, 5), margin: (1, 5), row: 1, cells: [2, 2, 2, 2, 2]\n[3, 3, 3, 3, 3]\n[4, 4, 4, 4, 4]\n[5, 5, 5, 5, 5]\n[ , , , , ]\n }"
+ "Cells { size: (5, 5), margin: (1, 5), row: 1, cells: [2, 2, \
+ 2, 2, 2]\n[3, 3, 3, 3, 3]\n[4, 4, 4, 4, 4]\n[5, 5, 5, 5, \
+ 5]\n[ , , , , ]\n }"
);
}
}