summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKonstantin Ritt <ritt.ks@gmail.com>2015-05-18 09:27:10 +0400
committerKonstantin Ritt <ritt.ks@gmail.com>2015-07-31 09:51:35 +0000
commit5e3e34731b7880ac775e8f1fa156ce016e6820f1 (patch)
treebc3ec374a3ddf40a59c3c0aeef7db91d385f4bce
parent735cd0ccf3e51f9b3f0e9d30df08899ae54bf7ab (diff)
Default implementation for QPlatformFontDatabase::fallbacksForFamily()
...mainly for platforms that do not provide a native/unified way to obtain system-defined font fallbacks list (ie !CoreText && !FontConfig). Change-Id: I23c5589d79ddecb6311ccc52ec8b29977f06d408 Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@theqtcompany.com>
-rw-r--r--src/gui/text/qfontdatabase.cpp40
-rw-r--r--src/gui/text/qplatformfontdatabase.cpp14
-rw-r--r--src/platformsupport/fontdatabases/basic/qbasicfontdatabase.cpp9
-rw-r--r--src/platformsupport/fontdatabases/basic/qbasicfontdatabase_p.h1
-rw-r--r--src/plugins/platforms/android/qandroidplatformfontdatabase.cpp24
-rw-r--r--src/plugins/platforms/android/qandroidplatformfontdatabase.h3
-rw-r--r--src/plugins/platforms/windows/qwindowsfontdatabase.cpp11
-rw-r--r--src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp6
8 files changed, 60 insertions, 48 deletions
diff --git a/src/gui/text/qfontdatabase.cpp b/src/gui/text/qfontdatabase.cpp
index af03778e22..40e61f42ec 100644
--- a/src/gui/text/qfontdatabase.cpp
+++ b/src/gui/text/qfontdatabase.cpp
@@ -756,6 +756,46 @@ QString qt_resolveFontFamilyAlias(const QString &alias)
return alias;
}
+QStringList QPlatformFontDatabase::fallbacksForFamily(const QString &family, QFont::Style style, QFont::StyleHint styleHint, QChar::Script script) const
+{
+ Q_UNUSED(family);
+ Q_UNUSED(styleHint);
+
+ QStringList retList;
+
+ size_t writingSystem = std::find(scriptForWritingSystem,
+ scriptForWritingSystem + QFontDatabase::WritingSystemsCount,
+ script) - scriptForWritingSystem;
+ if (writingSystem >= QFontDatabase::WritingSystemsCount)
+ writingSystem = QFontDatabase::Any;
+
+ QFontDatabasePrivate *db = privateDb();
+ for (int i = 0; i < db->count; ++i) {
+ QtFontFamily *f = db->families[i];
+
+ f->ensurePopulated();
+
+ if (writingSystem > QFontDatabase::Any && f->writingSystems[writingSystem] != QtFontFamily::Supported)
+ continue;
+
+ for (int j = 0; j < f->count; ++j) {
+ QtFontFoundry *foundry = f->foundries[j];
+
+ for (int k = 0; k < foundry->count; ++k) {
+ if (style == foundry->styles[k]->key.style) {
+ if (foundry->name.isEmpty())
+ retList.append(f->name);
+ else
+ retList.append(f->name + QLatin1String(" [") + foundry->name + QLatin1Char(']'));
+ break;
+ }
+ }
+ }
+ }
+
+ return retList;
+}
+
QStringList qt_fallbacksForFamily(const QString &family, QFont::Style style, QFont::StyleHint styleHint, QChar::Script script)
{
// make sure that the db has all fallback families
diff --git a/src/gui/text/qplatformfontdatabase.cpp b/src/gui/text/qplatformfontdatabase.cpp
index 502348a79a..8764c8cebf 100644
--- a/src/gui/text/qplatformfontdatabase.cpp
+++ b/src/gui/text/qplatformfontdatabase.cpp
@@ -343,17 +343,15 @@ QFontEngine *QPlatformFontDatabase::fontEngine(const QByteArray &fontData, qreal
}
/*!
+ \fn QStringList QPlatformFontDatabase::fallbacksForFamily(const QString &family, QFont::Style style, QFont::StyleHint styleHint, QChar::Script script) const
+
Returns a list of alternative fonts for the specified \a family and
\a style and \a script using the \a styleHint given.
+
+ Default implementation returns a list of fonts for which \a style and \a script support
+ has been reported during the font database population.
*/
-QStringList QPlatformFontDatabase::fallbacksForFamily(const QString &family, QFont::Style style, QFont::StyleHint styleHint, QChar::Script script) const
-{
- Q_UNUSED(family);
- Q_UNUSED(style);
- Q_UNUSED(styleHint);
- Q_UNUSED(script);
- return QStringList();
-}
+// implemented in qfontdatabase.cpp
/*!
Adds an application font described by the font contained supplied \a fontData
diff --git a/src/platformsupport/fontdatabases/basic/qbasicfontdatabase.cpp b/src/platformsupport/fontdatabases/basic/qbasicfontdatabase.cpp
index 65cdabdf5b..9212383148 100644
--- a/src/platformsupport/fontdatabases/basic/qbasicfontdatabase.cpp
+++ b/src/platformsupport/fontdatabases/basic/qbasicfontdatabase.cpp
@@ -176,15 +176,6 @@ QFontEngine *QBasicFontDatabase::fontEngine(const QByteArray &fontData, qreal pi
return fe;
}
-QStringList QBasicFontDatabase::fallbacksForFamily(const QString &family, QFont::Style style, QFont::StyleHint styleHint, QChar::Script script) const
-{
- Q_UNUSED(family);
- Q_UNUSED(style);
- Q_UNUSED(script);
- Q_UNUSED(styleHint);
- return QStringList();
-}
-
QStringList QBasicFontDatabase::addApplicationFont(const QByteArray &fontData, const QString &fileName)
{
return addTTFile(fontData,fileName.toLocal8Bit());
diff --git a/src/platformsupport/fontdatabases/basic/qbasicfontdatabase_p.h b/src/platformsupport/fontdatabases/basic/qbasicfontdatabase_p.h
index 3fe1a04b0f..87f4aad2b8 100644
--- a/src/platformsupport/fontdatabases/basic/qbasicfontdatabase_p.h
+++ b/src/platformsupport/fontdatabases/basic/qbasicfontdatabase_p.h
@@ -63,7 +63,6 @@ public:
void populateFontDatabase() Q_DECL_OVERRIDE;
QFontEngine *fontEngine(const QFontDef &fontDef, void *handle) Q_DECL_OVERRIDE;
QFontEngine *fontEngine(const QByteArray &fontData, qreal pixelSize, QFont::HintingPreference hintingPreference) Q_DECL_OVERRIDE;
- QStringList fallbacksForFamily(const QString &family, QFont::Style style, QFont::StyleHint styleHint, QChar::Script script) const Q_DECL_OVERRIDE;
QStringList addApplicationFont(const QByteArray &fontData, const QString &fileName) Q_DECL_OVERRIDE;
void releaseHandle(void *handle) Q_DECL_OVERRIDE;
diff --git a/src/plugins/platforms/android/qandroidplatformfontdatabase.cpp b/src/plugins/platforms/android/qandroidplatformfontdatabase.cpp
index 9b60ab291c..b4b6123147 100644
--- a/src/plugins/platforms/android/qandroidplatformfontdatabase.cpp
+++ b/src/plugins/platforms/android/qandroidplatformfontdatabase.cpp
@@ -55,16 +55,7 @@ void QAndroidPlatformFontDatabase::populateFontDatabase()
QList<QFileInfo> entries = dir.entryInfoList(QStringList() << QStringLiteral("*.ttf") << QStringLiteral("*.otf"), QDir::Files);
for (int i = 0; i < int(entries.count()); ++i) {
const QByteArray file = QFile::encodeName(entries.at(i).absoluteFilePath());
- QSupportedWritingSystems supportedWritingSystems;
- QStringList families = addTTFile(QByteArray(), file, &supportedWritingSystems);
-
- extern int qt_script_for_writing_system(QFontDatabase::WritingSystem writingSystem);
- for (int i = 0; i < QFontDatabase::WritingSystemsCount; ++i) {
- if (i == QFontDatabase::Any || supportedWritingSystems.supported(QFontDatabase::WritingSystem(i))) {
- QChar::Script script = QChar::Script(qt_script_for_writing_system(QFontDatabase::WritingSystem(i)));
- m_fallbacks[script] += families;
- }
- }
+ QBasicFontDatabase::addTTFile(QByteArray(), file);
}
}
@@ -73,15 +64,16 @@ QStringList QAndroidPlatformFontDatabase::fallbacksForFamily(const QString &fami
QFont::StyleHint styleHint,
QChar::Script script) const
{
- Q_UNUSED(family);
- Q_UNUSED(style);
-
+ QStringList result;
if (styleHint == QFont::Monospace || styleHint == QFont::Courier)
- return QString(qgetenv("QT_ANDROID_FONTS_MONOSPACE")).split(";") + m_fallbacks[script];
+ result.append(QString(qgetenv("QT_ANDROID_FONTS_MONOSPACE")).split(";"));
else if (styleHint == QFont::Serif)
- return QString(qgetenv("QT_ANDROID_FONTS_SERIF")).split(";") + m_fallbacks[script];
+ result.append(QString(qgetenv("QT_ANDROID_FONTS_SERIF")).split(";"));
+ else
+ result.append(QString(qgetenv("QT_ANDROID_FONTS")).split(";"));
+ result.append(QPlatformFontDatabase::fallbacksForFamily(family, style, styleHint, script));
- return QString(qgetenv("QT_ANDROID_FONTS")).split(";") + m_fallbacks[script];
+ return result;
}
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/android/qandroidplatformfontdatabase.h b/src/plugins/platforms/android/qandroidplatformfontdatabase.h
index 45de47a58c..89a9ed8bc0 100644
--- a/src/plugins/platforms/android/qandroidplatformfontdatabase.h
+++ b/src/plugins/platforms/android/qandroidplatformfontdatabase.h
@@ -47,9 +47,6 @@ public:
QFont::Style style,
QFont::StyleHint styleHint,
QChar::Script script) const;
-
-private:
- QHash<QChar::Script, QStringList> m_fallbacks;
};
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/windows/qwindowsfontdatabase.cpp b/src/plugins/platforms/windows/qwindowsfontdatabase.cpp
index b1bb944fc6..3b27964b0e 100644
--- a/src/plugins/platforms/windows/qwindowsfontdatabase.cpp
+++ b/src/plugins/platforms/windows/qwindowsfontdatabase.cpp
@@ -1080,11 +1080,7 @@ QWindowsFontDatabase::~QWindowsFontDatabase()
QFontEngineMulti *QWindowsFontDatabase::fontEngineMulti(QFontEngine *fontEngine, QChar::Script script)
{
- if (script == QChar::Script_Common)
- return new QWindowsMultiFontEngine(fontEngine, script);
- // ### as long as fallbacksForFamily() does not take script parameter into account,
- // prefer QFontEngineMulti's loadEngine() implementation for complex scripts
- return QPlatformFontDatabase::fontEngineMulti(fontEngine, script);
+ return new QWindowsMultiFontEngine(fontEngine, script);
}
QFontEngine * QWindowsFontDatabase::fontEngine(const QFontDef &fontDef, void *handle)
@@ -1666,11 +1662,10 @@ QString QWindowsFontDatabase::familyForStyleHint(QFont::StyleHint styleHint)
QStringList QWindowsFontDatabase::fallbacksForFamily(const QString &family, QFont::Style style, QFont::StyleHint styleHint, QChar::Script script) const
{
- QStringList result = QPlatformFontDatabase::fallbacksForFamily(family, style, styleHint, script);
- if (!result.isEmpty())
- return result;
+ QStringList result;
result.append(QWindowsFontDatabase::familyForStyleHint(styleHint));
result.append(QWindowsFontDatabase::extraTryFontsForFamily(family));
+ result.append(QPlatformFontDatabase::fallbacksForFamily(family, style, styleHint, script));
qCDebug(lcQpaFonts) << __FUNCTION__ << family << style << styleHint
<< script << result;
diff --git a/src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp b/src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp
index ad75a0bd54..795554698c 100644
--- a/src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp
+++ b/src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp
@@ -661,9 +661,7 @@ QFontEngine *QWindowsFontDatabaseFT::fontEngine(const QByteArray &fontData, qrea
QStringList QWindowsFontDatabaseFT::fallbacksForFamily(const QString &family, QFont::Style style, QFont::StyleHint styleHint, QChar::Script script) const
{
- QStringList result = QPlatformFontDatabase::fallbacksForFamily(family, style, styleHint, script);
- if (!result.isEmpty())
- return result;
+ QStringList result;
result.append(QWindowsFontDatabase::familyForStyleHint(styleHint));
@@ -679,6 +677,8 @@ QStringList QWindowsFontDatabaseFT::fallbacksForFamily(const QString &family, QF
result.append(QWindowsFontDatabase::extraTryFontsForFamily(family));
+ result.append(QPlatformFontDatabase::fallbacksForFamily(family, style, styleHint, script));
+
qCDebug(lcQpaFonts) << __FUNCTION__ << family << style << styleHint
<< script << result;