use crate::{
primitives::{Size, geometry::Rectangle},
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) -> Option<Rectangle>;
fn default_line_height(&self) -> u32;
fn advance(&self, character: char) -> u32;
fn maximum_character_size(&self) -> Size;
}
impl<T: FontMetrics> FontMetrics for &T {
fn rendered_size(&self, character: char) -> Option<Rectangle> {
(*self).rendered_size(character)
}
fn default_line_height(&self) -> u32 {
(*self).default_line_height()
}
fn advance(&self, character: char) -> u32 {
(*self).advance(character)
}
fn maximum_character_size(&self) -> Size {
(*self).maximum_character_size()
}
}