use crate::primitives::geometry::Rectangle;
use crate::surface::AsDrawTarget as _;
use embedded_graphics::Drawable;
use embedded_graphics::mono_font::MonoFont;
use embedded_graphics::{
mono_font::MonoTextStyleBuilder,
prelude::{PixelColor, Point as EgPoint},
text::Text,
};
use crate::primitives::{Point, Size};
use crate::surface::Surface;
use super::{Font, FontMetrics, FontRender};
impl Font for MonoFont<'_> {
fn metrics(&self) -> impl FontMetrics {
MonoFontMetrics {
size: self.character_size.into(),
baseline: self.baseline,
advance: self.character_spacing + self.character_size.width,
}
}
}
impl crate::font::Sealed for MonoFont<'_> {}
impl<C: PixelColor> FontRender<C> for MonoFont<'_> {
fn draw(&self, character: char, color: C, surface: &mut impl Surface<Color = C>) {
let mut s = heapless::String::<1>::new();
_ = s.push(character);
let style = MonoTextStyleBuilder::new()
.font(self)
.text_color(color)
.build();
let mut point = EgPoint::zero();
point.y += self.baseline as i32;
_ = Text::new(&s, point, style).draw(&mut surface.draw_target());
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
struct MonoFontMetrics {
size: Size,
baseline: u32,
advance: u32,
}
impl FontMetrics for MonoFontMetrics {
fn rendered_size(&self, _: char) -> Option<Rectangle> {
Some(Rectangle::new(Point::zero(), self.size))
}
fn default_line_height(&self) -> u32 {
self.size.height
}
fn advance(&self, _: char) -> u32 {
self.advance
}
fn maximum_character_size(&self) -> Size {
self.size
}
}