Skip to content

Commit 2cb3a8f

Browse files
committed
fb/logger: bump noto-sans-mono-bitmap + improvements
1 parent 515a7ec commit 2cb3a8f

File tree

3 files changed

+72
-33
lines changed

3 files changed

+72
-33
lines changed

Cargo.lock

Lines changed: 1 addition & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -56,17 +56,24 @@ rand = { version = "0.8.4", optional = true, default-features = false }
5656
rand_chacha = { version = "0.3.1", optional = true, default-features = false }
5757

5858
[dependencies.noto-sans-mono-bitmap]
59-
version = "0.1.2"
59+
path = "../noto-sans-mono-bitmap"
6060
default-features = false
61-
features = ["regular", "size_14"]
61+
features = [
62+
"regular",
63+
"size_16",
64+
"unicode-basic-latin",
65+
"unicode-latin-1-supplement",
66+
"unicode-latin-extended-a",
67+
"unicode-specials"
68+
]
6269
optional = true
6370

6471
[build-dependencies]
6572
llvm-tools-build = { version = "0.1", optional = true, package = "llvm-tools" }
6673
toml = { version = "0.5.1", optional = true }
67-
serde = { version = "1.0", features = ["derive"], optional = true}
68-
quote = { version = "1.0", optional = true}
69-
proc-macro2 = { version = "1.0", optional = true}
74+
serde = { version = "1.0", features = ["derive"], optional = true }
75+
quote = { version = "1.0", optional = true }
76+
proc-macro2 = { version = "1.0", optional = true }
7077

7178
[features]
7279
default = []
@@ -94,6 +101,6 @@ default-target = "x86_64-unknown-linux-gnu"
94101
[package.metadata.release]
95102
dev-version = false
96103
pre-release-replacements = [
97-
{ file="Changelog.md", search="# Unreleased", replace="# Unreleased\n\n# {{version}} – {{date}}", exactly=1 },
104+
{ file = "Changelog.md", search = "# Unreleased", replace = "# Unreleased\n\n# {{version}} – {{date}}", exactly = 1 },
98105
]
99106
pre-release-commit-message = "Release version {{version}}"

src/binary/logger.rs

Lines changed: 58 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1+
use crate::binary::logger::font_constants::BACKUP_CHAR;
12
use crate::boot_info::{FrameBufferInfo, PixelFormat};
23
use conquer_once::spin::OnceCell;
34
use core::{
45
fmt::{self, Write},
56
ptr,
67
};
7-
use noto_sans_mono_bitmap::{get_bitmap, get_bitmap_width, BitmapChar, BitmapHeight, FontWeight};
8+
use noto_sans_mono_bitmap::{
9+
get_raster, get_raster_width, FontWeight, RasterHeight, RasterizedChar,
10+
};
811
use spinning_top::Spinlock;
912

1013
/// The global logger instance used for the `log` crate.
@@ -14,9 +17,41 @@ pub static LOGGER: OnceCell<LockedLogger> = OnceCell::uninit();
1417
pub struct LockedLogger(Spinlock<Logger>);
1518

1619
/// Additional vertical space between lines
17-
const LINE_SPACING: usize = 0;
18-
/// Additional vertical space between separate log messages
19-
const LOG_SPACING: usize = 2;
20+
const LINE_SPACING: usize = 2;
21+
/// Additional horizontal space between characters.
22+
const LETTER_SPACING: usize = 0;
23+
24+
/// Padding from the border. Prevent that font is too close to border.
25+
const BORDER_PADDING: usize = 1;
26+
27+
/// Constants for the usage of the [`noto_sans_mono_bitmap`] crate.
28+
mod font_constants {
29+
use super::*;
30+
31+
/// Height of each char raster. The font size is ~0.84% of this. Thus, this is the line height that
32+
/// enables multiple characters to be side-by-side and appear optically in one line in a natural way.
33+
pub const CHAR_RASTER_HEIGHT: RasterHeight = RasterHeight::Size16;
34+
35+
/// The width of each single symbol of the mono space font.
36+
pub const CHAR_RASTER_WIDTH: usize = get_raster_width(FontWeight::Regular, CHAR_RASTER_HEIGHT);
37+
38+
/// Requires feature "unicode-specials"
39+
pub const BACKUP_CHAR: char = '�';
40+
41+
pub const FONT_WEIGHT: FontWeight = FontWeight::Regular;
42+
}
43+
44+
/// Returns the raster of the given char or the raster of [`font_constants::BACKUP_CHAR`].
45+
fn get_char_raster(c: char) -> RasterizedChar {
46+
fn get(c: char) -> Option<RasterizedChar> {
47+
get_raster(
48+
c,
49+
font_constants::FONT_WEIGHT,
50+
font_constants::CHAR_RASTER_HEIGHT,
51+
)
52+
}
53+
get(c).unwrap_or(get(BACKUP_CHAR).expect("Should get raster of backup char."))
54+
}
2055

