diff options
author | Tor Arne Vestbø <tor.arne.vestbo@qt.io> | 2022-03-15 16:22:42 +0100 |
---|---|---|
committer | Tor Arne Vestbø <tor.arne.vestbo@qt.io> | 2022-03-30 19:55:20 +0100 |
commit | 1ab928c7f603042b646c48aa486a67e9cca13245 (patch) | |
tree | be5603f72d3c3480955dc53b9e12ef0dfdf404b3 /src/gui/text/coretext | |
parent | 8e08286d45e90e0d30056dd65c261601b3ee002d (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.mm | 52 | ||||
-rw-r--r-- | src/gui/text/coretext/qcoretextfontdatabase_p.h | 6 |
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; }; |