summaryrefslogtreecommitdiff
path: root/src/devices/screen/draw_rect.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/screen/draw_rect.rs')
-rw-r--r--src/devices/screen/draw_rect.rs42
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;
+ }
+ };
+ }
+}