From 67f8919630be6be1e1af8a298d6c74e0a984314b Mon Sep 17 00:00:00 2001 From: Joscha Date: Sat, 21 May 2022 23:38:37 +0200 Subject: [PATCH] Only draw differences from previous frame --- src/buffer.rs | 18 ++++++++---------- src/terminal.rs | 5 ++++- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/buffer.rs b/src/buffer.rs index d8c169c..5b9092e 100644 --- a/src/buffer.rs +++ b/src/buffer.rs @@ -30,7 +30,7 @@ impl Pos { } } -#[derive(Debug, Clone)] +#[derive(Debug, Clone, PartialEq, Eq)] pub struct Cell { pub content: Box, pub style: ContentStyle, @@ -67,6 +67,12 @@ impl Buffer { y * width + x } + pub(crate) fn at(&self, x: u16, y: u16) -> &Cell { + assert!(x < self.size.width); + assert!(y < self.size.height); + &self.data[self.index(x, y)] + } + pub fn size(&self) -> Size { self.size } @@ -143,14 +149,6 @@ pub struct Cells<'a> { y: u16, } -impl<'a> Cells<'a> { - fn at(&self, x: u16, y: u16) -> &'a Cell { - assert!(x < self.buffer.size.width); - assert!(y < self.buffer.size.height); - &self.buffer.data[self.buffer.index(x, y)] - } -} - impl<'a> Iterator for Cells<'a> { type Item = (u16, u16, &'a Cell); @@ -160,7 +158,7 @@ impl<'a> Iterator for Cells<'a> { } let (x, y) = (self.x, self.y); - let cell = self.at(self.x, self.y); + let cell = self.buffer.at(self.x, self.y); assert!(cell.offset == 0); self.x += cell.width as u16; diff --git a/src/terminal.rs b/src/terminal.rs index 2101e8b..b0055e6 100644 --- a/src/terminal.rs +++ b/src/terminal.rs @@ -98,8 +98,11 @@ impl Terminal { } fn draw_differences(&mut self) -> io::Result<()> { - // TODO Only draw the differences for (x, y, cell) in self.frame.buffer.cells() { + if self.prev_frame_buffer.at(x, y) == cell { + continue; + } + let content = StyledContent::new(cell.style, &cell.content as &str); self.out .queue(MoveTo(x, y))?