diff --git a/Cargo.toml b/Cargo.toml index 1e82553034..a35832722d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,11 +9,11 @@ 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" ouroboros = "0.15.5" -rustybuzz = { version = "0.6.0", default-features = false, features = ["libm"] } +rustybuzz = { version = "0.7.0", default-features = false, features = ["libm"] } swash = { version = "0.1.6", optional = true } syntect = { version = "5.0.0", optional = true } sys-locale = { version = "0.2.3", optional = true } diff --git a/deny.toml b/deny.toml index fda1256194..5643982c69 100644 --- a/deny.toml +++ b/deny.toml @@ -112,6 +112,7 @@ allow = [ "Apache-2.0", "Unicode-DFS-2016", "BSD-2-Clause", + "Zlib", #"Apache-2.0 WITH LLVM-exception", ] # List of explicitly disallowed licenses diff --git a/src/font/fallback/mod.rs b/src/font/fallback/mod.rs index 7b8fa8c06d..d8abf8815a 100644 --- a/src/font/fallback/mod.rs +++ b/src/font/fallback/mod.rs @@ -71,7 +71,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 { @@ -95,7 +95,7 @@ impl<'a> Iterator for FontFallbackIter<'a> { self.default_i += 1; for font in self.fonts.iter() { - if font.info.family == default_family { + if font.contains_family(default_family) { return Some(font); } } @@ -109,7 +109,7 @@ impl<'a> Iterator for FontFallbackIter<'a> { let script_family = script_families[self.script_i.1]; self.script_i.1 += 1; for font in self.fonts.iter() { - if font.info.family == script_family { + if font.contains_family(script_family) { return Some(font); } } @@ -130,7 +130,7 @@ impl<'a> Iterator for FontFallbackIter<'a> { let common_family = common_families[self.common_i]; self.common_i += 1; for font in self.fonts.iter() { - if font.info.family == common_family { + if font.contains_family(common_family) { return Some(font); } } @@ -143,7 +143,10 @@ impl<'a> Iterator for FontFallbackIter<'a> { while self.other_i < self.fonts.len() { let font = &self.fonts[self.other_i]; 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 f82481b49f..2ef0d45552 100644 --- a/src/font/mod.rs +++ b/src/font/mod.rs @@ -44,6 +44,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 3ba463d9b3..5977ac50ae 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 53fb10da8b..9ff10334f8 100644 --- a/src/font/system/std.rs +++ b/src/font/system/std.rs @@ -75,8 +75,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 4136d97249..5904483aa6 100644 --- a/src/shape.rs +++ b/src/shape.rs @@ -149,7 +149,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);