2156
impl LockedLogger {
2257
/// Create a new instance that logs to the given framebuffer.
@@ -39,8 +74,7 @@ impl log::Log for LockedLogger {
3974

4075
fn log(&self, record: &log::Record) {
4176
let mut logger = self.0.lock();
42-
writeln!(logger, "{}: {}", record.level(), record.args()).unwrap();
43-
logger.add_vspace(LOG_SPACING);
77+
writeln!(logger, "{:5}: {}", record.level(), record.args()).unwrap();
4478
}
4579

4680
fn flush(&self) {}
@@ -68,22 +102,18 @@ impl Logger {
68102
}
69103

70104
fn newline(&mut self) {
71-
self.y_pos += 14 + LINE_SPACING;
105+
self.y_pos += font_constants::CHAR_RASTER_HEIGHT.val() + LINE_SPACING;
72106
self.carriage_return()
73107
}
74108

75-
fn add_vspace(&mut self, space: usize) {
76-
self.y_pos += space;
77-
}
78-
79109
fn carriage_return(&mut self) {
80-
self.x_pos = 0;
110+
self.x_pos = BORDER_PADDING;
81111
}
82112

83-
/// Erases all text on the screen.
113+
/// Erases all text on the screen. Resets `self.x_pos` and `self.y_pos`.
84114
pub fn clear(&mut self) {
85-
self.x_pos = 0;
86-
self.y_pos = 0;
115+
self.x_pos = BORDER_PADDING;
116+
self.y_pos = BORDER_PADDING;
87117
self.framebuffer.fill(0);
88118
}
89119

@@ -95,32 +125,36 @@ impl Logger {
95125
self.info.vertical_resolution
96126
}
97127

128+
/// Writes a single char to the framebuffer. Takes care of special control characters, such as
129+
/// newlines and carriage returns.
98130
fn write_char(&mut self, c: char) {
99131
match c {
100132
'\n' => self.newline(),
101133
'\r' => self.carriage_return(),
102134
c => {
103-
if self.x_pos >= self.width() {
135+
let new_xpos = self.x_pos + font_constants::CHAR_RASTER_WIDTH;
136+
if new_xpos >= self.width() {
104137
self.newline();
105138
}
106-
const BITMAP_LETTER_WIDTH: usize =
107-
get_bitmap_width(FontWeight::Regular, BitmapHeight::Size14);
108-
if self.y_pos >= (self.height() - BITMAP_LETTER_WIDTH) {
139+
let new_ypos =
140+
self.y_pos + font_constants::CHAR_RASTER_HEIGHT.val() + BORDER_PADDING;
141+
if new_ypos >= self.height() {
109142
self.clear();
110143
}
111-
let bitmap_char = get_bitmap(c, FontWeight::Regular, BitmapHeight::Size14).unwrap();
112-
self.write_rendered_char(bitmap_char);
144+
self.write_rendered_char(get_char_raster(c));
113145
}
114146
}
115147
}
116148

117-
fn write_rendered_char(&mut self, rendered_char: BitmapChar) {
118-
for (y, row) in rendered_char.bitmap().iter().enumerate() {
149+
/// Prints a rendered char into the framebuffer.
150+
/// Updates `self.x_pos`.
151+
fn write_rendered_char(&mut self, rendered_char: RasterizedChar) {
152+
for (y, row) in rendered_char.raster().iter().enumerate() {
119153
for (x, byte) in row.iter().enumerate() {
120154
self.write_pixel(self.x_pos + x, self.y_pos + y, *byte);
121155
}
122156
}
123-
self.x_pos += rendered_char.width();
157+
self.x_pos += rendered_char.width() + LETTER_SPACING;
124158
}
125159

126160
fn write_pixel(&mut self, x: usize, y: usize, intensity: u8) {

0 commit comments

Comments
 (0)