term2d/view/canvas/
halfblock.rs1use 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}