use alloc::vec::Vec;
use denise::Size;
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct FontId(pub u16);
impl FontId {
pub const DEFAULT: Self = Self(0);
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct GlyphId(pub u32);
impl GlyphId {
#[inline]
pub const fn from_char(ch: char) -> Self {
Self(ch as u32)
}
#[inline]
pub const fn as_char(self) -> Option<char> {
char::from_u32(self.0)
}
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub struct ShapedGlyph {
pub id: GlyphId,
pub x: i32,
pub y: i32,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub struct FontMetrics {
pub ascent: i32,
pub descent: i32,
pub line_gap: i32,
}
impl FontMetrics {
#[inline]
pub const fn line_height(&self) -> i32 {
self.ascent + self.descent + self.line_gap
}
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub struct GlyphMetrics {
pub advance: i32,
pub bearing_x: i32,
pub bearing_y: i32,
pub size: Size,
}
impl GlyphMetrics {
#[inline]
pub const fn is_blank(&self) -> bool {
self.size.width == 0 || self.size.height == 0
}
}
#[derive(Clone, Copy, Debug)]
pub struct Rasterised<'a> {
pub metrics: GlyphMetrics,
pub coverage: &'a [u8],
pub stride: usize,
}
pub trait GlyphSource {
fn name(&self) -> &str;
fn metrics(&self, size_px: u16) -> FontMetrics;
fn glyph_id(&self, ch: char) -> Option<GlyphId> {
self.contains(ch).then(|| GlyphId::from_char(ch))
}
fn glyph_metrics(&mut self, glyph: GlyphId, size_px: u16) -> Option<GlyphMetrics>;
fn rasterise(&mut self, glyph: GlyphId, size_px: u16) -> Option<Rasterised<'_>>;
fn shape(&mut self, text: &str, size_px: u16, out: &mut Vec<ShapedGlyph>) -> i32 {
let _ = (text, size_px, out);
0
}
fn can_shape(&self) -> bool {
false
}
fn fallback_id(&self, ch: char) -> Option<GlyphId> {
let _ = ch;
None
}
fn contains(&self, ch: char) -> bool;
fn snap_size(&self, size_px: u16) -> u16 {
size_px
}
}