Revert caching of font pixelsize

We can't reliably do that, because some fonts are bitmap,
but marked as scalable by Fontconfig.

Fixes #3387.
This commit is contained in:
Kirill Chibisov 2020-02-27 23:44:36 +03:00 committed by GitHub
parent 50c1fd077a
commit 223f8dcfd0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 12 additions and 7 deletions

View File

@ -62,7 +62,7 @@ struct FaceLoadingProperties {
load_flags: freetype::face::LoadFlag, load_flags: freetype::face::LoadFlag,
render_mode: freetype::RenderMode, render_mode: freetype::RenderMode,
lcd_filter: c_uint, lcd_filter: c_uint,
pixelsize: f64, non_scalable: Option<f32>,
colored: bool, colored: bool,
pixelsize_fixup_factor: Option<f64>, pixelsize_fixup_factor: Option<f64>,
ft_face: Rc<FTFace>, ft_face: Rc<FTFace>,
@ -326,9 +326,11 @@ impl FreeTypeRasterizer {
None => self.load_ft_face(path, index)?, None => self.load_ft_face(path, index)?,
}; };
// Get available pixel sizes if font isn't scalable. let non_scalable = if pattern.scalable().next().unwrap_or(true) {
let pixelsize = None
pattern.pixelsize().next().expect("Font is missing pixelsize information."); } else {
Some(pattern.pixelsize().next().expect("has 1+ pixelsize") as f32)
};
let pixelsize_fixup_factor = pattern.pixelsizefixupfactor().next(); let pixelsize_fixup_factor = pattern.pixelsizefixupfactor().next();
@ -336,7 +338,7 @@ impl FreeTypeRasterizer {
load_flags: Self::ft_load_flags(pattern), load_flags: Self::ft_load_flags(pattern),
render_mode: Self::ft_render_mode(pattern), render_mode: Self::ft_render_mode(pattern),
lcd_filter: Self::ft_lcd_filter(pattern), lcd_filter: Self::ft_lcd_filter(pattern),
pixelsize, non_scalable,
colored: ft_face.has_color(), colored: ft_face.has_color(),
pixelsize_fixup_factor, pixelsize_fixup_factor,
ft_face, ft_face,
@ -406,9 +408,12 @@ impl FreeTypeRasterizer {
let font_key = self.face_for_glyph(glyph_key)?; let font_key = self.face_for_glyph(glyph_key)?;
let face = &self.faces[&font_key]; let face = &self.faces[&font_key];
let index = face.ft_face.get_char_index(glyph_key.c as usize); let index = face.ft_face.get_char_index(glyph_key.c as usize);
let pixelsize = face
.non_scalable
.unwrap_or_else(|| glyph_key.size.as_f32_pts() * self.device_pixel_ratio * 96. / 72.);
if !face.colored { if !face.colored {
face.ft_face.set_char_size(to_freetype_26_6(face.pixelsize as f32), 0, 0, 0)?; face.ft_face.set_char_size(to_freetype_26_6(pixelsize), 0, 0, 0)?;
} }
unsafe { unsafe {
@ -438,7 +443,7 @@ impl FreeTypeRasterizer {
} else { } else {
// Fallback if user has bitmap scaling disabled // Fallback if user has bitmap scaling disabled
let metrics = face.ft_face.size_metrics().ok_or(Error::MissingSizeMetrics)?; let metrics = face.ft_face.size_metrics().ok_or(Error::MissingSizeMetrics)?;
face.pixelsize / metrics.y_ppem as f64 pixelsize as f64 / metrics.y_ppem as f64
}; };
Ok(downsample_bitmap(rasterized_glyph, fixup_factor)) Ok(downsample_bitmap(rasterized_glyph, fixup_factor))
} else { } else {