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
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());
}
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;
};
, script(_script)
, fallbacksQueried(false)
{
+ fallbackFamilies << QString();
init(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
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);
{
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);
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
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);
}
/*!
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);
}
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)
{
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);
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)
{
}
{
Q_OBJECT
public:
- explicit QFontEngineMultiFontConfig(QFontEngine *fe, int script, const QStringList &fallbacks);
+ explicit QFontEngineMultiFontConfig(QFontEngine *fe, int script);
~QFontEngineMultiFontConfig();