rustboy_core/
renderer.rs

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}