mplusfonts 0.3.4

Parametrized bitmap font family for embedded-graphics
Documentation
use core::convert::Infallible;
use core::iter;

use embedded_graphics::pixelcolor::Rgb565;
use embedded_graphics::prelude::*;
use embedded_graphics::primitives::Rectangle;
use embedded_graphics_simulator::SimulatorEvent::{KeyDown, Quit};
use embedded_graphics_simulator::sdl2::Keycode;
use embedded_graphics_simulator::{OutputSettingsBuilder, SimulatorDisplay, Window};
use embedded_text::TextBox;
use embedded_text::alignment::HorizontalAlignment;
use embedded_text::style::TextBoxStyle;
use mplusfonts::mplus;
use mplusfonts::style::BitmapFontStyleBuilder;

/// Displays all 128 characters in the Box Drawing Unicode block (plus the `๐Ÿฎฏ` character).
#[mplusfonts::strings]
pub fn main() -> Result<(), Infallible> {
    let mut display: SimulatorDisplay<Rgb565> = SimulatorDisplay::new(Size::new(240, 240));

    #[strings::emit]
    let bitmap_font = mplus!(code(100), 450, code_line_height(27), true, 1, 4);

    let builder = BitmapFontStyleBuilder::new().text_color(Rgb565::new(18, 56, 20));

    let text_rows = [
        "โ•”โ•โ•โ•ฆโ•โ•โ•—  โ•ญโ”€โ”€โ”€โ”€โ”€โ•ฎ",
        "โ•‘โ”Œโ”€โ•จโ”€โ”โ•‘  โ”‚โ•”โ•โ•คโ•โ•—โ”‚",
        "โ•‘โ”‚โ•ฒ โ•ฑโ”‚โ•‘  โ”‚โ•‘ โ•ฝ โ•‘โ”‚",
        "โ• โ•ก โ•ณ โ•žโ•ฃ  โ”‚โ•Ÿโ•ผโ•‹โ•พโ•ขโ”‚",
        "โ•‘โ”‚โ•ฑ โ•ฒโ”‚โ•‘  โ”‚โ•‘ โ•ฟ โ•‘โ”‚",
        "โ•‘โ””โ”€โ•ฅโ”€โ”˜โ•‘  โ”‚โ•šโ•โ•งโ•โ•โ”‚",
        "โ•šโ•โ•โ•ฉโ•โ•โ•  โ•ฐโ”€โ”€โ”€โ”€โ”€โ•ฏ",
        "โ”Œโ”€โ”€โ”ฎโ”โ”โ”“  โ”โ”โ”โ”ฑโ”€โ”€โ”",
        "โ”‚โ•’โ•โ•ชโ•โ••โ”ƒ  โ”ƒโ•“โ”€โ•€โ”€โ•–โ”‚",
        "โ”‚โ”‚ โ”‚ โ”‚โ”ƒ  โ”ƒโ•‘ โ”‚ โ•‘โ”‚",
        "โ”ขโ”ฝโ”€โ”ผโ”€โ”พโ”ฉ  โ”žโ•ซโ”€โ”ผโ”€โ•ซโ”ง",
        "โ”ƒโ”‚ โ”‚ โ”‚โ”‚  โ”‚โ•‘ โ”‚ โ•‘โ”ƒ",
        "โ”ƒโ•˜โ•โ•ชโ•โ•›โ”‚  โ”‚โ•™โ”€โ•โ”€โ•œโ”ƒ",
        "โ”—โ”โ”โ”ตโ”€โ”€โ”˜  โ””โ”€โ”€โ”บโ”โ”โ”›",
        "โ•ญโ”€โ”€โ”ฌโ”€โ”€โ•ฎ  โ”Žโ”ฌโ”’ โ”โ”ฏโ”‘",
        "โ”‚โ”โ”โ•ˆโ”โ”“โ”‚  โ” โ”ผโ”จ โ” โ”ผโ”ค",
        "โ”‚โ”ƒ โ•ฟ โ”ƒโ”‚  โ”—โ”ทโ•ƒโ•ฅโ•„โ”ทโ”™",
        "โ”œโ•Šโ•พโ”ผโ•ผโ•‰โ”ค    โ•žโ•ฌโ•ก\u{A0}\u{A0}",
        "โ”‚โ”ƒ โ•ฝ โ”ƒโ”‚  โ”โ”ฏโ•…โ•จโ•†โ”ฏโ”“",
        "โ”‚โ”—โ”โ•‡โ”โ”›โ”‚  โ”œโ”ผโ”จ โ” โ”ผโ”จ",
        "โ•ฐโ”€โ”€โ”ดโ”€โ”€โ•ฏ  โ”•โ”ทโ”› โ”–โ”ดโ”š",
        "โ”โ”‰โ”‰โ”ญโ”ˆโ”ˆโ”  โ”Œโ”ฌโ”ฌโ”ฐโ”ฒโ”ณโ”“",
        "โ” โ”„โ”„โ”ผโ”„โ”„โ”ค  โ”Šโ”†โ•Žโ•นโ•โ”‡โ”‹",
        "โ” โ•Œโ•Œโ”ดโ•Œโ•Œโ”ค  โ”Šโ”†โ•Žโ•ทโ•โ”‡โ”‹",
        "โ”ฃโ•ธโ•ถ๐Ÿฎฏโ•ดโ•บโ”ฅ  โ”Ÿโ”ผโ”ผโ”ผโ•‚โ•‚โ”ฆ",
        "โ”กโ•โ•โ”ฏโ•โ•โ”ช  โ”‹โ”†โ•Žโ•ตโ•โ”‡โ”Š",
        "โ”โ”…โ”…โ”ฟโ”…โ”…โ”ซ  โ”‹โ”†โ•Žโ•ปโ•โ”‡โ”Š",
        "โ””โ”ˆโ”ˆโ”ถโ”‰โ”‰โ”›  โ”—โ”ทโ”ทโ”ปโ”นโ”ธโ”˜",
    ];

    let output_settings = OutputSettingsBuilder::new()
        .scale(3)
        .pixel_spacing(1)
        .build();

    #[strings::skip]
    let mut window = Window::new("Simulator", &output_settings);

    let mut row_offset = 0;

    'running: loop {
        let text = String::from_iter(
            text_rows
                .into_iter()
                .cycle()
                .skip(row_offset)
                .take(8)
                .zip(iter::repeat("\n"))
                .map(|(string, newline)| [string, newline])
                .flatten(),
        );

        let textbox = TextBox::with_textbox_style(
            &text,
            Rectangle::new(Point::new(10, 12), Size::new(220, 216)),
            builder.clone().font(&bitmap_font).build(),
            TextBoxStyle::with_alignment(HorizontalAlignment::Center),
        );

        textbox.draw(&mut display)?;

        window.update(&display);

        let increment = 'waiting: loop {
            for event in window.events() {
                match event {
                    KeyDown {
                        keycode: Keycode::SPACE | Keycode::DOWN,
                        ..
                    } => break 'waiting 1,
                    KeyDown {
                        keycode: Keycode::BACKSPACE | Keycode::UP,
                        ..
                    } => break 'waiting text_rows.len() - 1,
                    KeyDown {
                        keycode: Keycode::PAGEDOWN,
                        ..
                    } => break 'waiting 7,
                    KeyDown {
                        keycode: Keycode::PAGEUP,
                        ..
                    } => break 'waiting text_rows.len() - 7,
                    Quit => break 'running Ok(()),
                    _ => continue 'waiting,
                }
            }
        };

        row_offset = row_offset.wrapping_add(increment) % text_rows.len();
    }
}