Add clear and draw wide point functions to bitmap4 (#505)

- Adds a proper clear and draw wide point functions to bitmap4 for
consistency.
- I must save the bitmap modes from being removed
This commit is contained in:
Gwilym Inzani 2023-10-24 21:57:02 +01:00 committed by GitHub
commit c47bef8983
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -88,4 +88,64 @@ impl Bitmap4<'_> {
let swapped = display ^ GraphicsSettings::PAGE_SELECT.bits(); let swapped = display ^ GraphicsSettings::PAGE_SELECT.bits();
DISPLAY_CONTROL.set(swapped); DISPLAY_CONTROL.set(swapped);
} }
/// Draws 2-pixel wide point on the non-current page at (x, y) coordinates with colour
/// index whose colour is specified in the background palette. Panics if (x,
/// y) is out of the bounds of the screen.
pub fn draw_wide_point(&mut self, x: i32, y: i32, colour: u8) {
let display = DISPLAY_CONTROL.get();
// get other page
let page = if display & GraphicsSettings::PAGE_SELECT.bits() != 0 {
Page::Front
} else {
Page::Back
};
self.draw_wide_point_page(x, y, colour, page);
}
/// Draws 2-pixel wide point on specified page at (x, y) coordinates with colour index
/// whose colour is specified in the background palette. Panics if (x, y) is
/// out of the bounds of the screen.
pub fn draw_wide_point_page(&mut self, x: i32, y: i32, colour: u8, page: Page) {
let addr = match page {
Page::Front => BITMAP_PAGE_FRONT_MODE_4,
Page::Back => BITMAP_PAGE_BACK_MODE_4,
};
let x_in_screen = (x / 2) as usize;
let y_in_screen = y as usize;
let c = u16::from(colour);
addr.set(x_in_screen, y_in_screen, c << 8 | c);
}
/// Fills specified page with color.
pub fn clear_page(&mut self, colour: u8, page: Page) {
let addr = match page {
Page::Front => BITMAP_PAGE_FRONT_MODE_4,
Page::Back => BITMAP_PAGE_BACK_MODE_4,
};
let c = u16::from(colour);
for x in 0..(WIDTH / 2) as usize {
for y in 0..(HEIGHT as usize) {
addr.set(x, y, c << 8 | c);
}
}
}
/// Fills non-current page with color.
pub fn clear(&mut self, colour: u8) {
let display = DISPLAY_CONTROL.get();
// get other page
let page = if display & GraphicsSettings::PAGE_SELECT.bits() != 0 {
Page::Front
} else {
Page::Back
};
self.clear_page(colour, page);
}
} }