diff options
-rw-r--r-- | src/gui/text/qfontdatabase.cpp | 14 | ||||
-rw-r--r-- | src/gui/text/windows/qwindowsfontdatabasebase.cpp | 29 | ||||
-rw-r--r-- | src/gui/text/windows/qwindowsfontdatabasebase_p.h | 2 | ||||
-rw-r--r-- | tests/auto/gui/text/qfontdatabase/tst_qfontdatabase.cpp | 31 |
4 files changed, 65 insertions, 11 deletions
diff --git a/src/gui/text/qfontdatabase.cpp b/src/gui/text/qfontdatabase.cpp index 887fb8eb2e..e2898b078c 100644 --- a/src/gui/text/qfontdatabase.cpp +++ b/src/gui/text/qfontdatabase.cpp @@ -62,6 +62,10 @@ #include <qtgui_tracepoints_p.h> +#ifdef Q_OS_WIN +#include <QtGui/private/qwindowsfontdatabasebase_p.h> +#endif + QT_BEGIN_NAMESPACE Q_LOGGING_CATEGORY(lcFontDb, "qt.text.font.db") @@ -2350,7 +2354,7 @@ bool QFontDatabase::removeAllApplicationFonts() /*! \internal */ -QFontEngine *QFontDatabasePrivate::findFont(const QFontDef &request, +QFontEngine *QFontDatabasePrivate::findFont(const QFontDef &req, int script, bool preferScriptOverFamily) { @@ -2361,6 +2365,14 @@ QFontEngine *QFontDatabasePrivate::findFont(const QFontDef &request, QFontEngine *engine; +#ifdef Q_OS_WIN + const QFontDef request = static_cast<QWindowsFontDatabaseBase *>( + QGuiApplicationPrivate::platformIntegration()->fontDatabase()) + ->sanitizeRequest(req); +#else + const QFontDef &request = req; +#endif + #if defined(QT_BUILD_INTERNAL) // For testing purpose only, emulates an exact-matching monospace font if (qt_enable_test_font && request.families.first() == QLatin1String("__Qt__Box__Engine__")) { diff --git a/src/gui/text/windows/qwindowsfontdatabasebase.cpp b/src/gui/text/windows/qwindowsfontdatabasebase.cpp index 49586063b9..47ef300cfa 100644 --- a/src/gui/text/windows/qwindowsfontdatabasebase.cpp +++ b/src/gui/text/windows/qwindowsfontdatabasebase.cpp @@ -696,16 +696,6 @@ LOGFONT QWindowsFontDatabaseBase::fontDefToLOGFONT(const QFontDef &request, cons fam.truncate(LF_FACESIZE - 1); } - if (fam.isEmpty()) - fam = QStringLiteral("MS Sans Serif"); - - if (fam == QLatin1String("MS Sans Serif") - && (request.style == QFont::StyleItalic || (-lf.lfHeight > 18 && -lf.lfHeight != 24))) { - fam = QStringLiteral("Arial"); // MS Sans Serif has bearing problems in italic, and does not scale - } - if (fam == QLatin1String("Courier") && !(request.styleStrategy & QFont::PreferBitmap)) - fam = QStringLiteral("Courier New"); - memcpy(lf.lfFaceName, fam.utf16(), fam.size() * sizeof(wchar_t)); return lf; @@ -947,4 +937,23 @@ QStringList QWindowsFontDatabaseBase::extraTryFontsForFamily(const QString &fami return result; } +QFontDef QWindowsFontDatabaseBase::sanitizeRequest(QFontDef request) const +{ + QFontDef req = request; + const QString fam = request.families.front(); + if (fam.isEmpty()) + req.families[0] = QStringLiteral("MS Sans Serif"); + + if (fam == QLatin1String("MS Sans Serif")) { + int height = -qRound(request.pixelSize); + // MS Sans Serif has bearing problems in italic, and does not scale + if (request.style == QFont::StyleItalic || (height > 18 && height != 24)) + req.families[0] = QStringLiteral("Arial"); + } + + if (!(request.styleStrategy & QFont::StyleStrategy::PreferBitmap) && fam == u"Courier") + req.families[0] = QStringLiteral("Courier New"); + return req; +} + QT_END_NAMESPACE diff --git a/src/gui/text/windows/qwindowsfontdatabasebase_p.h b/src/gui/text/windows/qwindowsfontdatabasebase_p.h index 873912f8ef..158991a796 100644 --- a/src/gui/text/windows/qwindowsfontdatabasebase_p.h +++ b/src/gui/text/windows/qwindowsfontdatabasebase_p.h @@ -122,6 +122,8 @@ public: QByteArray m_fontData; }; + QFontDef sanitizeRequest(QFontDef request) const; + protected: #if QT_CONFIG(directwrite) diff --git a/tests/auto/gui/text/qfontdatabase/tst_qfontdatabase.cpp b/tests/auto/gui/text/qfontdatabase/tst_qfontdatabase.cpp index 6b6ad201bf..5a18260ffc 100644 --- a/tests/auto/gui/text/qfontdatabase/tst_qfontdatabase.cpp +++ b/tests/auto/gui/text/qfontdatabase/tst_qfontdatabase.cpp @@ -84,6 +84,10 @@ private slots: void stretchRespected(); +#ifdef Q_OS_WIN + void findCourier(); +#endif + private: QString m_ledFont; QString m_testFont; @@ -500,5 +504,32 @@ void tst_QFontDatabase::registerOpenTypePreferredNamesApplication() QFontDatabase::removeApplicationFont(id); } +#ifdef Q_OS_WIN +void tst_QFontDatabase::findCourier() +{ + QFont font = QFontDatabase::font(u"Courier"_qs, u""_qs, 16); + QFontInfo info(font); + QCOMPARE(info.family(), u"Courier New"_qs); + QCOMPARE(info.pointSize(), 16); + + font = QFontDatabase::font("Courier", "", 64); + info = font; + QCOMPARE(info.family(), u"Courier New"_qs); + QCOMPARE(info.pointSize(), 64); + + // By setting "PreferBitmap" we should get Courier itself. + font.setStyleStrategy(QFont::PreferBitmap); + info = font; + QCOMPARE(info.family(), u"Courier"_qs); + // Which has an upper bound on point size + QCOMPARE(info.pointSize(), 19); + + font.setStyleStrategy(QFont::PreferDefault); + info = font; + QCOMPARE(info.family(), u"Courier New"_qs); + QCOMPARE(info.pointSize(), 64); +} +#endif + QTEST_MAIN(tst_QFontDatabase) #include "tst_qfontdatabase.moc" |