use super::cache::RenderCache;
use super::core::{render_emulator_impl, render_line_with};
use crate::screen::cell::Row;
use crate::screen::traits::TerminalEmulator;
pub struct AnsiRenderer {
cache: RenderCache,
}
impl Default for AnsiRenderer {
fn default() -> Self {
Self::new()
}
}
impl AnsiRenderer {
pub fn new() -> Self {
Self {
cache: RenderCache::new(),
}
}
pub fn invalidate(&mut self) {
self.cache.invalidate();
}
pub fn render<E: TerminalEmulator + ?Sized>(&mut self, emu: &E, full: bool) -> Vec<u8> {
render_emulator_impl(emu, &[], full, &mut self.cache)
}
pub fn take_and_render<E: TerminalEmulator + ?Sized>(
&mut self,
emu: &mut E,
) -> (Vec<u8>, Vec<Vec<u8>>) {
let pending = emu.take_pending_scrollback();
let scrollback_lines: Vec<Vec<u8>> = pending
.iter()
.map(|row| render_line_with(row, |id| emu.resolve_style(id)))
.collect();
let mut passthrough = emu.take_passthrough();
passthrough.extend(emu.take_queued_notifications());
let render_data = if scrollback_lines.is_empty() {
self.render(&*emu, false)
} else {
self.render_with_scrollback(&*emu, &scrollback_lines)
};
(render_data, passthrough)
}
pub fn render_with_scrollback<E: TerminalEmulator + ?Sized>(
&mut self,
emu: &E,
scrollback: &[Vec<u8>],
) -> Vec<u8> {
render_emulator_impl(emu, scrollback, true, &mut self.cache)
}
pub fn render_rows<E: TerminalEmulator + ?Sized>(&self, emu: &E, rows: &[Row]) -> Vec<Vec<u8>> {
rows.iter()
.map(|row| render_line_with(row, |id| emu.resolve_style(id)))
.collect()
}
}