Fix custom font substitution list support

During the QPA refactoring, the custom font substitution list support
was lost by ignoring the font request's fallbackFamilies member
when the multi font engine gets created/initialized.
If fallbackFamilies is not empty, it should be prepended to the
font database default fallback families list. Also respect the
custom fallback families list in the cache key to avoid picking
a multi font engine with wrong fallbacks list.

Task-number: QTBUG-36628

Change-Id: Ie2b84b3a397bee4816f421cddf76a5375829f13a
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
This commit is contained in:
Konstantin Ritt 2014-03-07 01:46:47 +02:00 committed by The Qt Project
parent c3b2425791
commit 800232e1d3
2 changed files with 20 additions and 8 deletions

View File

@ -228,22 +228,32 @@ public:
void clear(); void clear();
struct Key { struct Key {
Key() : script(0), screen(0) { } Key() : script(0), multi(0), screen(0) { }
Key(const QFontDef &d, int c, int s = 0) Key(const QFontDef &d, uchar c, bool m = 0, uchar s = 0)
: def(d), script(c), screen(s) { } : def(d), script(c), multi(m), screen(s) { }
QFontDef def; QFontDef def;
int script; uchar script;
int screen; uchar multi: 1;
uchar screen: 7;
inline bool operator<(const Key &other) const inline bool operator<(const Key &other) const
{ {
if (script != other.script) return script < other.script; if (script != other.script) return script < other.script;
if (screen != other.screen) return screen < other.screen; if (screen != other.screen) return screen < other.screen;
if (multi != other.multi) return multi < other.multi;
if (multi && def.fallBackFamilies.size() != other.def.fallBackFamilies.size())
return def.fallBackFamilies.size() < other.def.fallBackFamilies.size();
return def < other.def; return def < other.def;
} }
inline bool operator==(const Key &other) const inline bool operator==(const Key &other) const
{ return def == other.def && script == other.script && screen == other.screen; } {
return script == other.script
&& screen == other.screen
&& multi == other.multi
&& (!multi || def.fallBackFamilies.size() == other.def.fallBackFamilies.size())
&& def == other.def;
}
}; };
// QFontEngineData cache // QFontEngineData cache

View File

@ -824,9 +824,11 @@ QFontEngine *loadEngine(int script, const QFontDef &request,
family->askedForFallback = true; family->askedForFallback = true;
} }
QStringList fallbacks = privateDb()->fallbackFamilies; QStringList fallbacks = request.fallBackFamilies;
if (family && !family->fallbackFamilies.isEmpty()) if (family && !family->fallbackFamilies.isEmpty())
fallbacks = family->fallbackFamilies; fallbacks += family->fallbackFamilies;
else
fallbacks += privateDb()->fallbackFamilies;
QPlatformFontDatabase *pfdb = QGuiApplicationPrivate::platformIntegration()->fontDatabase(); QPlatformFontDatabase *pfdb = QGuiApplicationPrivate::platformIntegration()->fontDatabase();
QFontEngineMulti *pfMultiEngine = pfdb->fontEngineMulti(engine, QChar::Script(script)); QFontEngineMulti *pfMultiEngine = pfdb->fontEngineMulti(engine, QChar::Script(script));