diff --git a/Cargo.toml b/Cargo.toml index 0cd125f..8bc754e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,7 +9,7 @@ documentation = "https://docs.rs/cosmic-text/latest/cosmic_text/" repository = "https://github.com/pop-os/cosmic-text" [dependencies] -fontdb = { version = "0.10.0", default-features = false } +fontdb = { version = "0.13.0", default-features = false } libm = "0.2.6" log = "0.4.17" rustybuzz = { version = "0.6.0", default-features = false, features = ["libm"] } diff --git a/src/font/fallback/mod.rs b/src/font/fallback/mod.rs index dec12d9..752bd02 100644 --- a/src/font/fallback/mod.rs +++ b/src/font/fallback/mod.rs @@ -74,7 +74,7 @@ impl<'a> FontFallbackIter<'a> { "Failed to find preset fallback for {:?} locale '{}', used '{}': '{}'", self.scripts, self.locale, - font.info.family, + font.name(), word ); } else if !self.scripts.is_empty() && self.common_i > 0 { @@ -99,7 +99,7 @@ impl<'a> Iterator for FontFallbackIter<'a> { for font_key in self.font_keys.iter().copied() { let font = Font::from_key(self.db, font_key).expect("invalid font key"); - if font.info.family == default_family { + if font.contains_family(default_family) { return Some(font); } } @@ -114,7 +114,7 @@ impl<'a> Iterator for FontFallbackIter<'a> { self.script_i.1 += 1; for font_key in self.font_keys.iter().copied() { let font = Font::from_key(self.db, font_key).expect("invalid font key"); - if font.info.family == script_family { + if font.contains_family(script_family) { return Some(font); } } @@ -136,7 +136,7 @@ impl<'a> Iterator for FontFallbackIter<'a> { self.common_i += 1; for font_key in self.font_keys.iter().copied() { let font = Font::from_key(self.db, font_key).expect("invalid font key"); - if font.info.family == common_family { + if font.contains_family(common_family) { return Some(font); } } @@ -150,7 +150,10 @@ impl<'a> Iterator for FontFallbackIter<'a> { let font_key = self.font_keys[self.other_i]; let font = Font::from_key(self.db, font_key).expect("invalid font key"); self.other_i += 1; - if !forbidden_families.contains(&font.info.family.as_str()) { + if forbidden_families + .iter() + .all(|family| !font.contains_family(family)) + { return Some(font); } } diff --git a/src/font/mod.rs b/src/font/mod.rs index 066656f..a8dbfed 100644 --- a/src/font/mod.rs +++ b/src/font/mod.rs @@ -80,6 +80,18 @@ impl<'a> Font<'a> { } } + pub fn name(&self) -> &str { + if let Some((name, _)) = self.info.families.first() { + name + } else { + &self.info.post_script_name + } + } + + pub fn contains_family(&self, family: &str) -> bool { + self.info.families.iter().any(|(name, _)| name == family) + } + #[cfg(feature = "swash")] pub fn as_swash(&self) -> swash::FontRef { swash::FontRef { diff --git a/src/font/system/redox.rs b/src/font/system/redox.rs index 0e830bb..a22a1ab 100644 --- a/src/font/system/redox.rs +++ b/src/font/system/redox.rs @@ -44,8 +44,7 @@ impl FontSystem { let now = std::time::Instant::now(); //TODO only do this on demand! - for i in 0..db.faces().len() { - let id = db.faces()[i].id; + for id in db.faces().map(|face| face.id).collect::>() { unsafe { db.make_shared_face_data(id); } diff --git a/src/font/system/std.rs b/src/font/system/std.rs index c3474ac..bae88a9 100644 --- a/src/font/system/std.rs +++ b/src/font/system/std.rs @@ -71,8 +71,7 @@ impl FontSystem { let now = std::time::Instant::now(); //TODO only do this on demand! - for i in 0..db.faces().len() { - let id = db.faces()[i].id; + for id in db.faces().map(|face| face.id).collect::>() { unsafe { db.make_shared_face_data(id); } diff --git a/src/shape.rs b/src/shape.rs index c4a0fce..d2689e2 100644 --- a/src/shape.rs +++ b/src/shape.rs @@ -150,7 +150,7 @@ fn shape_run( None => break, }; - log::trace!("Evaluating fallback with font '{}'", font.info.family); + log::trace!("Evaluating fallback with font '{}'", font.name()); let (mut fb_glyphs, fb_missing) = shape_fallback(&font, line, attrs_list, start_run, end_run, span_rtl);