2022-01-18 08:30:09 -06:00
|
|
|
use alloc::string::ToString;
|
|
|
|
use unicode_width::UnicodeWidthStr;
|
|
|
|
|
2022-01-18 06:15:51 -06:00
|
|
|
use {
|
|
|
|
ab_glyph::{Font, FontRef, Glyph},
|
|
|
|
vga::{
|
|
|
|
colors::Color16,
|
|
|
|
writers::{Graphics640x480x16, GraphicsWriter},
|
|
|
|
},
|
2022-01-13 08:54:33 -06:00
|
|
|
};
|
2022-01-07 10:31:47 -06:00
|
|
|
|
2022-01-16 14:55:58 -06:00
|
|
|
lazy_static::lazy_static! {
|
|
|
|
pub static ref VGAE: spin::Mutex<Graphics640x480x16> = {
|
|
|
|
let xyz = Graphics640x480x16::new();
|
|
|
|
xyz.set_mode();
|
|
|
|
spin::Mutex::new(xyz)
|
|
|
|
};
|
2022-01-18 06:15:51 -06:00
|
|
|
pub static ref VGAE_BUFF_OFFSET_X: spin::Mutex<u8> = spin::Mutex::new(0);
|
|
|
|
pub static ref VGAE_BUFF_OFFSET_Y: spin::Mutex<u8> = spin::Mutex::new(0);
|
2022-01-16 14:55:58 -06:00
|
|
|
}
|
|
|
|
|
2022-01-07 10:31:47 -06:00
|
|
|
pub trait GraphicsAPI {
|
2022-01-13 08:54:33 -06:00
|
|
|
fn add_shader() {}
|
2022-01-07 10:31:47 -06:00
|
|
|
}
|
|
|
|
|
2022-01-18 08:30:09 -06:00
|
|
|
pub fn draw_char(previous_character: Option<char>, character: char, _offset: usize) {
|
2022-01-16 14:55:58 -06:00
|
|
|
let mode = *VGAE.lock();
|
2022-01-18 06:15:51 -06:00
|
|
|
let mut offset_x = VGAE_BUFF_OFFSET_X.lock();
|
|
|
|
let mut offset_y = VGAE_BUFF_OFFSET_Y.lock();
|
|
|
|
|
|
|
|
if *offset_x == 39 {
|
|
|
|
*offset_x = 0;
|
|
|
|
*offset_y += 1;
|
|
|
|
}
|
2022-01-16 09:23:19 -06:00
|
|
|
|
2022-01-16 19:42:11 -06:00
|
|
|
let font = FontRef::try_from_slice(include_bytes!(
|
2022-01-18 06:15:51 -06:00
|
|
|
"../../ableos/assets/fonts/unifont-14.0.01.ttf"
|
2022-01-16 19:42:11 -06:00
|
|
|
))
|
|
|
|
.unwrap();
|
2022-01-16 09:23:19 -06:00
|
|
|
|
2022-01-18 06:15:51 -06:00
|
|
|
let font2 = FontRef::try_from_slice(include_bytes!(
|
2022-01-18 08:30:09 -06:00
|
|
|
"../../ableos/assets/fonts/unifont_upper-14.0.01.ttf" // "../../ableos/assets/fonts/OpenSansEmoji.ttf"
|
2022-01-18 06:15:51 -06:00
|
|
|
))
|
|
|
|
.unwrap();
|
|
|
|
|
|
|
|
let mut has_char = false;
|
|
|
|
for x in font.codepoint_ids() {
|
|
|
|
if x.1 == character {
|
|
|
|
has_char = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
let used_font;
|
|
|
|
match has_char {
|
|
|
|
true => used_font = font,
|
|
|
|
false => used_font = font2,
|
|
|
|
}
|
|
|
|
|
|
|
|
let font_scale = 1.6;
|
|
|
|
|
|
|
|
match character {
|
|
|
|
'\n' => {}
|
|
|
|
_ => {
|
2022-01-18 08:30:09 -06:00
|
|
|
let previous_glyph: Glyph = used_font
|
|
|
|
.glyph_id(previous_character.unwrap_or(' '))
|
|
|
|
.with_scale_and_position(
|
|
|
|
20.0 * font_scale,
|
|
|
|
ab_glyph::point(
|
|
|
|
*offset_x as f32 * (10.0 * font_scale),
|
|
|
|
*offset_y as f32 + (18.0 * font_scale),
|
|
|
|
),
|
|
|
|
);
|
|
|
|
|
|
|
|
let mut q_glyph: Glyph = used_font.glyph_id(character).with_scale_and_position(
|
2022-01-18 06:15:51 -06:00
|
|
|
20.0 * font_scale,
|
|
|
|
ab_glyph::point(
|
|
|
|
*offset_x as f32 * (10.0 * font_scale),
|
|
|
|
*offset_y as f32 + (18.0 * font_scale),
|
|
|
|
),
|
|
|
|
);
|
2022-01-18 08:30:09 -06:00
|
|
|
{
|
|
|
|
// figure it our latter bruh
|
|
|
|
let spacing = used_font.kern_unscaled(previous_glyph.id, q_glyph.id);
|
|
|
|
info!("{spacing} {:?} {:?}", previous_glyph.id, q_glyph.id);
|
|
|
|
q_glyph.position.x += spacing * font_scale;
|
|
|
|
}
|
|
|
|
|
2022-01-18 06:15:51 -06:00
|
|
|
if let Some(q) = used_font.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,
|
|
|
|
Color16::Green,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
});
|
2022-01-16 14:55:58 -06:00
|
|
|
}
|
2022-01-18 06:15:51 -06:00
|
|
|
|
|
|
|
*offset_x += 1;
|
|
|
|
}
|
2022-01-16 09:23:19 -06:00
|
|
|
}
|
|
|
|
}
|
2022-01-18 08:30:09 -06:00
|
|
|
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,
|
|
|
|
}
|
|
|
|
}
|