From 8abca441827788d48de49d3552735cdd0999379e Mon Sep 17 00:00:00 2001 From: Kirill Chibisov Date: Thu, 20 Feb 2020 00:24:50 +0300 Subject: [PATCH] Fix discarding of FreeType loading flags Fixes regression introduced in 6b327b6f8f0f308ff8f46cdf551ce0d0f3eda60b. Fixes #3355. --- font/src/ft/fc/mod.rs | 32 +++++++++++++++----------------- font/src/ft/mod.rs | 21 ++++++++------------- 2 files changed, 23 insertions(+), 30 deletions(-) diff --git a/font/src/ft/fc/mod.rs b/font/src/ft/fc/mod.rs index a78a3ea..d2fd9d0 100644 --- a/font/src/ft/fc/mod.rs +++ b/font/src/ft/fc/mod.rs @@ -46,10 +46,7 @@ pub use pattern::{Pattern, PatternHash, PatternRef}; /// Find the font closest matching the provided pattern. /// /// The returned pattern is the result of Pattern::render_prepare. -pub fn font_match(config: &ConfigRef, pattern: &mut PatternRef) -> Option { - pattern.config_substitute(config, MatchKind::Pattern); - pattern.default_substitute(); - +pub fn font_match(config: &ConfigRef, pattern: &PatternRef) -> Option { unsafe { // What is this result actually used for? Seems redundant with // return type. @@ -64,11 +61,8 @@ pub fn font_match(config: &ConfigRef, pattern: &mut PatternRef) -> Option Option { - pattern.config_substitute(config, MatchKind::Pattern); - pattern.default_substitute(); - +/// List fonts by closeness to the pattern. +pub fn font_sort(config: &ConfigRef, pattern: &PatternRef) -> Option { unsafe { // What is this result actually used for? Seems redundant with // return type. @@ -91,15 +85,12 @@ pub fn font_sort(config: &ConfigRef, pattern: &mut PatternRef) -> Option Option { - pattern.config_substitute(config, MatchKind::Pattern); - pattern.default_substitute(); - unsafe { let ptr = FcFontList(config.as_ptr(), pattern.as_ptr(), objects.as_ptr()); @@ -198,6 +189,7 @@ impl From for Width { } /// Subpixel geometry +#[derive(Debug)] pub enum Rgba { Unknown, Rgb, @@ -297,7 +289,9 @@ mod tests { pattern.add_style("regular"); let config = Config::get_current(); - let font = super::font_match(config, &mut pattern).expect("match font monospace"); + pattern.config_substitute(config, MatchKind::Pattern); + pattern.default_substitute(); + let font = super::font_match(config, &pattern).expect("match font monospace"); print!("index={:?}; ", font.index()); print!("family={:?}; ", font.family()); @@ -319,7 +313,9 @@ mod tests { pattern.set_slant(Slant::Italic); let config = Config::get_current(); - let fonts = super::font_sort(config, &mut pattern).expect("sort font monospace"); + pattern.config_substitute(config, MatchKind::Pattern); + pattern.default_substitute(); + let fonts = super::font_sort(config, &pattern).expect("sort font monospace"); for font in fonts.into_iter().take(10) { let font = pattern.render_prepare(&config, &font); @@ -341,7 +337,9 @@ mod tests { drop(charset); let config = Config::get_current(); - let fonts = super::font_sort(config, &mut pattern).expect("font_sort"); + pattern.config_substitute(config, MatchKind::Pattern); + pattern.default_substitute(); + let fonts = super::font_sort(config, &pattern).expect("font_sort"); for font in fonts.into_iter().take(10) { let font = pattern.render_prepare(&config, &font); diff --git a/font/src/ft/mod.rs b/font/src/ft/mod.rs index 35d3d28..3e43a29 100644 --- a/font/src/ft/mod.rs +++ b/font/src/ft/mod.rs @@ -241,9 +241,12 @@ impl FreeTypeRasterizer { }, } + pattern.config_substitute(config, fc::MatchKind::Pattern); + pattern.default_substitute(); + // Get font list using pattern. First font is the primary one while the rest are fallbacks - let matched_fonts = fc::font_sort(&config, &mut pattern.clone()) - .ok_or_else(|| Error::MissingFont(desc.to_owned()))?; + let matched_fonts = + fc::font_sort(&config, &pattern).ok_or_else(|| Error::MissingFont(desc.to_owned()))?; let mut matched_fonts = matched_fonts.into_iter(); let primary_font = @@ -288,7 +291,8 @@ impl FreeTypeRasterizer { let list: Vec = matched_fonts .map(|fallback_font| { let charset = fallback_font.get_charset().unwrap_or(&empty_charset); - let fallback_font = primary_font.render_prepare(config, fallback_font); + // Use original pattern to preserve loading flags + let fallback_font = pattern.render_prepare(config, fallback_font); let fallback_font_id = FontID::new(hash, fallback_font.hash()); let _ = coverage.merge(&charset); @@ -416,16 +420,7 @@ impl FreeTypeRasterizer { continue; } - // Recreate a pattern - let mut pattern = Pattern::new(); - pattern.add_pixelsize(self.pixel_size as f64); - pattern.add_style(font_pattern.style().next().unwrap_or("Regular")); - pattern.add_family(font_pattern.family().next().unwrap_or("monospace")); - - // Render pattern, otherwise most of its properties wont work - let config = fc::Config::get_current(); - let pattern = pattern.render_prepare(config, font_pattern); - + let pattern = font_pattern.clone(); let key = self.face_from_pattern(&pattern, font_id, None)?.unwrap(); return Ok(key); },