From 500be123f4fbb60593fe25d5fe70fbc62445e8aa Mon Sep 17 00:00:00 2001 From: Eskil Abrahamsen Blomfeldt Date: Fri, 18 Aug 2023 09:00:21 +0200 Subject: [PATCH] Support variable applications fonts with DirectWrite For GDI, there doesn't seem to be any way to do this, so it depends on selecting the DirectWrite font database explicitly. This moves the supportsVariableApplicationFonts() check into the QPlatformFontDatabase instead of the font engine, since that's where it belongs. [ChangeLog][Fonts] Added support for selecting named instances in variable application fonts when using the DirectWrite backend. Task-number: QTBUG-108624 Change-Id: I51e0fedd7a9616088a06453a1d17f48bd18fa5a7 Reviewed-by: Allan Sandfeld Jensen --- src/gui/text/freetype/qfontengine_ft.cpp | 9 - src/gui/text/freetype/qfontengine_ft_p.h | 2 - .../text/freetype/qfreetypefontdatabase.cpp | 9 + .../text/freetype/qfreetypefontdatabase_p.h | 1 + src/gui/text/qfontengine.cpp | 5 - src/gui/text/qfontengine_p.h | 1 - src/gui/text/qplatformfontdatabase.cpp | 12 ++ src/gui/text/qplatformfontdatabase.h | 2 + src/gui/text/unix/qfontconfigdatabase.cpp | 9 + src/gui/text/unix/qfontconfigdatabase_p.h | 1 + .../qwindowsdirectwritefontdatabase.cpp | 164 ++++++++++-------- .../qwindowsdirectwritefontdatabase_p.h | 1 + .../text/windows/qwindowsfontdatabasebase.cpp | 92 ++++++++-- .../text/windows/qwindowsfontdatabasebase_p.h | 4 +- .../text/qfontdatabase/tst_qfontdatabase.cpp | 11 +- .../shared/resources/testfont_variable.ttf | Bin 30660 -> 28528 bytes 16 files changed, 208 insertions(+), 115 deletions(-) diff --git a/src/gui/text/freetype/qfontengine_ft.cpp b/src/gui/text/freetype/qfontengine_ft.cpp index b7eb9f412b7..f3a80d925d5 100644 --- a/src/gui/text/freetype/qfontengine_ft.cpp +++ b/src/gui/text/freetype/qfontengine_ft.cpp @@ -2241,15 +2241,6 @@ Qt::HANDLE QFontEngineFT::handle() const return non_locked_face(); } -bool QFontEngineFT::supportsVariableApplicationFonts() const -{ -#if (FREETYPE_MAJOR*10000 + FREETYPE_MINOR*100 + FREETYPE_PATCH) >= 20900 - return true; -#else - return false; -#endif -} - QT_END_NAMESPACE #endif // QT_NO_FREETYPE diff --git a/src/gui/text/freetype/qfontengine_ft_p.h b/src/gui/text/freetype/qfontengine_ft_p.h index 85f1d87a3c3..e1951749602 100644 --- a/src/gui/text/freetype/qfontengine_ft_p.h +++ b/src/gui/text/freetype/qfontengine_ft_p.h @@ -159,8 +159,6 @@ private: return supportsHorizontalSubPixelPositions(); } - bool supportsVariableApplicationFonts() const override; - bool getSfntTableData(uint tag, uchar *buffer, uint *length) const override; int synthesized() const override; diff --git a/src/gui/text/freetype/qfreetypefontdatabase.cpp b/src/gui/text/freetype/qfreetypefontdatabase.cpp index 2441deaa38e..df64d2ce90f 100644 --- a/src/gui/text/freetype/qfreetypefontdatabase.cpp +++ b/src/gui/text/freetype/qfreetypefontdatabase.cpp @@ -335,4 +335,13 @@ QStringList QFreeTypeFontDatabase::addTTFile(const QByteArray &fontData, const Q return families; } +bool QFreeTypeFontDatabase::supportsVariableApplicationFonts() const +{ +#if (FREETYPE_MAJOR*10000 + FREETYPE_MINOR*100 + FREETYPE_PATCH) >= 20900 + return true; +#else + return false; +#endif +} + QT_END_NAMESPACE diff --git a/src/gui/text/freetype/qfreetypefontdatabase_p.h b/src/gui/text/freetype/qfreetypefontdatabase_p.h index 46ffa4353c7..5fcec585d29 100644 --- a/src/gui/text/freetype/qfreetypefontdatabase_p.h +++ b/src/gui/text/freetype/qfreetypefontdatabase_p.h @@ -42,6 +42,7 @@ public: QFontEngine *fontEngine(const QByteArray &fontData, qreal pixelSize, QFont::HintingPreference hintingPreference) override; QStringList addApplicationFont(const QByteArray &fontData, const QString &fileName, QFontDatabasePrivate::ApplicationFont *applicationFont = nullptr) override; void releaseHandle(void *handle) override; + bool supportsVariableApplicationFonts() const override; static void addNamedInstancesForFace(void *face, int faceIndex, const QString &family, const QString &styleName, diff --git a/src/gui/text/qfontengine.cpp b/src/gui/text/qfontengine.cpp index 66b0e885989..8f2336f2ace 100644 --- a/src/gui/text/qfontengine.cpp +++ b/src/gui/text/qfontengine.cpp @@ -247,11 +247,6 @@ bool QFontEngine::supportsTransformation(const QTransform &transform) const return transform.type() < QTransform::TxProject; } -bool QFontEngine::supportsVariableApplicationFonts() const -{ - return false; -} - bool QFontEngine::expectsGammaCorrectedBlending() const { return true; diff --git a/src/gui/text/qfontengine_p.h b/src/gui/text/qfontengine_p.h index 50e427e46ee..bf6514a0bdd 100644 --- a/src/gui/text/qfontengine_p.h +++ b/src/gui/text/qfontengine_p.h @@ -213,7 +213,6 @@ public: inline bool canRender(uint ucs4) const { return glyphIndex(ucs4) != 0; } virtual bool canRender(const QChar *str, int len) const; - virtual bool supportsVariableApplicationFonts() const; virtual bool supportsTransformation(const QTransform &transform) const; diff --git a/src/gui/text/qplatformfontdatabase.cpp b/src/gui/text/qplatformfontdatabase.cpp index ce7713db035..a146254f68a 100644 --- a/src/gui/text/qplatformfontdatabase.cpp +++ b/src/gui/text/qplatformfontdatabase.cpp @@ -645,6 +645,18 @@ bool QPlatformFontDatabase::isFamilyPopulated(const QString &familyName) return qt_isFontFamilyPopulated(familyName); } +/*! + Returns true if this font database supports loading named instances from variable application + fonts. + + \since 6.7 +*/ +bool QPlatformFontDatabase::supportsVariableApplicationFonts() const +{ + return false; +} + + /*! \class QPlatformFontDatabase \since 5.0 diff --git a/src/gui/text/qplatformfontdatabase.h b/src/gui/text/qplatformfontdatabase.h index a5e65086a8c..3007a11838f 100644 --- a/src/gui/text/qplatformfontdatabase.h +++ b/src/gui/text/qplatformfontdatabase.h @@ -89,6 +89,8 @@ public: virtual bool fontsAlwaysScalable() const; virtual QList standardSizes() const; + virtual bool supportsVariableApplicationFonts() const; + // helper static QSupportedWritingSystems writingSystemsFromTrueTypeBits(quint32 unicodeRange[4], quint32 codePageRange[2]); static QSupportedWritingSystems writingSystemsFromOS2Table(const char *os2Table, size_t length); diff --git a/src/gui/text/unix/qfontconfigdatabase.cpp b/src/gui/text/unix/qfontconfigdatabase.cpp index 4a402cd7641..8043602542e 100644 --- a/src/gui/text/unix/qfontconfigdatabase.cpp +++ b/src/gui/text/unix/qfontconfigdatabase.cpp @@ -1042,4 +1042,13 @@ void QFontconfigDatabase::setupFontEngine(QFontEngineFT *engine, const QFontDef engine->glyphFormat = format; } +bool QFontconfigDatabase::supportsVariableApplicationFonts() const +{ +#if (FREETYPE_MAJOR*10000 + FREETYPE_MINOR*100 + FREETYPE_PATCH) >= 20900 + return true; +#else + return false; +#endif +} + QT_END_NAMESPACE diff --git a/src/gui/text/unix/qfontconfigdatabase_p.h b/src/gui/text/unix/qfontconfigdatabase_p.h index cf15306e40d..dd7a70a375e 100644 --- a/src/gui/text/unix/qfontconfigdatabase_p.h +++ b/src/gui/text/unix/qfontconfigdatabase_p.h @@ -28,6 +28,7 @@ public: ~QFontconfigDatabase() override; void populateFontDatabase() override; void invalidate() override; + bool supportsVariableApplicationFonts() const override; QFontEngineMulti *fontEngineMulti(QFontEngine *fontEngine, QChar::Script script) override; QFontEngine *fontEngine(const QFontDef &fontDef, void *handle) override; QFontEngine *fontEngine(const QByteArray &fontData, qreal pixelSize, QFont::HintingPreference hintingPreference) override; diff --git a/src/gui/text/windows/qwindowsdirectwritefontdatabase.cpp b/src/gui/text/windows/qwindowsdirectwritefontdatabase.cpp index 23dbe1f4d61..e8251ac9448 100644 --- a/src/gui/text/windows/qwindowsdirectwritefontdatabase.cpp +++ b/src/gui/text/windows/qwindowsdirectwritefontdatabase.cpp @@ -249,99 +249,102 @@ QStringList QWindowsDirectWriteFontDatabase::addApplicationFont(const QByteArray loadedData = file.readAll(); } - IDWriteFontFace *face = createDirectWriteFace(loadedData); - if (face == nullptr) { + QList faces = createDirectWriteFaces(loadedData); + if (faces.isEmpty()) { qCWarning(lcQpaFonts) << "Failed to create DirectWrite face from font data. Font may be unsupported."; return QStringList(); } - wchar_t defaultLocale[LOCALE_NAME_MAX_LENGTH]; - bool hasDefaultLocale = GetUserDefaultLocaleName(defaultLocale, LOCALE_NAME_MAX_LENGTH) != 0; - wchar_t englishLocale[] = L"en-us"; - - static const int SMOOTH_SCALABLE = 0xffff; - const QString foundryName; // No such concept. - const bool scalable = true; - const bool antialias = false; - const int size = SMOOTH_SCALABLE; - - QSupportedWritingSystems writingSystems; - writingSystems.setSupported(QFontDatabase::Any); - writingSystems.setSupported(QFontDatabase::Latin); - QStringList ret; - IDWriteFontFace3 *face3 = nullptr; - if (SUCCEEDED(face->QueryInterface(__uuidof(IDWriteFontFace3), - reinterpret_cast(&face3)))) { - QString defaultLocaleFamilyName; - QString englishLocaleFamilyName; + for (int i = 0; i < faces.size(); ++i) { + IDWriteFontFace *face = faces.at(i); + wchar_t defaultLocale[LOCALE_NAME_MAX_LENGTH]; + bool hasDefaultLocale = GetUserDefaultLocaleName(defaultLocale, LOCALE_NAME_MAX_LENGTH) != 0; + wchar_t englishLocale[] = L"en-us"; - IDWriteLocalizedStrings *names; - if (SUCCEEDED(face3->GetFamilyNames(&names))) { - defaultLocaleFamilyName = hasDefaultLocale ? localeString(names, defaultLocale) : QString(); - englishLocaleFamilyName = localeString(names, englishLocale); + static const int SMOOTH_SCALABLE = 0xffff; + const QString foundryName; // No such concept. + const bool scalable = true; + const bool antialias = false; + const int size = SMOOTH_SCALABLE; - names->Release(); - } + QSupportedWritingSystems writingSystems; + writingSystems.setSupported(QFontDatabase::Any); + writingSystems.setSupported(QFontDatabase::Latin); - QString defaultLocaleStyleName; - QString englishLocaleStyleName; - if (SUCCEEDED(face3->GetFaceNames(&names))) { - defaultLocaleStyleName = hasDefaultLocale ? localeString(names, defaultLocale) : QString(); - englishLocaleStyleName = localeString(names, englishLocale); + IDWriteFontFace3 *face3 = nullptr; + if (SUCCEEDED(face->QueryInterface(__uuidof(IDWriteFontFace3), + reinterpret_cast(&face3)))) { + QString defaultLocaleFamilyName; + QString englishLocaleFamilyName; - names->Release(); - } + IDWriteLocalizedStrings *names; + if (SUCCEEDED(face3->GetFamilyNames(&names))) { + defaultLocaleFamilyName = hasDefaultLocale ? localeString(names, defaultLocale) : QString(); + englishLocaleFamilyName = localeString(names, englishLocale); - QFont::Stretch stretch = fromDirectWriteStretch(face3->GetStretch()); - QFont::Style style = fromDirectWriteStyle(face3->GetStyle()); - QFont::Weight weight = fromDirectWriteWeight(face3->GetWeight()); - bool fixed = face3->IsMonospacedFont(); - - qCDebug(lcQpaFonts) << "\tFont names:" << englishLocaleFamilyName << ", " << defaultLocaleFamilyName - << ", style names:" << englishLocaleStyleName << ", " << defaultLocaleStyleName - << ", stretch:" << stretch - << ", style:" << style - << ", weight:" << weight - << ", fixed:" << fixed; - - if (!englishLocaleFamilyName.isEmpty()) { - if (applicationFont != nullptr) { - QFontDatabasePrivate::ApplicationFont::Properties properties; - properties.style = style; - properties.weight = weight; - properties.familyName = englishLocaleFamilyName; - properties.styleName = englishLocaleStyleName; - applicationFont->properties.append(properties); + names->Release(); } - ret.append(englishLocaleFamilyName); - QPlatformFontDatabase::registerFont(englishLocaleFamilyName, englishLocaleStyleName, QString(), weight, style, stretch, antialias, scalable, size, fixed, writingSystems, face); - face->AddRef(); - } + QString defaultLocaleStyleName; + QString englishLocaleStyleName; + if (SUCCEEDED(face3->GetFaceNames(&names))) { + defaultLocaleStyleName = hasDefaultLocale ? localeString(names, defaultLocale) : QString(); + englishLocaleStyleName = localeString(names, englishLocale); - if (!defaultLocaleFamilyName.isEmpty() && defaultLocaleFamilyName != englishLocaleFamilyName) { - if (applicationFont != nullptr) { - QFontDatabasePrivate::ApplicationFont::Properties properties; - properties.style = style; - properties.weight = weight; - properties.familyName = englishLocaleFamilyName; - properties.styleName = englishLocaleStyleName; - applicationFont->properties.append(properties); + names->Release(); } - ret.append(defaultLocaleFamilyName); - QPlatformFontDatabase::registerFont(defaultLocaleFamilyName, defaultLocaleStyleName, QString(), weight, style, stretch, antialias, scalable, size, fixed, writingSystems, face); - face->AddRef(); + QFont::Stretch stretch = fromDirectWriteStretch(face3->GetStretch()); + QFont::Style style = fromDirectWriteStyle(face3->GetStyle()); + QFont::Weight weight = fromDirectWriteWeight(face3->GetWeight()); + bool fixed = face3->IsMonospacedFont(); + + qCDebug(lcQpaFonts) << "\tFont names:" << englishLocaleFamilyName << ", " << defaultLocaleFamilyName + << ", style names:" << englishLocaleStyleName << ", " << defaultLocaleStyleName + << ", stretch:" << stretch + << ", style:" << style + << ", weight:" << weight + << ", fixed:" << fixed; + + if (!englishLocaleFamilyName.isEmpty()) { + if (applicationFont != nullptr) { + QFontDatabasePrivate::ApplicationFont::Properties properties; + properties.style = style; + properties.weight = weight; + properties.familyName = englishLocaleFamilyName; + properties.styleName = englishLocaleStyleName; + applicationFont->properties.append(properties); + } + + ret.append(englishLocaleFamilyName); + QPlatformFontDatabase::registerFont(englishLocaleFamilyName, englishLocaleStyleName, QString(), weight, style, stretch, antialias, scalable, size, fixed, writingSystems, face); + face->AddRef(); + } + + if (!defaultLocaleFamilyName.isEmpty() && defaultLocaleFamilyName != englishLocaleFamilyName) { + if (applicationFont != nullptr) { + QFontDatabasePrivate::ApplicationFont::Properties properties; + properties.style = style; + properties.weight = weight; + properties.familyName = englishLocaleFamilyName; + properties.styleName = englishLocaleStyleName; + applicationFont->properties.append(properties); + } + + ret.append(defaultLocaleFamilyName); + QPlatformFontDatabase::registerFont(defaultLocaleFamilyName, defaultLocaleStyleName, QString(), weight, style, stretch, antialias, scalable, size, fixed, writingSystems, face); + face->AddRef(); + } + + face3->Release(); + } else { + qCWarning(lcQpaFonts) << "Unable to query IDWriteFontFace3 interface from font face."; } - face3->Release(); - } else { - qCWarning(lcQpaFonts) << "Unable to query IDWriteFontFace3 interface from font face."; + face->Release(); } - face->Release(); - return ret; } @@ -425,4 +428,17 @@ QFont QWindowsDirectWriteFontDatabase::defaultFont() const return QFont(QStringLiteral("Segoe UI")); } +bool QWindowsDirectWriteFontDatabase::supportsVariableApplicationFonts() const +{ + QSharedPointer fontEngineData = data(); + IDWriteFactory5 *factory5 = nullptr; + if (SUCCEEDED(fontEngineData->directWriteFactory->QueryInterface(__uuidof(IDWriteFactory5), + reinterpret_cast(&factory5)))) { + factory5->Release(); + return true; + } + + return false; +} + QT_END_NAMESPACE diff --git a/src/gui/text/windows/qwindowsdirectwritefontdatabase_p.h b/src/gui/text/windows/qwindowsdirectwritefontdatabase_p.h index 1babf6e05c2..41a1640c169 100644 --- a/src/gui/text/windows/qwindowsdirectwritefontdatabase_p.h +++ b/src/gui/text/windows/qwindowsdirectwritefontdatabase_p.h @@ -47,6 +47,7 @@ public: bool fontsAlwaysScalable() const override; bool isPrivateFontFamily(const QString &family) const override; + bool supportsVariableApplicationFonts() const override; private: friend class QWindowsFontEngineDirectWrite; diff --git a/src/gui/text/windows/qwindowsfontdatabasebase.cpp b/src/gui/text/windows/qwindowsfontdatabasebase.cpp index f9b36b48527..9343e447ae4 100644 --- a/src/gui/text/windows/qwindowsfontdatabasebase.cpp +++ b/src/gui/text/windows/qwindowsfontdatabasebase.cpp @@ -550,8 +550,12 @@ void QWindowsFontDatabaseBase::createDirectWriteFactory(IDWriteFactory **factory IUnknown *result = nullptr; # if QT_CONFIG(directwrite3) - DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, __uuidof(IDWriteFactory3), &result); + DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, __uuidof(IDWriteFactory5), &result); + + if (result == nullptr) + DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, __uuidof(IDWriteFactory3), &result); # endif + if (result == nullptr) DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, __uuidof(IDWriteFactory2), &result); @@ -692,12 +696,22 @@ QFont QWindowsFontDatabaseBase::systemDefaultFont() } #if QT_CONFIG(directwrite) && QT_CONFIG(direct2d) -IDWriteFontFace *QWindowsFontDatabaseBase::createDirectWriteFace(const QByteArray &fontData) const +IDWriteFontFace *QWindowsFontDatabaseBase::createDirectWriteFace(const QByteArray &fontData) { + QList faces = createDirectWriteFaces(fontData, false); + Q_ASSERT(faces.size() <= 1); + + return faces.isEmpty() ? nullptr : faces.first(); +} + +QList QWindowsFontDatabaseBase::createDirectWriteFaces(const QByteArray &fontData, + bool queryVariations) const +{ + QList ret; QSharedPointer fontEngineData = data(); if (fontEngineData->directWriteFactory == nullptr) { qCWarning(lcQpaFonts) << "DirectWrite factory not created in QWindowsFontDatabaseBase::createDirectWriteFace()"; - return nullptr; + return ret; } CustomFontFileLoader fontFileLoader(fontEngineData->directWriteFactory); @@ -712,7 +726,7 @@ IDWriteFontFace *QWindowsFontDatabaseBase::createDirectWriteFace(const QByteArra &fontFile); if (FAILED(hres)) { qErrnoWarning(hres, "%s: CreateCustomFontFileReference failed", __FUNCTION__); - return nullptr; + return ret; } BOOL isSupportedFontType; @@ -722,25 +736,64 @@ IDWriteFontFace *QWindowsFontDatabaseBase::createDirectWriteFace(const QByteArra fontFile->Analyze(&isSupportedFontType, &fontFileType, &fontFaceType, &numberOfFaces); if (!isSupportedFontType) { fontFile->Release(); - return nullptr; + return ret; } +#if QT_CONFIG(directwrite3) + IDWriteFactory5 *factory5 = nullptr; + if (queryVariations && SUCCEEDED(fontEngineData->directWriteFactory->QueryInterface(__uuidof(IDWriteFactory5), + reinterpret_cast(&factory5)))) { + + IDWriteFontSetBuilder1 *builder; + if (SUCCEEDED(factory5->CreateFontSetBuilder(&builder))) { + if (SUCCEEDED(builder->AddFontFile(fontFile))) { + IDWriteFontSet *fontSet; + if (SUCCEEDED(builder->CreateFontSet(&fontSet))) { + int count = fontSet->GetFontCount(); + qCDebug(lcQpaFonts) << "Found" << count << "variations in font file"; + for (int i = 0; i < count; ++i) { + IDWriteFontFaceReference *ref; + if (SUCCEEDED(fontSet->GetFontFaceReference(i, &ref))) { + IDWriteFontFace3 *face; + if (SUCCEEDED(ref->CreateFontFace(&face))) { + ret.append(face); + } + ref->Release(); + } + } + fontSet->Release(); + } + } + + builder->Release(); + } + + factory5->Release(); + } +#else + Q_UNUSED(queryVariations); +#endif + // ### Currently no support for .ttc, but we could easily return a list here. - IDWriteFontFace *directWriteFontFace = nullptr; - hres = fontEngineData->directWriteFactory->CreateFontFace(fontFaceType, - 1, - &fontFile, - 0, - DWRITE_FONT_SIMULATIONS_NONE, - &directWriteFontFace); - if (FAILED(hres)) { - qErrnoWarning(hres, "%s: CreateFontFace failed", __FUNCTION__); - fontFile->Release(); - return nullptr; + if (ret.isEmpty()) { + IDWriteFontFace *directWriteFontFace = nullptr; + hres = fontEngineData->directWriteFactory->CreateFontFace(fontFaceType, + 1, + &fontFile, + 0, + DWRITE_FONT_SIMULATIONS_NONE, + &directWriteFontFace); + if (FAILED(hres)) { + qErrnoWarning(hres, "%s: CreateFontFace failed", __FUNCTION__); + fontFile->Release(); + return ret; + } else { + ret.append(directWriteFontFace); + } } fontFile->Release(); - return directWriteFontFace; + return ret; } #endif // directwrite && direct2d @@ -760,7 +813,10 @@ QFontEngine *QWindowsFontDatabaseBase::fontEngine(const QByteArray &fontData, qr if (fontEngineData->directWriteFactory == nullptr) return nullptr; - IDWriteFontFace *directWriteFontFace = createDirectWriteFace(fontData); + IDWriteFontFace * directWriteFontFace = createDirectWriteFace(fontData); + if (directWriteFontFace == nullptr) + return nullptr; + fontEngine = new QWindowsFontEngineDirectWrite(directWriteFontFace, pixelSize, fontEngineData); diff --git a/src/gui/text/windows/qwindowsfontdatabasebase_p.h b/src/gui/text/windows/qwindowsfontdatabasebase_p.h index 60acc5cb06d..b7bd47ba84c 100644 --- a/src/gui/text/windows/qwindowsfontdatabasebase_p.h +++ b/src/gui/text/windows/qwindowsfontdatabasebase_p.h @@ -91,7 +91,9 @@ public: protected: #if QT_CONFIG(directwrite) - IDWriteFontFace *createDirectWriteFace(const QByteArray &fontData) const; + QList createDirectWriteFaces(const QByteArray &fontData, + bool queryVariations = true) const; + IDWriteFontFace *createDirectWriteFace(const QByteArray &fontData); #endif private: diff --git a/tests/auto/gui/text/qfontdatabase/tst_qfontdatabase.cpp b/tests/auto/gui/text/qfontdatabase/tst_qfontdatabase.cpp index 81c402cd89a..fb61037c95d 100644 --- a/tests/auto/gui/text/qfontdatabase/tst_qfontdatabase.cpp +++ b/tests/auto/gui/text/qfontdatabase/tst_qfontdatabase.cpp @@ -12,6 +12,9 @@ #include #include #include +#include + +#include using namespace Qt::StringLiterals; @@ -513,11 +516,9 @@ void tst_QFontDatabase::findCourier() void tst_QFontDatabase::variableFont() { { - QFont f; - f.setStyleStrategy(QFont::NoFontMerging); - QFontPrivate *font_d = QFontPrivate::get(f); - if (!font_d->engineForScript(QChar::Script_Common)->supportsVariableApplicationFonts()) - QSKIP("Variable application fonts only supported on Freetype currently"); + QPlatformFontDatabase *pfdb = QGuiApplicationPrivate::platformIntegration()->fontDatabase(); + if (!pfdb->supportsVariableApplicationFonts()) + QSKIP("Variable application fonts not supported on this platform"); } int id = QFontDatabase::addApplicationFont(m_testFontVariable); diff --git a/tests/auto/shared/resources/testfont_variable.ttf b/tests/auto/shared/resources/testfont_variable.ttf index f183b9333d2fd6d23d2ea2040217a18ede618f74..70f764448422294666b5765e3f7f495726499ff0 100644 GIT binary patch delta 4951 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%0DkIlLRTkC)$fV zF;tX_-C{G7u(ZTn}@)tNV%t%8m&ymOu~VLGoa|6O(Qci*;>>@>_2CWtC4Jg12EAO=vYCkGsoD z*qK|uvv83+l(TRW+GG9W&WW9B#)W|lIGe-4jKdk+E8g$)FLs%BYMov1@|qO9JEf26 KSD9Hwp}zyO_Sy&l delta 6961 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