use std::sync::RwLock;
use services_core::AppPathsProvider;
static DEFAULT_FONT_FAMILY: RwLock<Option<String>> = RwLock::new(None);
pub fn set_default_font_family(family: Option<String>) {
*DEFAULT_FONT_FAMILY.write().unwrap() = family;
}
fn default_font_family() -> Option<String> {
DEFAULT_FONT_FAMILY.read().unwrap().clone()
}
pub(super) struct SystemFonts {
dir: Option<std::path::PathBuf>,
sans_serif: Vec<String>,
}
impl SystemFonts {
pub(super) fn from_provider(paths: &dyn AppPathsProvider) -> Self {
Self {
dir: paths.system_fonts_dir(),
sans_serif: paths.sans_serif_candidates(),
}
}
}
#[cfg(feature = "hardware")]
pub(super) fn hardware_cache_path(
app_name: &str,
paths: &dyn AppPathsProvider,
) -> Option<std::path::PathBuf> {
paths.cache_dir().map(|d| d.join("telar").join(app_name))
}
#[cfg(feature = "hardware")]
pub(crate) fn offscreen_hardware_font_config(
font_paths: Vec<std::path::PathBuf>,
font_data: Vec<Vec<u8>>,
) -> renderer_text::TextShaperConfig {
build_hardware_font_config(
font_paths,
font_data,
&SystemFonts {
dir: None,
sans_serif: Vec::new(),
},
)
}
#[cfg(feature = "hardware")]
pub(super) fn build_hardware_font_config(
font_paths: Vec<std::path::PathBuf>,
font_data: Vec<Vec<u8>>,
fonts: &SystemFonts,
) -> renderer_text::TextShaperConfig {
renderer_text::TextShaperConfig {
font: build_font_config(font_paths, font_data, fonts),
..renderer_text::TextShaperConfig::default()
}
}
pub(super) fn build_font_config(
font_paths: Vec<std::path::PathBuf>,
font_data: Vec<Vec<u8>>,
fonts: &SystemFonts,
) -> renderer_core::FontConfig {
let sans_serif_family_candidates = default_font_family()
.into_iter()
.chain(fonts.sans_serif.iter().cloned())
.collect();
renderer_core::FontConfig {
extra_font_paths: font_paths,
font_data,
system_fonts_dir: fonts.dir.clone(),
sans_serif_family_candidates,
}
}
#[cfg(feature = "software")]
pub(super) fn build_software_renderer_config(
font_paths: Vec<std::path::PathBuf>,
font_data: Vec<Vec<u8>>,
fonts: &SystemFonts,
transparent: bool,
) -> renderer_software::SoftwareRendererConfig {
renderer_software::SoftwareRendererConfig {
font: build_font_config(font_paths, font_data, fonts),
transparent,
..renderer_software::SoftwareRendererConfig::default()
}
}