summaryrefslogtreecommitdiffstats
path: root/src/platformsupport/fontdatabases/mac
diff options
context:
space:
mode:
authorEskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>2019-09-25 15:11:29 +0200
committerEskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>2019-09-26 10:32:25 +0000
commitd5abda313dab0f83873d34b7c4ddbe8d8a06dacf (patch)
tree1c4671931f66d2919a450ccdd03398729497b537 /src/platformsupport/fontdatabases/mac
parent947883141d9d8b3079a8a21981ad8a5ce3c4798e (diff)
iOS: Fix fallback fonts on iOS 13+
Since iOS 13, the cascade list for the default UI font contains meta-families for several writing systems, such as CJK. Since these font families were never populated to the database, we ignored them in Qt, and thus got missing glyphs for the characters in question. The fix is to make sure these fonts are populated in the database. It contains a partial backport of 922d195020d54d7e599d135f6a5e0338100e08f1, which adds the qt_isFamilyPopulated() accessor to allow us to check if the family has been populated in the font database. In Qt 5.14, there is public API for this in QPlatformFontDatabase, so this is a temporary resolution until then. Fixes: QTBUG-77467 Change-Id: Ia9ebb8a19ad2367eb764ae1496a52966b465336b Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
Diffstat (limited to 'src/platformsupport/fontdatabases/mac')
-rw-r--r--src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm b/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm
index 047773d8e3..e8ea194897 100644
--- a/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm
+++ b/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm
@@ -454,6 +454,9 @@ static void addExtraFallbacks(QStringList *fallbackList)
#endif
}
+// ### Replace this with QPlatformFontDatabase::isFamilyPopulated() in Qt 5.14
+Q_GUI_EXPORT extern bool qt_isFontFamilyPopulated(const QString &familyName);
+
QStringList QCoreTextFontDatabase::fallbacksForFamily(const QString &family, QFont::Style style, QFont::StyleHint styleHint, QChar::Script script) const
{
Q_UNUSED(style);
@@ -481,7 +484,25 @@ QStringList QCoreTextFontDatabase::fallbacksForFamily(const QString &family, QFo
fallbackList.append(QString::fromCFString(fallbackFamilyName));
}
+ // .Apple Symbols Fallback will be at the beginning of the list and we will
+ // detect that this has glyphs for Arabic and other writing systems.
+ // Since it is a symbol font, it should be the last resort, so that
+ // the proper fonts for these writing systems are preferred.
+ int symbolIndex = fallbackList.indexOf(QLatin1String(".Apple Symbols Fallback"));
+ if (symbolIndex >= 0)
+ fallbackList.move(symbolIndex, fallbackList.size() - 1);
+
addExtraFallbacks(&fallbackList);
+
+ // Since iOS 13, the cascade list may contain meta-fonts which have not been
+ // populated to the database, such as ".AppleJapaneseFont". It is important that we
+ // include this in the fallback list, in order to get fallback support for all
+ // languages
+ for (const QString &fallback : fallbackList) {
+ if (!qt_isFontFamilyPopulated(fallback))
+ const_cast<QCoreTextFontDatabase *>(this)->populateFamily(fallback);
+ }
+
extern QStringList qt_sort_families_by_writing_system(QChar::Script, const QStringList &);
fallbackList = qt_sort_families_by_writing_system(script, fallbackList);