diff --git a/card10-l0dable/src/display.rs b/card10-l0dable/src/display.rs index d869ad56592614921cab82e8984451ed69c116e4..4faca355e04b3af37c672a90c83fc35f3df9db53 100644 --- a/card10-l0dable/src/display.rs +++ b/card10-l0dable/src/display.rs @@ -75,6 +75,15 @@ pub enum FillStyle { pub struct Display; +#[repr(u8)] +pub enum Font { + Font8 = disp_font_name_DISP_FONT8 as u8, + Font12 = disp_font_name_DISP_FONT12 as u8, + Font16 = disp_font_name_DISP_FONT16 as u8, + Font20 = disp_font_name_DISP_FONT20 as u8, + Font24 = disp_font_name_DISP_FONT24 as u8, +} + impl Display { pub const W: u16 = 160; pub const H: u16 = 80; @@ -107,6 +116,13 @@ impl Display { } } + /// s must be 0-terminated + pub fn print_adv(&self, font: Font, x: u16, y: u16, s: &[u8], fg: Color, bg: Color) { + unsafe { + epic_disp_print_adv(font as u8, x, y, s.as_ptr(), fg.0, bg.0); + } + } + pub fn pixel(&self, x: u16, y: u16, color: Color) { unsafe { epic_disp_pixel(x, y, color.0); @@ -186,3 +202,21 @@ macro_rules! display { $disp.print($x, $y, s.as_bytes(), $fg, $bg); }); } + +/// Requires `card10_alloc::init()` and `extern crate alloc;` +#[macro_export] +macro_rules! display_adv { + ($disp: expr, $font: tt, $x: expr, $y: expr, $fg: expr, $bg: expr, + $fmt: expr) => ({ + use alloc::format; + use card10_l0dable::Font; + let s = format!(concat!($fmt, "\0")); + $disp.print_adv(Font::$font, $x, $y, s.as_bytes(), $fg, $bg); + }); + ($disp: expr, $font: tt, $x: expr, $y: expr, $fg: expr, $bg: expr, + $fmt: expr, $($arg: tt)*) => ({ + use alloc::format; + let s = format!(concat!($fmt, "\0"), $($arg)*); + $disp.print_adv(Font::$font, $x, $y, s.as_bytes(), $fg, $bg); + }); +} diff --git a/card10-l0dable/src/lib.rs b/card10-l0dable/src/lib.rs index bf0bf40148f54a7db98b9395d38fd313b3dbba79..5cdac461a7714fb49ead1ef5516192701fd0b665 100644 --- a/card10-l0dable/src/lib.rs +++ b/card10-l0dable/src/lib.rs @@ -3,7 +3,7 @@ mod os; pub use os::*; mod display; -pub use display::{Color, Display, FillStyle, LineStyle}; +pub use display::{Color, Display, Font, FillStyle, LineStyle}; mod buttons; pub mod framebuffer; pub use buttons::Buttons; diff --git a/rkanoid/src/main.rs b/rkanoid/src/main.rs index 770e9d4ed87c7ae1028c0980990a82d8fd53903e..5139900e5e6c2cf1c3df4ad670078191818f6403 100644 --- a/rkanoid/src/main.rs +++ b/rkanoid/src/main.rs @@ -292,10 +292,10 @@ fn game(level: u16, mut score: u32) -> GameResult { fn title_screen() { let display = Display::open(); display.clear(Color::red()); - display!(display, 30, 15, Color::white(), Color::red(), "Rkanoid"); - display!(display, 30, 30, Color::white(), Color::red(), "in Rust"); - display!(display, 20, 45, Color::white(), Color::red(), "by Astro"); - display!(display, Display::W - 2 * Display::FONT_W, Display::H - Display::FONT_H, Color::yellow(), Color::blue(), "Go"); + display_adv!(display, Font24, Display::W / 2 - 60, 14, Color::white(), Color::red(), "Rkanoid"); + display_adv!(display, Font20, Display::W / 2 - 49, 40, Color::white(), Color::red(), "in Rust"); + display_adv!(display, Font16, Display::W / 2 - 44, 64, Color::white(), Color::red(), "by Astro"); + display!(display, Display::W - 2 * Display::FONT_W, Display::H - Display::FONT_H + 3, Color::yellow(), Color::blue(), "Go"); display.update(); while !Buttons::read().right_bottom() {} }