From ed35368d94de4a1a51cdb83e606d56429c19459f Mon Sep 17 00:00:00 2001 From: Philipp Schuster Date: Wed, 19 Jan 2022 19:51:58 +0100 Subject: [PATCH] nicer font rendering into framebuffer --- Cargo.lock | 14 +++++++------- Cargo.toml | 8 ++++---- src/binary/logger.rs | 25 ++++++++++++------------- 3 files changed, 23 insertions(+), 24 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 97750450..d43857b2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -65,11 +65,11 @@ dependencies = [ "conquer-once", "displaydoc", "fatfs", - "font8x8", "gpt", "json", "llvm-tools", "log", + "noto-sans-mono-bitmap", "proc-macro2", "quote", "rsdp", @@ -170,12 +170,6 @@ dependencies = [ "log", ] -[[package]] -name = "font8x8" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e63201c624b8c8883921b1a1accc8916c4fa9dbfb15d122b26e4dde945b86bbf" - [[package]] name = "getrandom" version = "0.2.3" @@ -253,6 +247,12 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "noto-sans-mono-bitmap" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5e9cd9598c6cc63547a44c3075b682d37175f3fb4508d3f7fe604ddad6d805" + [[package]] name = "num-integer" version = "0.1.44" diff --git a/Cargo.toml b/Cargo.toml index 99f934e9..27ba872c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -52,10 +52,10 @@ rsdp = { version = "1.0.0", optional = true } fatfs = { version = "0.3.4", optional = true } gpt = { version = "2.0.0", optional = true } -[dependencies.font8x8] -version = "0.2.5" +[dependencies.noto-sans-mono-bitmap] +version = "0.1.2" default-features = false -features = ["unicode"] +features = ["regular", "size_14"] optional = true [build-dependencies] @@ -72,7 +72,7 @@ bios_bin = ["binary", "rsdp"] uefi_bin = ["binary", "uefi"] binary = [ "llvm-tools-build", "x86_64", "toml", "xmas-elf", "usize_conversions", "log", "conquer-once", - "spinning_top", "serde", "font8x8", "quote", "proc-macro2", + "spinning_top", "serde", "noto-sans-mono-bitmap", "quote", "proc-macro2", ] [profile.dev] diff --git a/src/binary/logger.rs b/src/binary/logger.rs index ffb72651..b5ea78f5 100644 --- a/src/binary/logger.rs +++ b/src/binary/logger.rs @@ -4,7 +4,7 @@ use core::{ fmt::{self, Write}, ptr, }; -use font8x8::UnicodeFonts; +use noto_sans_mono_bitmap::{get_bitmap, get_bitmap_width, BitmapChar, BitmapHeight, FontWeight}; use spinning_top::Spinlock; /// The global logger instance used for the `log` crate. @@ -68,7 +68,7 @@ impl Logger { } fn newline(&mut self) { - self.y_pos += 8 + LINE_SPACING; + self.y_pos += 14 + LINE_SPACING; self.carriage_return() } @@ -103,25 +103,24 @@ impl Logger { if self.x_pos >= self.width() { self.newline(); } - if self.y_pos >= (self.height() - 8) { + const BITMAP_LETTER_WIDTH: usize = + get_bitmap_width(FontWeight::Regular, BitmapHeight::Size14); + if self.y_pos >= (self.height() - BITMAP_LETTER_WIDTH) { self.clear(); } - let rendered = font8x8::BASIC_FONTS - .get(c) - .expect("character not found in basic font"); - self.write_rendered_char(rendered); + let bitmap_char = get_bitmap(c, FontWeight::Regular, BitmapHeight::Size14).unwrap(); + self.write_rendered_char(bitmap_char); } } } - fn write_rendered_char(&mut self, rendered_char: [u8; 8]) { - for (y, byte) in rendered_char.iter().enumerate() { - for (x, bit) in (0..8).enumerate() { - let alpha = if *byte & (1 << bit) == 0 { 0 } else { 255 }; - self.write_pixel(self.x_pos + x, self.y_pos + y, alpha); + fn write_rendered_char(&mut self, rendered_char: BitmapChar) { + for (y, row) in rendered_char.bitmap().iter().enumerate() { + for (x, byte) in row.iter().enumerate() { + self.write_pixel(self.x_pos + x, self.y_pos + y, *byte); } } - self.x_pos += 8; + self.x_pos += rendered_char.width(); } fn write_pixel(&mut self, x: usize, y: usize, intensity: u8) {