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:
Allan Sandfeld Jensen 2014-12-02 17:20:48 +01:00 committed by Allan Sandfeld Jensen
parent 82d54a6593
commit 30772c7270
2 changed files with 8 additions and 1 deletions

View File

@ -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);

View File

@ -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;