Use system fonts for fallback
This commit is contained in:
parent
59d1b4c38d
commit
a3f36c9b76
4 changed files with 139 additions and 71 deletions
|
|
@ -1,22 +1,71 @@
|
|||
use std::ops::Deref;
|
||||
|
||||
use super::{Font, FontMatches};
|
||||
|
||||
pub struct FontSystem<'a> {
|
||||
fonts: Vec<Font<'a>>,
|
||||
pub struct FontSystem {
|
||||
db: fontdb::Database,
|
||||
}
|
||||
|
||||
impl<'a> FontSystem<'a> {
|
||||
impl FontSystem {
|
||||
pub fn new() -> Self {
|
||||
let mut db = fontdb::Database::new();
|
||||
let now = std::time::Instant::now();
|
||||
db.load_system_fonts();
|
||||
//TODO: configurable default fonts
|
||||
db.set_monospace_family("Fira Mono");
|
||||
db.set_sans_serif_family("Fira Sans");
|
||||
db.set_serif_family("DejaVu Serif");
|
||||
println!(
|
||||
"Loaded {} font faces in {}ms.",
|
||||
db.len(),
|
||||
now.elapsed().as_millis()
|
||||
);
|
||||
|
||||
//TODO only do this on demand!
|
||||
assert_eq!(db.len(), db.faces().len());
|
||||
for i in 0..db.len() {
|
||||
let id = db.faces()[i].id;
|
||||
unsafe {
|
||||
db.make_shared_face_data(id);
|
||||
}
|
||||
}
|
||||
|
||||
Self {
|
||||
fonts: Vec::new(),
|
||||
db,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn add(&mut self, font: Font<'a>) {
|
||||
self.fonts.push(font);
|
||||
}
|
||||
|
||||
pub fn matches(&'a self, patterns: &[&str]) -> Option<FontMatches<'a>> {
|
||||
pub fn matches<'a, F: Fn(&fontdb::FaceInfo) -> bool>(&'a self, f: F) -> Option<FontMatches<'a>> {
|
||||
let mut fonts = Vec::new();
|
||||
for face in self.db.faces() {
|
||||
if ! f(face) {
|
||||
continue;
|
||||
}
|
||||
|
||||
let font_opt = Font::new(
|
||||
match &face.source {
|
||||
fontdb::Source::Binary(data) => {
|
||||
data.deref().as_ref()
|
||||
},
|
||||
fontdb::Source::File(path) => {
|
||||
println!("Unsupported fontdb Source::File('{}')", path.display());
|
||||
continue;
|
||||
},
|
||||
fontdb::Source::SharedFile(_path, data) => {
|
||||
data.deref().as_ref()
|
||||
},
|
||||
},
|
||||
face.index,
|
||||
);
|
||||
|
||||
match font_opt {
|
||||
Some(font) => fonts.push(font),
|
||||
None => {
|
||||
eprintln!("failed to load font '{}'", face.post_script_name);
|
||||
}
|
||||
}
|
||||
}
|
||||
/*
|
||||
for font in self.fonts.iter() {
|
||||
for rec in font.rustybuzz.names() {
|
||||
if rec.name_id == 4 && rec.is_unicode() {
|
||||
|
|
@ -52,6 +101,7 @@ impl<'a> FontSystem<'a> {
|
|||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
if ! fonts.is_empty() {
|
||||
Some(FontMatches {
|
||||
fonts
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue