use shadeable::pixel_format::Rgba64; use crate::SCREEN_BUFFER; use { ab_glyph::{Font, FontRef, Glyph}, vga::{ colors::Color16, writers::{Graphics640x480x16, GraphicsWriter}, }, }; lazy_static::lazy_static! { pub static ref VGAE: spin::Mutex = { let xyz = Graphics640x480x16::new(); xyz.set_mode(); spin::Mutex::new(xyz) }; pub static ref VGAE_BUFF_OFFSET_X: spin::Mutex = spin::Mutex::new(0); pub static ref VGAE_BUFF_OFFSET_Y: spin::Mutex = spin::Mutex::new(0); } const FONT_SCALE: f32 = 1.6; /// Draw a glyph on the screen at the given position /// /// # Arguments /// * `x` - the x position of the glyph /// * `y` - the y position of the glyph /// * `glyph` - the glyph to draw /// * `color` - the color of the glyph pub fn draw_char(x: u8, y: u8, character: char, color: Rgba64) { // let mode = *VGAE.lock(); let mut mode = SCREEN_BUFFER.lock(); let basic_multingual_plane = FontRef::try_from_slice(include_bytes!( "../../ableos/assets/fonts/unifont-14.0.01.ttf" )) .unwrap(); let supplementary_multilingual_plane = FontRef::try_from_slice(include_bytes!( "../../ableos/assets/fonts/unifont_upper-14.0.01.ttf" )) .unwrap(); // let mut has_char = false; // for x in font.codepoint_ids() { // if x.1 == character { // has_char = true; // break; // } // } let is_in_basic_multilingual_plane = character as u32 <= 0xffff; let plane = match is_in_basic_multilingual_plane { true => basic_multingual_plane, false => supplementary_multilingual_plane, }; match character { '\n' => {} _ => { let q_glyph: Glyph = plane.glyph_id(character).with_scale_and_position( 20.0 * FONT_SCALE, ab_glyph::point(10.0 * FONT_SCALE, 18.0 * FONT_SCALE), ); if let Some(q) = plane.outline_glyph(q_glyph) { q.draw(|x, y, c| { if c > 0.015 { let corner = q.px_bounds().min; mode.set_pixel( x as usize + corner.x as usize, y as usize + corner.y as usize, color, ); } }); } } } } /// Converts a number to ... i forgor 💀 pub fn num_to_vga16(num: u8) -> Color16 { use Color16::*; match num { 0 => Black, 1 => Blue, 2 => Green, 3 => Cyan, 4 => Red, 5 => Magenta, 6 => Brown, 7 => LightGrey, 8 => DarkGrey, 9 => LightBlue, 10 => LightGreen, 11 => LightCyan, 12 => LightRed, 13 => Pink, 14 => Yellow, 15 => White, // NOTE: Leasve the in _ => Color16::Pink, } }