Fix loading of web fonts with broken hinting bytecode
The Fira Sans font by the Mozilla Foundation has bytecode that goes into an infinite loop. Fortunately FreeType catches the case, but we fail to render any glyphs and spends too long trying the bytecode on every glyph. This patch instead switches the font to auto-hinting when this error is encountered. Task-number: QTBUG-41034 Change-Id: Icd044b41396a06fb435bc189cdbd71d703107de6 Reviewed-by: Konstantin Ritt <ritt.ks@gmail.com> Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@theqtcompany.com>
This commit is contained in:
parent
82d54a6593
commit
30772c7270
@ -891,6 +891,13 @@ QFontEngineFT::Glyph *QFontEngineFT::loadGlyph(QGlyphSet *set, uint glyph,
|
||||
// this is an error in the bytecode interpreter, just try to run without it
|
||||
load_flags |= FT_LOAD_FORCE_AUTOHINT;
|
||||
err = FT_Load_Glyph(face, glyph, load_flags);
|
||||
} else if (err == FT_Err_Execution_Too_Long) {
|
||||
// This is an error in the bytecode, probably a web font made by someone who
|
||||
// didn't test bytecode hinting at all so disable for it for all glyphs.
|
||||
qWarning("load glyph failed due to broken hinting bytecode in font, switching to auto hinting");
|
||||
default_load_flags |= FT_LOAD_FORCE_AUTOHINT;
|
||||
load_flags |= FT_LOAD_FORCE_AUTOHINT;
|
||||
err = FT_Load_Glyph(face, glyph, load_flags);
|
||||
}
|
||||
if (err != FT_Err_Ok) {
|
||||
qWarning("load glyph failed err=%x face=%p, glyph=%d", err, face, glyph);
|
||||
|
@ -293,7 +293,7 @@ private:
|
||||
protected:
|
||||
|
||||
QFreetypeFace *freetype;
|
||||
int default_load_flags;
|
||||
mutable int default_load_flags;
|
||||
HintStyle default_hint_style;
|
||||
bool antialias;
|
||||
bool transform;
|
||||
|
Loading…
x
Reference in New Issue
Block a user