ltrender 0.1.3

a diff based terminal rendering engine
Documentation
use ascii_assets::TerminalChar;
use common_stdx::{Point, Rect};

use crate::{
    DrawError, SpriteRegistry, error,
    terminal_buffer::{self, BasicDrawCreator, Drawable, drawable::DoublePointed},
    update_interval_handler::UpdateIntervalCreator,
};

#[derive(Clone, Debug)]
pub struct LineDrawable {
    pub start: Point<i32>,
    pub end: Point<i32>,
    pub chr: TerminalChar,
}

impl DoublePointed for LineDrawable {
    fn start(&self) -> Point<i32> {
        self.start
    }
    fn end(&self) -> Point<i32> {
        self.end
    }

    fn set_start(&mut self, p: Point<i32>) {
        self.start = p;
    }
    fn set_end(&mut self, p: Point<i32>) {
        self.end = p;
    }
}

impl Drawable for LineDrawable {
    fn size(&self, _sprites: &SpriteRegistry) -> Result<(u16, u16), DrawError> {
        let min_x = self.start.x.min(self.end.x);
        let max_x = self.start.x.max(self.end.x);
        let min_y = self.start.y.min(self.end.y);
        let max_y = self.start.y.max(self.end.y);

        let width = max_x - min_x + 1;
        let height = max_y - min_y + 1;

        Ok((width as u16, height as u16))
    }
    fn as_double_pointed_mut(&mut self) -> Option<&mut dyn DoublePointed> {
        Some(self)
    }
    fn draw(
        &mut self,
        _sprites: &SpriteRegistry,
    ) -> std::result::Result<terminal_buffer::basic_draw_creator::BasicDrawCreator, error::DrawError>
    {
        let mut bd_creator = BasicDrawCreator::new();
        bd_creator.draw_line(self.start, self.end, self.chr);

        Ok(bd_creator)
    }

    fn bounding_iv(&self, _sprites: &SpriteRegistry) -> Option<UpdateIntervalCreator> {
        let mut c = UpdateIntervalCreator::new();

        let min_x = self.start.x.min(self.end.x);
        let max_x = self.start.x.max(self.end.x);
        let min_y = self.start.y.min(self.end.y);
        let max_y = self.start.y.max(self.end.y);

        c.register_redraw_region(Rect {
            p1: Point { x: min_x, y: min_y },
            p2: Point {
                x: max_x.saturating_add(1),
                y: max_y.saturating_add(1),
            },
        });
        Some(c)
    }
}