use ttf_parser::Face;
#[derive(Debug, Clone)]
pub struct FontMetrics {
pub ascender: f32,
pub descender: f32,
pub line_gap: f32,
pub units_per_em: f32,
pub uses_os2: bool,
}
impl FontMetrics {
pub fn from_face(face: &Face) -> Self {
let units_per_em = face.units_per_em() as f32;
if let Some(os2) = face.tables().os2 {
let win_ascender = os2.windows_ascender();
if win_ascender != 0 {
return FontMetrics {
ascender: f32::from(win_ascender.abs()),
descender: -f32::from(os2.windows_descender().abs()),
line_gap: 0.0, units_per_em,
uses_os2: true,
};
}
}
let ascender = face.ascender() as f32;
let descender = face.descender() as f32;
let line_gap = face.line_gap() as f32;
FontMetrics {
ascender,
descender,
line_gap,
units_per_em,
uses_os2: false,
}
}
pub fn line_height(&self, font_size: f32) -> f32 {
font_size
}
pub fn baseline(&self, font_size: f32) -> f32 {
let scale = font_size / self.units_per_em;
self.ascender * scale
}
pub fn apply_spacing(advance: f32, spacing: f32, _font_size: f32) -> f32 {
advance + spacing
}
}