use rust_fontconfig::*;
fn load(cache: &FcFontCache, path: &str, id: &str) {
match std::fs::read(path) {
Ok(bytes) => {
if let Some(parsed) = FcParseFontBytes(&bytes, id) {
for (p, _) in &parsed {
println!(
" registered {:<22} family={:?} name={:?} ranges={}",
id, p.family, p.name, p.unicode_ranges.len()
);
}
cache.with_memory_fonts(parsed);
} else {
println!(" FAILED to parse {}", path);
}
}
Err(e) => println!(" MISSING {} ({e})", path),
}
}
fn main() {
let cache = FcFontCache::default();
println!("Registering memory fonts:");
load(&cache, "/home/fs/Development/printpdf/examples/assets/fonts/NotoSansJP-Regular.otf", "NotoSansJP");
load(&cache, "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", "DejaVuSans");
load(&cache, "/usr/share/fonts/truetype/noto/NotoSans-Regular.ttf", "NotoSans");
for (label, w) in [("REGULAR", FcWeight::Normal), ("BOLD", FcWeight::Bold)] {
let mut trace = Vec::new();
let chain = cache.resolve_font_chain(
&["sans-serif".to_string()],
w, PatternMatch::False, PatternMatch::False, &mut trace,
);
println!("\n=== sans-serif {} ===", label);
for g in &chain.css_fallbacks {
print!(" group '{}':", g.css_name);
for fm in g.fonts.iter().take(3) {
let fam = cache.get_metadata_by_id(&fm.id).and_then(|m| m.family.clone()).unwrap_or_default();
let nm = cache.get_metadata_by_id(&fm.id).and_then(|m| m.name.clone()).unwrap_or_default();
print!(" [{}|{}]", fam, nm);
}
println!();
}
match chain.resolve_char(&cache, 'E') {
Some((id, src)) => {
let fam = cache.get_metadata_by_id(&id).and_then(|m| m.family.clone()).unwrap_or_default();
let nm = cache.get_metadata_by_id(&id).and_then(|m| m.name.clone()).unwrap_or_default();
let verdict = if fam.to_lowercase().contains("jp") || nm.to_lowercase().contains("jp") {
">>> BUG: 'E' resolved to the CJK megafont"
} else {
">>> OK: 'E' resolved to a Latin face"
};
println!(" {} — family='{}' name='{}' via '{}'", verdict, fam, nm, src);
}
None => println!(" >>> 'E' resolves to: NONE"),
}
}
}