term2d/view/canvas/
halfblock.rs

1use super::Canvas;
2use crate::model::color::Color;
3use crate::model::point::Point;
4use crate::model::rect::Rect;
5use crate::model::rgba::Rgba;
6use crate::view::screen::RawTerminalScreen;
7use crate::view::screen::Screen;
8
9const HALF_BLOCK: char = '▀';
10
11pub struct HalfblockCanvas {
12    screen: Option<RawTerminalScreen>,
13    size: Point,
14}
15
16impl HalfblockCanvas {
17    pub fn new() -> Self {
18        Self {
19            screen: None,
20            size: Point::new(0, 0),
21        }
22    }
23}
24
25impl Canvas for HalfblockCanvas {
26    fn init(&mut self, screen: RawTerminalScreen) {
27        let screen_size = screen.get_size();
28        self.size = Point::new(screen_size.width(), 2 * screen_size.height());
29        self.screen = Some(screen);
30    }
31
32    fn get_size(&self) -> &Point {
33        &self.size
34    }
35
36    fn resize(&mut self) -> &Point {
37        let screen_size = self.screen.as_mut().unwrap().resize();
38        self.size = Point::new(screen_size.width(), 2 * screen_size.height());
39        &self.size
40    }
41
42    fn clear(&mut self) {
43        self.screen.as_mut().unwrap().clear();
44    }
45
46    fn draw_pixel(&mut self, p: &Point, rgb: &Rgba) {
47        let screen = self.screen.as_mut().unwrap();
48        let x = p.x;
49        let y = p.y / 2;
50
51        if !Rect::from(&self.size).contains(p) {
52            return;
53        }
54
55        let old_color = screen.get_color(&Point::new(x, y));
56
57        let new_color = if p.y % 2 == 0 {
58            Color {
59                bg: old_color.bg,
60                fg: rgb.clone(),
61            }
62        } else {
63            Color {
64                bg: rgb.clone(),
65                fg: old_color.fg,
66            }
67        };
68
69        screen.draw_char(&Point::new(x, y), &new_color, HALF_BLOCK);
70    }
71
72    fn draw_char(&mut self, p: &Point, color: &Color, ch: char) {
73        let scaled_point = &Point::new(p.x, p.y / 2);
74        self.screen
75            .as_mut()
76            .unwrap()
77            .draw_char(&scaled_point, color, ch);
78    }
79
80    fn draw_text(&mut self, p: &Point, color: &Color, text: &str) {
81        let scaled_point = &Point::new(p.x, p.y / 2);
82        self.screen
83            .as_mut()
84            .unwrap()
85            .draw_text(scaled_point, color, text);
86    }
87
88    fn display(&mut self) {
89        self.screen.as_mut().unwrap().display();
90    }
91}