1use mockall::automock;
2
3#[derive(Copy, Clone, Debug)]
4pub struct Color {
5 pub red: u8,
6 pub green: u8,
7 pub blue: u8,
8 pub transparent: bool,
9}
10
11#[derive(Copy, Clone, Debug, PartialEq)]
12pub enum RenderTarget {
13 Main,
14 ObjectAtlas,
15 TileAtlas
16}
17
18impl PartialEq for Color {
19 fn eq(&self, other: &Self) -> bool {
20 self.red == other.red &&
21 self.green == other.green &&
22 self.blue == other.blue &&
23 self.transparent == other.transparent
24 }
25}
26
27impl Color {
28 pub fn white() -> Color {
29 Color::from_rgb(0x1F, 0x1F, 0x1F)
30 }
31
32 pub fn black() -> Color {
33 Color::from_rgb(0, 0, 0)
34 }
35
36 pub fn light_grey() -> Color {
37 Color::from_rgb(0xA, 0xA, 0xA)
38 }
39
40 pub fn dark_grey() -> Color {
41 Color::from_rgb(0x15, 0x15, 0x15)
42 }
43
44 pub fn from_word(color_word: u16) -> Color {
45 Color {
46 red: (color_word & 0x1F) as u8,
47 green: ((color_word & 0x3E0) >> 5) as u8,
48 blue: ((color_word & 0x7C00) >> 10) as u8,
49 transparent: false,
50 }
51 }
52
53 pub const fn from_rgb(red: u8, green: u8, blue: u8) -> Color {
54 Color {
55 red,
56 green,
57 blue,
58 transparent: false,
59 }
60 }
61
62 pub fn to_word(&self) -> u16 {
63 (self.red & 0x1F) as u16 |
64 ((self.green & 0x1F) as u16) << 5 |
65 ((self.blue & 0x1F) as u16) << 10
66 }
67
68 fn to_5_bit(value: u8) -> u8 {
69 value >> 3
70 }
71
72 fn to_8_bit(value: u8) -> u8 {
73 if value == 0 {
74 0
75 } else {
76 (value << 3) | (0x07)
77 }
78 }
79
80 pub fn to_rgb555(&self) -> Color {
81 Color {
82 red: Color::to_5_bit(self.red),
83 green: Color::to_5_bit(self.green),
84 blue: Color::to_5_bit(self.blue),
85 transparent: self.transparent,
86 }
87 }
88
89 pub fn to_rgb888(&self) -> Color {
90 Color {
91 red: Color::to_8_bit(self.red),
92 green: Color::to_8_bit(self.green),
93 blue: Color::to_8_bit(self.blue),
94 transparent: self.transparent,
95 }
96 }
97
98 pub fn transparent() -> Color {
99 Color {
100 red: 0,
101 green: 0,
102 blue: 0,
103 transparent: true,
104 }
105 }
106}
107
108#[automock]
109pub trait Renderer {
110 fn render_target_is_enabled(&self, target: RenderTarget) -> bool;
111 fn set_render_target_enabled(&mut self, target: RenderTarget, enabled: bool);
112 fn draw_pixel(&mut self, x: usize, y: usize, z: u8, color: Color, target: RenderTarget);
113 fn flush(&mut self);
114}