use crate::*;
#[cfg(feature = "alloc")]
pub struct FontBuf {
pub(crate) raw: alloc::boxed::Box<[u8]>,
}
#[cfg(feature = "alloc")]
impl Font for FontBuf {
unsafe fn as_bytes(&self) -> &[u8] {
&self.raw
}
}
#[cfg(feature = "alloc")]
impl From<FileBuf> for FontBuf {
fn from(value: FileBuf) -> Self {
Self { raw: value.raw }
}
}
pub struct FontRef<'a> {
raw: &'a [u8],
}
impl Font for FontRef<'_> {
unsafe fn as_bytes(&self) -> &[u8] {
self.raw
}
}
impl<'a> From<FileRef<'a>> for FontRef<'a> {
fn from(value: FileRef<'a>) -> Self {
Self { raw: value.raw }
}
}
pub trait Font {
unsafe fn as_bytes(&self) -> &[u8];
#[must_use]
fn is_ascii(&self) -> bool {
let raw = unsafe { self.as_bytes() };
raw[1] == 0
}
#[must_use]
fn line_width_ascii(&self, t: &str) -> u32 {
t.len() as u32 * u32::from(self.char_width())
}
#[must_use]
fn line_width_utf8(&self, t: &str) -> u32 {
t.chars().count() as u32 * u32::from(self.char_width())
}
#[must_use]
fn char_width(&self) -> u8 {
let raw = unsafe { self.as_bytes() };
raw[2]
}
#[must_use]
fn char_height(&self) -> u8 {
let raw = unsafe { self.as_bytes() };
raw[3]
}
#[must_use]
fn baseline(&self) -> u8 {
let raw = unsafe { self.as_bytes() };
raw[4]
}
}