use crate::{primitives::Size, surface::Surface};
mod character_buffer_font;
pub use character_buffer_font::CharacterBufferFont;
#[cfg(feature = "embedded-graphics")]
mod embedded_mono_font;
#[cfg(feature = "embedded-graphics")]
mod u8g2;
pub trait Font {
fn metrics(&self) -> impl FontMetrics;
}
pub(crate) trait Sealed {}
#[expect(private_bounds)]
pub trait FontRender<Color>: Font + Sealed {
fn draw(&self, character: char, color: Color, surface: &mut impl Surface<Color = Color>);
}
pub trait FontMetrics {
fn rendered_size(&self, character: char) -> Size;
fn default_line_height(&self) -> u32;
fn advance(&self, character: char) -> u32;
fn baseline(&self) -> u32;
fn str_width(&self, text: &str) -> u32 {
text.chars().map(|c| self.advance(c)).sum()
}
}
impl<T: FontMetrics> FontMetrics for &T {
fn rendered_size(&self, character: char) -> Size {
(*self).rendered_size(character)
}
fn default_line_height(&self) -> u32 {
(*self).default_line_height()
}
fn advance(&self, character: char) -> u32 {
(*self).advance(character)
}
fn baseline(&self) -> u32 {
(*self).baseline()
}
fn str_width(&self, text: &str) -> u32 {
(*self).str_width(text)
}
}