diff --git a/Cargo.lock b/Cargo.lock index 2e87e10..71d5cba 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9,7 +9,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec3672c180e71eeaaac3a541fbbc5f5ad4def8b747c595ad30d674e43049f7b0" dependencies = [ "ab_glyph_rasterizer", - "owned_ttf_parser 0.25.0", + "owned_ttf_parser", ] [[package]] @@ -1501,6 +1501,7 @@ dependencies = [ name = "gopher64" version = "1.0.14" dependencies = [ + "ab_glyph", "bindgen", "cc", "chrono", @@ -1516,7 +1517,6 @@ dependencies = [ "regex", "reqwest", "rfd", - "rusttype", "sdl3-sys", "semver", "serde", @@ -2729,22 +2729,13 @@ dependencies = [ "pin-project-lite", ] -[[package]] -name = "owned_ttf_parser" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05e6affeb1632d6ff6a23d2cd40ffed138e82f1532571a26f527c8a284bb2fbb" -dependencies = [ - "ttf-parser 0.15.2", -] - [[package]] name = "owned_ttf_parser" version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22ec719bbf3b2a81c109a4e20b1f129b5566b7dce654bc3872f6a05abf82b2c4" dependencies = [ - "ttf-parser 0.25.1", + "ttf-parser", ] [[package]] @@ -3325,16 +3316,6 @@ dependencies = [ "untrusted", ] -[[package]] -name = "rusttype" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ff8374aa04134254b7995b63ad3dc41c7f7236f69528b28553da7d72efaa967" -dependencies = [ - "ab_glyph_rasterizer", - "owned_ttf_parser 0.15.2", -] - [[package]] name = "rustversion" version = "1.0.20" @@ -3994,12 +3975,6 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" -[[package]] -name = "ttf-parser" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b3e06c9b9d80ed6b745c7159c40b311ad2916abb34a49e9be2653b90db0d8dd" - [[package]] name = "ttf-parser" version = "0.25.1" diff --git a/Cargo.toml b/Cargo.toml index 59529a3..99469ba 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,7 +17,7 @@ serde_json = "1.0" serde-big-array = "0.5" eframe = { version = "0.31", default-features = false, features = ["wayland", "x11", "glow"] } sha2 = "0.10" -rusttype = "0.9" +ab_glyph = "0.2" sdl3-sys = { version = "0.4", features = ["build-from-source-static"] } rfd = { version = "0.15", default-features = false, features = ["xdg-portal", "tokio"] } tokio = {version = "1.43", features = ["rt-multi-thread", "macros"] } diff --git a/src/ui/input.rs b/src/ui/input.rs index 39b2d40..b4a0f2a 100644 --- a/src/ui/input.rs +++ b/src/ui/input.rs @@ -538,11 +538,19 @@ pub fn configure_input_profile(ui: &mut ui::Ui, profile: String, dinput: bool) { id: 0, axis: 0, }; + + let font = + ab_glyph::FontRef::try_from_slice(include_bytes!("../../data/Roboto-Regular.ttf")).unwrap(); + for (key, value) in key_labels.iter() { let mut event: sdl3_sys::events::SDL_Event = Default::default(); while unsafe { sdl3_sys::events::SDL_PollEvent(&mut event) } {} // clear events - ui::video::draw_text(format!("Select binding for: {key}").as_str(), renderer); + ui::video::draw_text( + format!("Select binding for: {key}").as_str(), + renderer, + &font, + ); let mut key_set = false; while !key_set { diff --git a/src/ui/video.rs b/src/ui/video.rs index a10d513..68a944a 100644 --- a/src/ui/video.rs +++ b/src/ui/video.rs @@ -1,6 +1,7 @@ #![allow(non_snake_case)] include!(concat!(env!("OUT_DIR"), "/parallel_bindings.rs")); use crate::{device, ui}; +use ab_glyph::{Font, ScaleFont}; pub fn init(device: &mut device::Device) { ui::sdl_init(sdl3_sys::init::SDL_INIT_VIDEO); @@ -140,15 +141,11 @@ pub fn process_rdp_list() -> u64 { unsafe { rdp_process_commands() } } -pub fn draw_text(text: &str, renderer: *mut sdl3_sys::render::SDL_Renderer) { - let font = - rusttype::Font::try_from_bytes(include_bytes!("../../data/Roboto-Regular.ttf")).unwrap(); - - let text_size = 32; - let scale = rusttype::Scale::uniform(text_size as f32); - let v_metrics = font.v_metrics(scale); - let offset = rusttype::point(10.0, 10.0 + v_metrics.ascent); - +pub fn draw_text( + text: &str, + renderer: *mut sdl3_sys::render::SDL_Renderer, + font: &ab_glyph::FontRef, +) { // Clear the canvas unsafe { sdl3_sys::render::SDL_SetRenderDrawColor( @@ -161,12 +158,20 @@ pub fn draw_text(text: &str, renderer: *mut sdl3_sys::render::SDL_Renderer) { sdl3_sys::render::SDL_RenderClear(renderer); }; - for glyph in font.layout(text, scale, offset) { - if let Some(bb) = glyph.pixel_bounding_box() { - glyph.draw(|x, y, v| { - let x = x as i32 + bb.min.x; - let y = y as i32 + bb.min.y + (240 - text_size); - if v > 0.5 { + let text_size = 40.0; + let (mut w, mut h) = (0, 0); + unsafe { sdl3_sys::render::SDL_GetRenderOutputSize(renderer, &mut w, &mut h) }; + let x_start = 20.0; + let y_start = (h / 2) as f32; + + let mut x_offset = 0.0; + for c in text.chars() { + let q_glyph_id = font.glyph_id(c); + let q_glyph = q_glyph_id.with_scale(text_size); + + if let Some(q) = font.outline_glyph(q_glyph) { + q.draw(|x, y, c| { + if c > 0.5 { unsafe { sdl3_sys::render::SDL_SetRenderDrawColor( renderer, @@ -175,11 +180,17 @@ pub fn draw_text(text: &str, renderer: *mut sdl3_sys::render::SDL_Renderer) { 255, sdl3_sys::pixels::SDL_ALPHA_OPAQUE, ); - sdl3_sys::render::SDL_RenderPoint(renderer, x as f32, y as f32); + sdl3_sys::render::SDL_RenderPoint( + renderer, + x_start + x_offset + x as f32 - q.px_bounds().width() + + q.px_bounds().max.x, + y_start + y as f32 - q.px_bounds().height() + q.px_bounds().max.y, + ); }; } }); } + x_offset += font.as_scaled(text_size).h_advance(q_glyph_id); } // Present the canvas