use services_core::AppPathsProvider;
#[derive(Clone, Default)]
pub struct FontSetup {
pub paths: Vec<std::path::PathBuf>,
pub data: Vec<Vec<u8>>,
pub family: Option<String>,
}
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(fonts: FontSetup) -> renderer_text::TextShaperConfig {
build_hardware_font_config(
fonts,
&SystemFonts {
dir: None,
sans_serif: Vec::new(),
},
)
}
#[cfg(feature = "hardware")]
pub(super) fn build_hardware_font_config(
fonts: FontSetup,
system: &SystemFonts,
) -> renderer_text::TextShaperConfig {
renderer_text::TextShaperConfig {
font: build_font_config(fonts, system),
..renderer_text::TextShaperConfig::default()
}
}
pub(super) fn build_font_config(
fonts: FontSetup,
system: &SystemFonts,
) -> renderer_core::FontConfig {
let sans_serif_family_candidates = fonts
.family
.into_iter()
.chain(system.sans_serif.iter().cloned())
.collect();
renderer_core::FontConfig {
extra_font_paths: fonts.paths,
font_data: fonts.data,
system_fonts_dir: system.dir.clone(),
sans_serif_family_candidates,
}
}
#[cfg(feature = "software")]
pub(super) fn build_software_renderer_config(
fonts: FontSetup,
system: &SystemFonts,
transparent: bool,
) -> renderer_software::SoftwareRendererConfig {
renderer_software::SoftwareRendererConfig {
font: build_font_config(fonts, system),
transparent,
..renderer_software::SoftwareRendererConfig::default()
}
}