diff options
author | Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io> | 2020-02-07 07:53:17 +0100 |
---|---|---|
committer | Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io> | 2020-02-20 06:38:13 +0100 |
commit | 2f521438ebe5306d97b24a530ed4dc025b12052b (patch) | |
tree | 51d6e8ef46aa379f2d8a9beed5c277e92caf16fe /src/gui | |
parent | 63a559845ce33b054d3f6d8b3c2b80f05eeffb16 (diff) |
DirectWrite font db: Fix writing system detection
The implementation here was accidentally missing from the
first commit. We use the OS/2 table for determining the writing system
support as intended by the font designer, and fall back to actually
checking the Unicode ranges if the table should be missing.
Change-Id: Ibfdf76c27f3a94eda2142b3e269a1ca30d4bc045
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src/gui')
-rw-r--r-- | src/gui/text/qfontdatabase.cpp | 17 | ||||
-rw-r--r-- | src/gui/text/qplatformfontdatabase.cpp | 26 | ||||
-rw-r--r-- | src/gui/text/qplatformfontdatabase.h | 1 |
3 files changed, 36 insertions, 8 deletions
diff --git a/src/gui/text/qfontdatabase.cpp b/src/gui/text/qfontdatabase.cpp index 29f56f5c85..a43af37097 100644 --- a/src/gui/text/qfontdatabase.cpp +++ b/src/gui/text/qfontdatabase.cpp @@ -617,6 +617,12 @@ static bool familySupportsWritingSystem(QtFontFamily *family, size_t writingSyst return false; } +Q_GUI_EXPORT QFontDatabase::WritingSystem qt_writing_system_for_script(int script) +{ + return QFontDatabase::WritingSystem(std::find(scriptForWritingSystem, + scriptForWritingSystem + QFontDatabase::WritingSystemsCount, + script) - scriptForWritingSystem); +} /*! \internal @@ -833,9 +839,7 @@ QStringList QPlatformFontDatabase::fallbacksForFamily(const QString &family, QFo QStringList preferredFallbacks; QStringList otherFallbacks; - size_t writingSystem = std::find(scriptForWritingSystem, - scriptForWritingSystem + QFontDatabase::WritingSystemsCount, - script) - scriptForWritingSystem; + auto writingSystem = qt_writing_system_for_script(script); if (writingSystem >= QFontDatabase::WritingSystemsCount) writingSystem = QFontDatabase::Any; @@ -1272,8 +1276,7 @@ static int match(int script, const QFontDef &request, load(family_name, script); - size_t writingSystem = std::find(scriptForWritingSystem, scriptForWritingSystem + - QFontDatabase::WritingSystemsCount, script) - scriptForWritingSystem; + auto writingSystem = qt_writing_system_for_script(script); if (writingSystem >= QFontDatabase::WritingSystemsCount) writingSystem = QFontDatabase::Any; @@ -2876,9 +2879,7 @@ QString QFontDatabase::resolveFontFamilyAlias(const QString &family) Q_GUI_EXPORT QStringList qt_sort_families_by_writing_system(QChar::Script script, const QStringList &families) { - size_t writingSystem = std::find(scriptForWritingSystem, - scriptForWritingSystem + QFontDatabase::WritingSystemsCount, - script) - scriptForWritingSystem; + size_t writingSystem = qt_writing_system_for_script(script); if (writingSystem == QFontDatabase::Any || writingSystem >= QFontDatabase::WritingSystemsCount) { return families; diff --git a/src/gui/text/qplatformfontdatabase.cpp b/src/gui/text/qplatformfontdatabase.cpp index 48ba8987f3..4ff2ad3a41 100644 --- a/src/gui/text/qplatformfontdatabase.cpp +++ b/src/gui/text/qplatformfontdatabase.cpp @@ -534,6 +534,32 @@ enum CsbBits { }; /*! + Helper function that determines the writing system support based on the contents of the OS/2 table + in the font. + + \since 6.0 +*/ +QSupportedWritingSystems QPlatformFontDatabase::writingSystemsFromOS2Table(const char *os2Table, size_t length) +{ + if (length >= 86) { + quint32 unicodeRange[4] = { + qFromBigEndian<quint32>(os2Table + 42), + qFromBigEndian<quint32>(os2Table + 46), + qFromBigEndian<quint32>(os2Table + 50), + qFromBigEndian<quint32>(os2Table + 54) + }; + quint32 codePageRange[2] = { + qFromBigEndian<quint32>(os2Table + 78), + qFromBigEndian<quint32>(os2Table + 82) + }; + + return writingSystemsFromTrueTypeBits(unicodeRange, codePageRange); + } + + return QSupportedWritingSystems(); +} + +/*! Helper function that determines the writing systems support by a given \a unicodeRange and \a codePageRange. diff --git a/src/gui/text/qplatformfontdatabase.h b/src/gui/text/qplatformfontdatabase.h index f79c5db625..d05bcb372b 100644 --- a/src/gui/text/qplatformfontdatabase.h +++ b/src/gui/text/qplatformfontdatabase.h @@ -127,6 +127,7 @@ public: // helper static QSupportedWritingSystems writingSystemsFromTrueTypeBits(quint32 unicodeRange[4], quint32 codePageRange[2]); + static QSupportedWritingSystems writingSystemsFromOS2Table(const char *os2Table, size_t length); static QFont::Weight weightFromInteger(int weight); //callback |