From 735cd0ccf3e51f9b3f0e9d30df08899ae54bf7ab Mon Sep 17 00:00:00 2001 From: Konstantin Ritt Date: Thu, 14 May 2015 02:48:42 +0400 Subject: [QFontDatabase] Defer the fallback families list initialization Use the same trick the WebKit related path has used for years: if there is no explicit list that takes a precedence over the default one (i.e. QFont("Arial,SimHei")), then defer the fallback families list initialization until it gets requested. Change-Id: If5a74294bdebb24865c619bc0d7328b3e706de76 Reviewed-by: Eskil Abrahamsen Blomfeldt --- src/gui/text/qfontdatabase.cpp | 28 +++++++++++++++------------- src/gui/text/qfontengine.cpp | 14 +++++++------- 2 files changed, 22 insertions(+), 20 deletions(-) (limited to 'src/gui/text') diff --git a/src/gui/text/qfontdatabase.cpp b/src/gui/text/qfontdatabase.cpp index 6b7a9837cb..af03778e22 100644 --- a/src/gui/text/qfontdatabase.cpp +++ b/src/gui/text/qfontdatabase.cpp @@ -756,7 +756,7 @@ QString qt_resolveFontFamilyAlias(const QString &alias) return alias; } -static QStringList fallbackFamilies(const QString &family, QFont::Style style, QFont::StyleHint styleHint, QChar::Script script) +QStringList qt_fallbacksForFamily(const QString &family, QFont::Style style, QFont::StyleHint styleHint, QChar::Script script) { // make sure that the db has all fallback families QStringList retList = QGuiApplicationPrivate::platformIntegration()->fontDatabase()->fallbacksForFamily(family,style,styleHint,script); @@ -884,17 +884,19 @@ QFontEngine *loadEngine(int script, const QFontDef &request, QFontEngine *engine = loadSingleEngine(script, request, family, foundry, style, size); Q_ASSERT(!engine || engine->type() != QFontEngine::Multi); if (engine && !(request.styleStrategy & QFont::NoFontMerging) && !engine->symbol) { - QStringList fallbacks = request.fallBackFamilies; + QPlatformFontDatabase *pfdb = QGuiApplicationPrivate::platformIntegration()->fontDatabase(); + QFontEngineMulti *pfMultiEngine = pfdb->fontEngineMulti(engine, QChar::Script(script)); + if (!request.fallBackFamilies.isEmpty()) { + QStringList fallbacks = request.fallBackFamilies; - QFont::StyleHint styleHint = QFont::StyleHint(request.styleHint); - if (styleHint == QFont::AnyStyle && request.fixedPitch) - styleHint = QFont::TypeWriter; + QFont::StyleHint styleHint = QFont::StyleHint(request.styleHint); + if (styleHint == QFont::AnyStyle && request.fixedPitch) + styleHint = QFont::TypeWriter; - fallbacks += fallbackFamilies(family->name, QFont::Style(style->key.style), styleHint, QChar::Script(script)); + fallbacks += qt_fallbacksForFamily(family->name, QFont::Style(style->key.style), styleHint, QChar::Script(script)); - QPlatformFontDatabase *pfdb = QGuiApplicationPrivate::platformIntegration()->fontDatabase(); - QFontEngineMulti *pfMultiEngine = pfdb->fontEngineMulti(engine, QChar::Script(script)); - pfMultiEngine->setFallbackFamiliesList(fallbacks); + pfMultiEngine->setFallbackFamiliesList(fallbacks); + } engine = pfMultiEngine; // Cache Multi font engine as well in case we got the single @@ -2560,10 +2562,10 @@ QFontEngine *QFontDatabase::findFont(const QFontDef &request, int script) styleHint = QFont::TypeWriter; QStringList fallbacks = request.fallBackFamilies - + fallbackFamilies(request.family, - QFont::Style(request.style), - styleHint, - QChar::Script(script)); + + qt_fallbacksForFamily(request.family, + QFont::Style(request.style), + styleHint, + QChar::Script(script)); if (script > QChar::Script_Common) fallbacks += QString(); // Find the first font matching the specified script. diff --git a/src/gui/text/qfontengine.cpp b/src/gui/text/qfontengine.cpp index 6f5d178655..f9d924d10a 100644 --- a/src/gui/text/qfontengine.cpp +++ b/src/gui/text/qfontengine.cpp @@ -1590,15 +1590,15 @@ QFontEngineMulti::~QFontEngineMulti() } } +QStringList qt_fallbacksForFamily(const QString &family, QFont::Style style, QFont::StyleHint styleHint, QChar::Script script); + void QFontEngineMulti::ensureFallbackFamiliesQueried() { - if (QPlatformIntegration *integration = QGuiApplicationPrivate::platformIntegration()) { - const QStringList fallbackFamilies = integration->fontDatabase()->fallbacksForFamily(fontDef.family, - QFont::Style(fontDef.style), - QFont::AnyStyle, - QChar::Script(m_script)); - setFallbackFamiliesList(fallbackFamilies); - } + QFont::StyleHint styleHint = QFont::StyleHint(fontDef.styleHint); + if (styleHint == QFont::AnyStyle && fontDef.fixedPitch) + styleHint = QFont::TypeWriter; + + setFallbackFamiliesList(qt_fallbacksForFamily(fontDef.family, QFont::Style(fontDef.style), styleHint, QChar::Script(m_script))); } void QFontEngineMulti::setFallbackFamiliesList(const QStringList &fallbackFamilies) -- cgit v1.2.3