diff options
Diffstat (limited to 'src/devices/screen/draw_rect.rs')
-rw-r--r-- | src/devices/screen/draw_rect.rs | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/src/devices/screen/draw_rect.rs b/src/devices/screen/draw_rect.rs new file mode 100644 index 0000000..265a87f --- /dev/null +++ b/src/devices/screen/draw_rect.rs @@ -0,0 +1,42 @@ +use super::*; + +impl ScreenDevice { + pub fn draw_rect(&mut self, colour: u8, layer: ScreenLayer) { + if let Some([x0, y0, x1, y1]) = self.find_vector_bounding_box() { + let screen_width = self.dimensions.width as usize; + let rect_width = x1 - x0 + 1; + let mut i = x0 + (screen_width * y0); + let buffer = match layer { + ScreenLayer::Background => &mut self.background, + ScreenLayer::Foreground => &mut self.foreground, + }; + for _ in y0..=y1 { + buffer[i..i+rect_width].fill(colour); + i += screen_width; + } + } + } + + pub fn draw_rect_1bit(&mut self, params: u8, layer: ScreenLayer) { + if let Some([x0, y0, x1, y1]) = self.find_vector_bounding_box() { + let screen_width = self.dimensions.width as usize; + let rect_width = x1 - x0 + 1; + let mut i = x0 + (screen_width * y0); + let sprite = self.sprite_buffer.get_1bit_sprite(params); + let buffer = match layer { + ScreenLayer::Background => &mut self.background, + ScreenLayer::Foreground => &mut self.foreground, + }; + + for y in y0..=y1 { + let row = sprite[y % 8]; + for x in x0..=x1 { + let colour = row[x % 8]; + if colour != 0xff { buffer[i] = colour } + i += 1; + } + i += screen_width - rect_width; + } + }; + } +} |