diff options
author | Pierre Rossi <[email protected]> | 2012-03-07 13:59:21 +0100 |
---|---|---|
committer | Qt by Nokia <[email protected]> | 2012-03-14 11:37:18 +0100 |
commit | f254c5c8bf91a1d22c0f17c9842663cb68ee6b74 (patch) | |
tree | 02296c790de1b4595d6f0fd60745d300abc7a809 | |
parent | 8b6338be4a41b70f2fc3a18ca07592ca7eb01432 (diff) |
Use the lazily-queried families for all QPA multi font engines.
This is the approach introduced together with the WebKit "backdoor"
that lets us use QRawFont with QTextLayout. We could use it all
over the place and share more code.
Change-Id: Ie1963679755f37ba9204d67554a163f1d1115604
Reviewed-by: Eskil Abrahamsen Blomfeldt <[email protected]>
-rw-r--r-- | src/gui/text/qfontdatabase_qpa.cpp | 4 | ||||
-rw-r--r-- | src/gui/text/qfontengine.cpp | 1 | ||||
-rw-r--r-- | src/gui/text/qfontengine_p.h | 2 | ||||
-rw-r--r-- | src/gui/text/qfontengine_qpa.cpp | 56 | ||||
-rw-r--r-- | src/gui/text/qfontengine_qpa_p.h | 9 | ||||
-rw-r--r-- | src/gui/text/qplatformfontdatabase_qpa.cpp | 5 | ||||
-rw-r--r-- | src/gui/text/qplatformfontdatabase_qpa.h | 2 | ||||
-rw-r--r-- | src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp | 5 | ||||
-rw-r--r-- | src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase_p.h | 2 | ||||
-rw-r--r-- | src/platformsupport/fontdatabases/fontconfig/qfontenginemultifontconfig.cpp | 5 | ||||
-rw-r--r-- | src/platformsupport/fontdatabases/fontconfig/qfontenginemultifontconfig_p.h | 2 |
11 files changed, 53 insertions, 40 deletions
diff --git a/src/gui/text/qfontdatabase_qpa.cpp b/src/gui/text/qfontdatabase_qpa.cpp index 1a1f08f73d4..0014efc4507 100644 --- a/src/gui/text/qfontdatabase_qpa.cpp +++ b/src/gui/text/qfontdatabase_qpa.cpp @@ -207,7 +207,9 @@ QFontEngine *loadEngine(int script, const QFontDef &request, fallbacks = family->fallbackFamilies; QPlatformFontDatabase *pfdb = QGuiApplicationPrivate::platformIntegration()->fontDatabase(); - engine = pfdb->fontEngineMulti(engine, QUnicodeTables::Script(script), fallbacks); + QFontEngineMulti *pfMultiEngine = pfdb->fontEngineMulti(engine, QUnicodeTables::Script(script)); + pfMultiEngine->setFallbackFamiliesList(fallbacks); + engine = pfMultiEngine; // Cache Multi font engine as well in case we got the FT single // font engine when we are actually looking for a Multi one diff --git a/src/gui/text/qfontengine.cpp b/src/gui/text/qfontengine.cpp index 364a356b96c..5c18ddeef83 100644 --- a/src/gui/text/qfontengine.cpp +++ b/src/gui/text/qfontengine.cpp @@ -1366,6 +1366,7 @@ bool QFontEngineMulti::stringToCMap(const QChar *str, int len, if (!engine(0)->stringToCMap(str, len, glyphs, &ng, flags)) return false; + const_cast<QFontEngineMulti *>(this)->ensureFallbackFamiliesQueried(); int glyph_pos = 0; for (int i = 0; i < len; ++i) { bool surrogate = (str[i].isHighSurrogate() && i < len-1 && str[i+1].isLowSurrogate()); diff --git a/src/gui/text/qfontengine_p.h b/src/gui/text/qfontengine_p.h index 1114cdf12ca..4741de30000 100644 --- a/src/gui/text/qfontengine_p.h +++ b/src/gui/text/qfontengine_p.h @@ -395,12 +395,14 @@ public: } virtual bool shouldLoadFontEngineForCharacter(int at, uint ucs4) const; + virtual void setFallbackFamiliesList(const QStringList &) {} protected: friend class QPSPrintEnginePrivate; friend class QPSPrintEngineFontMulti; friend class QRawFont; virtual void loadEngine(int at) = 0; + virtual void ensureFallbackFamiliesQueried() {} QVector<QFontEngine *> engines; }; diff --git a/src/gui/text/qfontengine_qpa.cpp b/src/gui/text/qfontengine_qpa.cpp index 48679824a46..d12e2d651cc 100644 --- a/src/gui/text/qfontengine_qpa.cpp +++ b/src/gui/text/qfontengine_qpa.cpp @@ -674,6 +674,7 @@ QFontEngineMultiQPA::QFontEngineMultiQPA(QFontEngine *fe, int _script) , script(_script) , fallbacksQueried(false) { + fallbackFamilies << QString(); init(fe); } @@ -688,36 +689,43 @@ void QFontEngineMultiQPA::init(QFontEngine *fe) void QFontEngineMultiQPA::loadEngine(int at) { - bool canLoadFallbackEngine = true; - if (!fallbacksQueried) { - // Original FontEngine to restore after the fill. - QFontEngine *fe = engines[0]; - fallbackFamilies = QGuiApplicationPrivate::instance()->platformIntegration()->fontDatabase()->fallbacksForFamily(fe->fontDef.family, QFont::Style(fe->fontDef.style) - , QFont::AnyStyle, QUnicodeTables::Script(script)); - if (fallbackFamilies.size() > 1) { - engines.fill(0, fallbackFamilies.size() + 1); - engines[0] = fe; - } else { - // Turns out we lied about having any fallback at all. - canLoadFallbackEngine = false; - engines[1] = fe; - } - fallbacksQueried = true; - } + ensureFallbackFamiliesQueried(); Q_ASSERT(at < engines.size()); Q_ASSERT(engines.at(at) == 0); QFontDef request = fontDef; - if (canLoadFallbackEngine) { - request.styleStrategy |= QFont::NoFontMerging; - request.family = fallbackFamilies.at(at-1); - engines[at] = QFontDatabase::findFont(script, - /*fontprivate = */0, - request, /*multi = */false); - } + request.styleStrategy |= QFont::NoFontMerging; + request.family = fallbackFamilies.at(at-1); + engines[at] = QFontDatabase::findFont(script, + /*fontprivate = */0, + request, /*multi = */false); Q_ASSERT(engines[at]); engines[at]->ref.ref(); engines[at]->fontDef = request; } +void QFontEngineMultiQPA::ensureFallbackFamiliesQueried() +{ + if (fallbacksQueried) + return; + QStringList fallbacks = QGuiApplicationPrivate::instance()->platformIntegration()->fontDatabase()->fallbacksForFamily(engine(0)->fontDef.family, QFont::Style(engine(0)->fontDef.style) + , QFont::AnyStyle, QUnicodeTables::Script(script)); + setFallbackFamiliesList(fallbacks); +} + +void QFontEngineMultiQPA::setFallbackFamiliesList(const QStringList &fallbacks) +{ + // Original FontEngine to restore after the fill. + QFontEngine *fe = engines[0]; + fallbackFamilies = fallbacks; + if (!fallbackFamilies.isEmpty()) { + engines.fill(0, fallbackFamilies.size() + 1); + engines[0] = fe; + } else { + // Turns out we lied about having any fallback at all. + fallbackFamilies << fe->fontDef.family; + engines[1] = fe; + } + fallbacksQueried = true; +} /* This is used indirectly by QtWebKit when using QTextLayout::setRawFont @@ -750,7 +758,7 @@ QFontEngine* QFontEngineMultiQPA::createMultiFontEngine(QFontEngine *fe, int scr it++; } if (!engine) { - engine = new QFontEngineMultiQPA(fe, script); + engine = QGuiApplicationPrivate::instance()->platformIntegration()->fontDatabase()->fontEngineMulti(fe, QUnicodeTables::Script(script)); QFontCache::instance()->insertEngine(key, engine, /* insertMulti */ !faceIsLocal); } Q_ASSERT(engine); diff --git a/src/gui/text/qfontengine_qpa_p.h b/src/gui/text/qfontengine_qpa_p.h index 16991ad2caf..e6907149b21 100644 --- a/src/gui/text/qfontengine_qpa_p.h +++ b/src/gui/text/qfontengine_qpa_p.h @@ -247,6 +247,7 @@ class Q_GUI_EXPORT QFontEngineMultiQPA : public QFontEngineMulti { public: QFontEngineMultiQPA(QFontEngine *fe, int script, const QStringList &fallbacks); + QFontEngineMultiQPA(QFontEngine *fe, int script); void loadEngine(int at); static QFontEngine* createMultiFontEngine(QFontEngine *fe, int script); @@ -254,13 +255,15 @@ public: int fallbackFamilyCount() const { return fallbackFamilies.size(); } QString fallbackFamilyAt(int at) const { return fallbackFamilies.at(at); } + virtual void ensureFallbackFamiliesQueried(); + virtual void setFallbackFamiliesList(const QStringList &fallbacks); + private: - QFontEngineMultiQPA(QFontEngine *fe, int script); void init(QFontEngine *fe); - QStringList fallbackFamilies; + mutable QStringList fallbackFamilies; int script; - bool fallbacksQueried; + mutable bool fallbacksQueried; }; QT_END_NAMESPACE diff --git a/src/gui/text/qplatformfontdatabase_qpa.cpp b/src/gui/text/qplatformfontdatabase_qpa.cpp index 47a9fe5ab1d..6bd8284fa02 100644 --- a/src/gui/text/qplatformfontdatabase_qpa.cpp +++ b/src/gui/text/qplatformfontdatabase_qpa.cpp @@ -276,10 +276,9 @@ void QPlatformFontDatabase::populateFontDatabase() a certain character. */ QFontEngineMulti *QPlatformFontDatabase::fontEngineMulti(QFontEngine *fontEngine, - QUnicodeTables::Script script, - const QStringList &fallbacks) + QUnicodeTables::Script script) { - return new QFontEngineMultiQPA(fontEngine, script, fallbacks); + return new QFontEngineMultiQPA(fontEngine, script); } /*! diff --git a/src/gui/text/qplatformfontdatabase_qpa.h b/src/gui/text/qplatformfontdatabase_qpa.h index 5a5a8f321f5..3810b75dbfe 100644 --- a/src/gui/text/qplatformfontdatabase_qpa.h +++ b/src/gui/text/qplatformfontdatabase_qpa.h @@ -89,7 +89,7 @@ class Q_GUI_EXPORT QPlatformFontDatabase public: virtual ~QPlatformFontDatabase(); virtual void populateFontDatabase(); - virtual QFontEngineMulti *fontEngineMulti(QFontEngine *fontEngine, QUnicodeTables::Script script, const QStringList &fallbacks); + virtual QFontEngineMulti *fontEngineMulti(QFontEngine *fontEngine, QUnicodeTables::Script script); virtual QFontEngine *fontEngine(const QFontDef &fontDef, QUnicodeTables::Script script, void *handle); virtual QStringList fallbacksForFamily(const QString family, const QFont::Style &style, const QFont::StyleHint &styleHint, const QUnicodeTables::Script &script) const; virtual QStringList addApplicationFont(const QByteArray &fontData, const QString &fileName); diff --git a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp index 28a99cfd172..a4d2778ba6c 100644 --- a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp +++ b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp @@ -472,10 +472,9 @@ void QFontconfigDatabase::populateFontDatabase() } QFontEngineMulti *QFontconfigDatabase::fontEngineMulti(QFontEngine *fontEngine, - QUnicodeTables::Script script, - const QStringList &fallbacks) + QUnicodeTables::Script script) { - return new QFontEngineMultiFontConfig(fontEngine, script, fallbacks); + return new QFontEngineMultiFontConfig(fontEngine, script); } QFontEngine *QFontconfigDatabase::fontEngine(const QFontDef &f, QUnicodeTables::Script script, void *usrPtr) diff --git a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase_p.h b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase_p.h index d4742167e9f..df62ddeb0bf 100644 --- a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase_p.h +++ b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase_p.h @@ -51,7 +51,7 @@ class QFontconfigDatabase : public QBasicFontDatabase { public: void populateFontDatabase(); - QFontEngineMulti *fontEngineMulti(QFontEngine *fontEngine, QUnicodeTables::Script script, const QStringList &fallbacks); + QFontEngineMulti *fontEngineMulti(QFontEngine *fontEngine, QUnicodeTables::Script script); QFontEngine *fontEngine(const QFontDef &fontDef, QUnicodeTables::Script script, void *handle); QStringList fallbacksForFamily(const QString family, const QFont::Style &style, const QFont::StyleHint &styleHint, const QUnicodeTables::Script &script) const; QStringList addApplicationFont(const QByteArray &fontData, const QString &fileName); diff --git a/src/platformsupport/fontdatabases/fontconfig/qfontenginemultifontconfig.cpp b/src/platformsupport/fontdatabases/fontconfig/qfontenginemultifontconfig.cpp index 20165007671..31828ef01f8 100644 --- a/src/platformsupport/fontdatabases/fontconfig/qfontenginemultifontconfig.cpp +++ b/src/platformsupport/fontdatabases/fontconfig/qfontenginemultifontconfig.cpp @@ -46,9 +46,8 @@ QT_BEGIN_NAMESPACE -QFontEngineMultiFontConfig::QFontEngineMultiFontConfig(QFontEngine *fe, int script, - const QStringList &fallbacks) - : QFontEngineMultiQPA(fe, script, fallbacks) +QFontEngineMultiFontConfig::QFontEngineMultiFontConfig(QFontEngine *fe, int script) + : QFontEngineMultiQPA(fe, script) { } diff --git a/src/platformsupport/fontdatabases/fontconfig/qfontenginemultifontconfig_p.h b/src/platformsupport/fontdatabases/fontconfig/qfontenginemultifontconfig_p.h index 260a9b5c702..046d63c1908 100644 --- a/src/platformsupport/fontdatabases/fontconfig/qfontenginemultifontconfig_p.h +++ b/src/platformsupport/fontdatabases/fontconfig/qfontenginemultifontconfig_p.h @@ -51,7 +51,7 @@ class QFontEngineMultiFontConfig : public QFontEngineMultiQPA { Q_OBJECT public: - explicit QFontEngineMultiFontConfig(QFontEngine *fe, int script, const QStringList &fallbacks); + explicit QFontEngineMultiFontConfig(QFontEngine *fe, int script); ~QFontEngineMultiFontConfig(); |