use std::sync::Arc;
use cranpose_text::{FontFamilyResolver, Typeface};
#[cfg(feature = "embedded-default-font")]
pub const DEFAULT_FONT_BYTES: &[u8] = include_bytes!("../assets/NotoSansMerged.ttf");
pub fn default_typeface() -> Option<Typeface> {
#[cfg(feature = "embedded-default-font")]
{
Typeface::from_bytes(DEFAULT_FONT_BYTES).ok()
}
#[cfg(not(feature = "embedded-default-font"))]
{
None
}
}
#[derive(Clone, Default)]
pub struct TextFonts {
typefaces: Arc<[Typeface]>,
#[cfg(feature = "installed-fonts")]
installed: usize,
}
impl TextFonts {
pub fn new(typefaces: Vec<Typeface>) -> Self {
Self {
typefaces: Arc::from(typefaces),
#[cfg(feature = "installed-fonts")]
installed: 0,
}
}
pub fn from_fonts_or_default(fonts: &[&'static [u8]]) -> Self {
let mut typefaces: Vec<Typeface> = fonts
.iter()
.filter_map(|bytes| Typeface::from_bytes(*bytes).ok())
.collect();
if typefaces.is_empty() {
typefaces.extend(default_typeface());
}
Self::new(typefaces)
}
pub fn typefaces(&self) -> &[Typeface] {
&self.typefaces
}
pub fn resolver(&self) -> FontFamilyResolver {
FontFamilyResolver::new(self.typefaces.iter().cloned())
}
#[cfg(feature = "installed-fonts")]
pub fn with_installed_faces(&self) -> Option<Self> {
if crate::installed_fonts::installed_font_generation() == self.installed {
return None;
}
let installed = crate::installed_fonts::installed_faces();
let own = &self.typefaces[..self.typefaces.len() - self.installed];
let mut typefaces = Vec::with_capacity(own.len() + installed.len());
typefaces.extend_from_slice(own);
typefaces.extend_from_slice(&installed);
Some(Self {
typefaces: Arc::from(typefaces),
installed: installed.len(),
})
}
}