diff options
author | Ben Bridle <bridle.benjamin@gmail.com> | 2024-04-16 10:51:13 +1200 |
---|---|---|
committer | Ben Bridle <bridle.benjamin@gmail.com> | 2024-04-16 10:51:26 +1200 |
commit | 6b3796c9a0d3a2f1422bcbde4790c43417659722 (patch) | |
tree | 6429a5fa2f8c4d3b26790775e07e46e6338b61d3 /src/devices/screen/draw_rect.rs | |
parent | 28101de56231252ca0cfa6a9f107b75112c9acad (diff) | |
download | bedrock-pc-6b3796c9a0d3a2f1422bcbde4790c43417659722.zip |
Update devices to match new specifications
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; + } + }; + } +} |