summaryrefslogtreecommitdiffstats
path: root/src/gui/text/coretext
diff options
context:
space:
mode:
authorTor Arne Vestbø <tor.arne.vestbo@qt.io>2022-03-15 16:22:42 +0100
committerTor Arne Vestbø <tor.arne.vestbo@qt.io>2022-03-30 19:55:20 +0100
commit1ab928c7f603042b646c48aa486a67e9cca13245 (patch)
treebe5603f72d3c3480955dc53b9e12ef0dfdf404b3 /src/gui/text/coretext
parent8e08286d45e90e0d30056dd65c261601b3ee002d (diff)
CoreText: Make population of theme fonts explicit
Pick-to: 6.2 6.3 Change-Id: I95e6b535e8ec98ca13c9a58f1e4ae4358ed9f028 Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
Diffstat (limited to 'src/gui/text/coretext')
-rw-r--r--src/gui/text/coretext/qcoretextfontdatabase.mm52
-rw-r--r--src/gui/text/coretext/qcoretextfontdatabase_p.h6
2 files changed, 33 insertions, 25 deletions
diff --git a/src/gui/text/coretext/qcoretextfontdatabase.mm b/src/gui/text/coretext/qcoretextfontdatabase.mm
index 574f57047e..e67a01fca9 100644
--- a/src/gui/text/coretext/qcoretextfontdatabase.mm
+++ b/src/gui/text/coretext/qcoretextfontdatabase.mm
@@ -128,11 +128,7 @@ void QCoreTextFontDatabase::populateFontDatabase()
qCDebug(lcQpaFonts) << "Populating available families took" << elapsed.restart() << "ms";
- // Force creating the theme fonts to get the descriptors in m_systemFontDescriptors
- if (m_themeFonts.isEmpty())
- (void)themeFonts();
-
- qCDebug(lcQpaFonts) << "Resolving theme fonts took" << elapsed.restart() << "ms";
+ populateThemeFonts();
for (CTFontDescriptorRef fontDesc : m_systemFontDescriptors)
populateFromDescriptor(fontDesc);
@@ -752,31 +748,43 @@ static CTFontDescriptorRef fontDescriptorFromTheme(QPlatformTheme::Font f)
return descriptorForFontType(fontTypeFromTheme(f));
}
-const QHash<QPlatformTheme::Font, QFont *> &QCoreTextFontDatabase::themeFonts() const
+void QCoreTextFontDatabase::populateThemeFonts()
{
- if (m_themeFonts.isEmpty()) {
- for (long f = QPlatformTheme::SystemFont; f < QPlatformTheme::NFonts; f++) {
- QPlatformTheme::Font ft = static_cast<QPlatformTheme::Font>(f);
- m_themeFonts.insert(ft, themeFont(ft));
- }
+ if (!m_themeFonts.isEmpty())
+ return;
+
+ QElapsedTimer elapsed;
+ if (lcQpaFonts().isDebugEnabled())
+ elapsed.start();
+
+ qCDebug(lcQpaFonts) << "Populating theme fonts...";
+
+ for (long f = QPlatformTheme::SystemFont; f < QPlatformTheme::NFonts; f++) {
+ QPlatformTheme::Font themeFont = static_cast<QPlatformTheme::Font>(f);
+ CTFontDescriptorRef fontDescriptor = fontDescriptorFromTheme(themeFont);
+ FontDescription fd;
+ getFontDescription(fontDescriptor, &fd);
+
+ if (!m_systemFontDescriptors.contains(fontDescriptor))
+ m_systemFontDescriptors.insert(fontDescriptor);
+ else
+ CFRelease(fontDescriptor);
+
+ QFont *font = new QFont(fd.familyName, fd.pointSize, fd.weight, fd.style == QFont::StyleItalic);
+ m_themeFonts.insert(themeFont, font);
}
- return m_themeFonts;
+ qCDebug(lcQpaFonts) << "Populating theme fonts took" << elapsed.restart() << "ms";
}
QFont *QCoreTextFontDatabase::themeFont(QPlatformTheme::Font f) const
{
- CTFontDescriptorRef fontDesc = fontDescriptorFromTheme(f);
- FontDescription fd;
- getFontDescription(fontDesc, &fd);
-
- if (!m_systemFontDescriptors.contains(fontDesc))
- m_systemFontDescriptors.insert(fontDesc);
- else
- CFRelease(fontDesc);
+ // The code paths via QFontDatabase::systemFont() or QPlatformTheme::font()
+ // do not ensure that the font database has been populated, so we need to
+ // manually populate the theme fonts lazily here just in case.
+ const_cast<QCoreTextFontDatabase*>(this)->populateThemeFonts();
- QFont *font = new QFont(fd.familyName, fd.pointSize, fd.weight, fd.style == QFont::StyleItalic);
- return font;
+ return m_themeFonts.value(f, nullptr);
}
QFont QCoreTextFontDatabase::defaultFont() const
diff --git a/src/gui/text/coretext/qcoretextfontdatabase_p.h b/src/gui/text/coretext/qcoretextfontdatabase_p.h
index 971ac3cfde..a6f93dd14a 100644
--- a/src/gui/text/coretext/qcoretextfontdatabase_p.h
+++ b/src/gui/text/coretext/qcoretextfontdatabase_p.h
@@ -83,20 +83,20 @@ public:
bool fontsAlwaysScalable() const override;
QList<int> standardSizes() const override;
- // For iOS and OS X platform themes
+ // For iOS and macOS platform themes
QFont *themeFont(QPlatformTheme::Font) const;
- const QHash<QPlatformTheme::Font, QFont *> &themeFonts() const;
protected:
mutable QSet<CTFontDescriptorRef> m_systemFontDescriptors;
private:
+ void populateThemeFonts();
void populateFromDescriptor(CTFontDescriptorRef font, const QString &familyName = QString(), QFontDatabasePrivate::ApplicationFont *applicationFont = nullptr);
static CFArrayRef fallbacksForFamily(const QString &family);
mutable QString defaultFontName;
- mutable QHash<QPlatformTheme::Font, QFont *> m_themeFonts;
+ QHash<QPlatformTheme::Font, QFont *> m_themeFonts;
bool m_hasPopulatedAliases;
};