forked from AbleOS/ableos
75 lines
1.3 KiB
Plaintext
75 lines
1.3 KiB
Plaintext
|
.{log} := @use("../../stn/src/lib.hb")
|
||
|
|
||
|
PSF1Header := packed struct {
|
||
|
magic: u16,
|
||
|
font_mode: u8,
|
||
|
character_size: u8,
|
||
|
}
|
||
|
|
||
|
PSF2Header := packed struct {
|
||
|
magic: u32,
|
||
|
version: u32,
|
||
|
header_size: u32,
|
||
|
flags: u32,
|
||
|
num_glyph: u32,
|
||
|
bytes_per_glyph: u32,
|
||
|
height: u32,
|
||
|
width: u32,
|
||
|
}
|
||
|
|
||
|
Font := struct {
|
||
|
data: ^u8,
|
||
|
width: uint,
|
||
|
height: uint,
|
||
|
num_glyphs: uint,
|
||
|
bytes_per_glyph: uint,
|
||
|
has_unicode_table: bool,
|
||
|
line_gap: uint,
|
||
|
char_gap: uint,
|
||
|
}
|
||
|
|
||
|
font_from_psf1 := fn(psf: ^u8): Font {
|
||
|
header := @as(^PSF1Header, @bitcast(psf))
|
||
|
if header.magic != 0x436 {
|
||
|
log.error("failed to load psf font: not a psf1 font, idiot\0")
|
||
|
return idk
|
||
|
}
|
||
|
|
||
|
psf += @sizeof(PSF1Header)
|
||
|
|
||
|
return .(
|
||
|
psf,
|
||
|
8,
|
||
|
@intcast(header.character_size),
|
||
|
256,
|
||
|
@intcast(header.character_size),
|
||
|
false,
|
||
|
0,
|
||
|
0,
|
||
|
)
|
||
|
}
|
||
|
|
||
|
font_from_psf2 := fn(psf: ^u8): Font {
|
||
|
header := @as(^PSF2Header, @bitcast(psf))
|
||
|
if header.magic != 0x864AB572 {
|
||
|
log.error("failed to load psf font: not a psf2 font, idiot\0")
|
||
|
return idk
|
||
|
}
|
||
|
|
||
|
psf += header.header_size
|
||
|
|
||
|
return .(
|
||
|
psf,
|
||
|
@intcast(header.width),
|
||
|
@intcast(header.height),
|
||
|
@intcast(header.num_glyph),
|
||
|
@intcast(header.bytes_per_glyph),
|
||
|
(header.flags & 1) != 0,
|
||
|
0,
|
||
|
0,
|
||
|
)
|
||
|
}
|
||
|
|
||
|
get_glyph := fn(font: Font, index: uint): ^u8 {
|
||
|
return font.data + index * font.bytes_per_glyph
|
||
|
}
|