use std::path::Path;
use std::sync::Arc;
use typst_kit::fonts::{FontStore, embedded, scan, system};
#[derive(Clone)]
pub struct SharedFonts {
pub(crate) store: Arc<FontStore>,
}
impl SharedFonts {
#[must_use]
pub fn new() -> Self {
let mut store = FontStore::new();
store.extend(system());
store.extend(embedded());
Self {
store: Arc::new(store),
}
}
#[must_use]
pub fn with_extra_dirs<I, P>(dirs: I) -> Self
where
I: IntoIterator<Item = P>,
P: AsRef<Path>,
{
let mut store = FontStore::new();
store.extend(system());
for dir in dirs {
store.extend(scan(dir.as_ref()));
}
store.extend(embedded());
Self {
store: Arc::new(store),
}
}
#[must_use]
pub fn embedded_only() -> Self {
let mut store = FontStore::new();
store.extend(embedded());
Self {
store: Arc::new(store),
}
}
#[allow(unused_variables)]
pub fn warm_up(&self) {
let template = crate::TemplateSource::InMemory {
content: " ".to_owned(),
root: None,
};
let data = crate::DataSet::new();
#[cfg(feature = "pdf")]
let _ = crate::render_pdf(self, template, data, &crate::PdfConfig::default());
#[cfg(all(not(feature = "pdf"), feature = "html"))]
let _ = crate::render_html(self, template, data, &crate::HtmlConfig::default());
}
}
impl Default for SharedFonts {
fn default() -> Self {
Self::new()
}
}