librsmsx 0.5.2

a MSX emulator written in rust, a port from gomsx
Documentation
use sdl3::{
    pixels::Color,
    render::{Canvas, FPoint, FRect},
    video::Window,
};

// TODO: use better GUI when they adopt SDL3 properly
pub fn simple_ui_button(
    rect: &FRect,
    color: Color,
    canvas: &mut Canvas<Window>,
    point: &FPoint,
    pressed: bool,
    scale: f32,
    text: &str,
) -> bool {
    let color_ = canvas.draw_color();
    canvas.set_draw_color(color);
    // canvas.fill_rect(Rect::new(0, 0, 512, 192)).unwrap(); // fill_rect does not work for now
    canvas.draw_rect(*rect).unwrap();

    // draw text
    for (i, ch) in text.chars().collect::<Vec<char>>().iter().enumerate() {
        draw_letter(canvas, rect.x + 7.0 + (i as f32 * 10.), rect.y + 10., *ch);
    }

    canvas.set_draw_color(color_);

    let x0 = rect.x * scale;
    let y0 = rect.y * scale;
    let x1 = (rect.x + rect.w) * scale;
    let y1 = (rect.y + rect.h) * scale;
    pressed && x0 <= point.x && point.x <= x1 && y0 <= point.y && point.y <= y1
}

fn draw_letter(canvas: &mut Canvas<Window>, x: f32, y: f32, ch: char) {
    match ch {
        'A' => {
            let v: Vec<FPoint> = vec![
                FPoint::new(x + 0., y + 10.),
                FPoint::new(x + 0., y + 5.),
                FPoint::new(x + 2., y + 0.),
                FPoint::new(x + 3., y + 0.),
                FPoint::new(x + 5., y + 5.),
                FPoint::new(x + 5., y + 10.),
                FPoint::new(x + 5., y + 5.),
                FPoint::new(x + 0., y + 5.),
            ];
            canvas.draw_lines(v.as_slice()).unwrap();
        }
        'B' => {
            let v: Vec<FPoint> = vec![
                FPoint::new(x + 0., y + 10.),
                FPoint::new(x + 0., y + 0.),
                FPoint::new(x + 3., y + 0.),
                FPoint::new(x + 5., y + 2.),
                FPoint::new(x + 5., y + 3.),
                FPoint::new(x + 3., y + 5.),
                FPoint::new(x + 0., y + 5.),
                FPoint::new(x + 3., y + 5.),
                FPoint::new(x + 5., y + 7.),
                FPoint::new(x + 5., y + 8.),
                FPoint::new(x + 3., y + 10.),
                FPoint::new(x + 0., y + 10.),
            ];
            canvas.draw_lines(v.as_slice()).unwrap();
        }
        'D' => {
            let v: Vec<FPoint> = vec![
                FPoint::new(x + 0., y + 0.),
                FPoint::new(x + 0., y + 10.),
                FPoint::new(x + 3., y + 10.),
                FPoint::new(x + 5., y + 5.),
                FPoint::new(x + 3., y + 0.),
                FPoint::new(x + 0., y + 0.),
            ];
            canvas.draw_lines(v.as_slice()).unwrap();
        }
        'E' => {
            let v: Vec<FPoint> = vec![
                FPoint::new(x + 5., y + 0.),
                FPoint::new(x + 0., y + 0.),
                FPoint::new(x + 0., y + 5.),
                FPoint::new(x + 5., y + 5.),
                FPoint::new(x + 0., y + 5.),
                FPoint::new(x + 0., y + 10.),
                FPoint::new(x + 5., y + 10.),
            ];
            canvas.draw_lines(v.as_slice()).unwrap();
        }
        'G' => {
            let v: Vec<FPoint> = vec![
                FPoint::new(x + 5., y + 0.),
                FPoint::new(x + 0., y + 0.),
                FPoint::new(x + 0., y + 10.),
                FPoint::new(x + 5., y + 10.),
                FPoint::new(x + 5., y + 5.),
                FPoint::new(x + 3., y + 5.),
            ];
            canvas.draw_lines(v.as_slice()).unwrap();
        }
        'L' => {
            let v: Vec<FPoint> = vec![
                FPoint::new(x + 0., y + 0.),
                FPoint::new(x + 0., y + 10.),
                FPoint::new(x + 5., y + 10.),
            ];
            canvas.draw_lines(v.as_slice()).unwrap();
        }
        'O' => {
            let v: Vec<FPoint> = vec![
                FPoint::new(x + 0., y + 0.),
                FPoint::new(x + 0., y + 10.),
                FPoint::new(x + 5., y + 10.),
                FPoint::new(x + 5., y + 0.),
                FPoint::new(x + 0., y + 0.),
            ];
            canvas.draw_lines(v.as_slice()).unwrap();
        }
        'R' => {
            let v: Vec<FPoint> = vec![
                FPoint::new(x + 0., y + 10.),
                FPoint::new(x + 0., y + 0.),
                FPoint::new(x + 5., y + 0.),
                FPoint::new(x + 5., y + 5.),
                FPoint::new(x + 0., y + 5.),
                FPoint::new(x + 5., y + 10.),
            ];
            canvas.draw_lines(v.as_slice()).unwrap();
        }
        'S' => {
            let v: Vec<FPoint> = vec![
                FPoint::new(x + 5., y + 0.),
                FPoint::new(x + 1., y + 0.),
                FPoint::new(x + 0., y + 1.),
                FPoint::new(x + 0., y + 5.),
                FPoint::new(x + 5., y + 5.),
                FPoint::new(x + 5., y + 9.),
                FPoint::new(x + 4., y + 10.),
                FPoint::new(x + 0., y + 10.),
            ];
            canvas.draw_lines(v.as_slice()).unwrap();
        }
        'T' => {
            let v: Vec<FPoint> = vec![
                FPoint::new(x + 0., y + 0.),
                FPoint::new(x + 2.5, y + 0.),
                FPoint::new(x + 2.5, y + 10.),
                FPoint::new(x + 2.5, y + 0.),
                FPoint::new(x + 5., y + 0.),
            ];
            canvas.draw_lines(v.as_slice()).unwrap();
        }
        'V' => {
            let v: Vec<FPoint> = vec![
                FPoint::new(x + 0., y + 0.),
                FPoint::new(x + 2., y + 10.),
                FPoint::new(x + 3., y + 10.),
                FPoint::new(x + 5., y + 0.),
            ];
            canvas.draw_lines(v.as_slice()).unwrap();
        }
        '1' => {
            let v: Vec<FPoint> = vec![
                FPoint::new(x + 0., y + 2.),
                FPoint::new(x + 2., y + 0.),
                FPoint::new(x + 2., y + 10.),
            ];
            canvas.draw_lines(v.as_slice()).unwrap();
        }
        '2' => {
            let v: Vec<FPoint> = vec![
                FPoint::new(x + 0., y + 2.),
                FPoint::new(x + 0., y + 0.),
                FPoint::new(x + 5., y + 0.),
                FPoint::new(x + 5., y + 3.),
                FPoint::new(x + 0., y + 7.),
                FPoint::new(x + 0., y + 10.),
                FPoint::new(x + 5., y + 10.),
            ];
            canvas.draw_lines(v.as_slice()).unwrap();
        }
        _ => {}
    }
}