#[must_use]
pub fn apply_font(data: &'static [u8]) -> iced::Font {
let family = extract_family_name(data);
let mut fs = iced_graphics::text::font_system()
.write()
.expect("font system lock");
let v_before = fs.version();
fs.load_font(std::borrow::Cow::Borrowed(data));
let v_after = fs.version();
log::debug!(
"[truce-iced] font loaded: family={family:?}, {} bytes, version {v_before:?}->{v_after:?}",
data.len()
);
drop(fs);
match family {
Some(name) => iced::Font {
family: iced::font::Family::Name(Box::leak(name.into_boxed_str())),
..iced::Font::DEFAULT
},
None => iced::Font::DEFAULT,
}
}
fn extract_family_name(data: &[u8]) -> Option<String> {
let face = ttf_parser::Face::parse(data, 0).ok()?;
let names = face.names();
for id in [16u16, 1] {
for i in 0..names.len() {
let n = names.get(i)?;
if n.name_id == id
&& let Some(s) = n.to_string()
{
return Some(s);
}
}
}
None
}