summaryrefslogtreecommitdiffstats
path: root/src/gui
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui')
-rw-r--r--src/gui/text/qfontdatabase_qpa.cpp4
-rw-r--r--src/gui/text/qfontengine.cpp1
-rw-r--r--src/gui/text/qfontengine_p.h2
-rw-r--r--src/gui/text/qfontengine_qpa.cpp56
-rw-r--r--src/gui/text/qfontengine_qpa_p.h9
-rw-r--r--src/gui/text/qplatformfontdatabase_qpa.cpp5
-rw-r--r--src/gui/text/qplatformfontdatabase_qpa.h2
7 files changed, 47 insertions, 32 deletions
diff --git a/src/gui/text/qfontdatabase_qpa.cpp b/src/gui/text/qfontdatabase_qpa.cpp
index 1a1f08f73d..0014efc450 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 364a356b96..5c18ddeef8 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 1114cdf12c..4741de3000 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 48679824a4..d12e2d651c 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 16991ad2ca..e6907149b2 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 47a9fe5ab1..6bd8284fa0 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 5a5a8f321f..3810b75dbf 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);