From 6493bcaf3ca4d233be4f3bfd8d16d860f47e8aa7 Mon Sep 17 00:00:00 2001 From: Konstantin Ritt Date: Wed, 27 Apr 2016 15:09:55 +0400 Subject: Check for required capability only when FC_CAPABILITY is available If, by some reason, querying FC_CAPABILITY has failed, believe FC_LANG unconditionally. Change-Id: Idf94150359dff555f2a50ccaf146722407f43477 Reviewed-by: Eskil Abrahamsen Blomfeldt --- src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/platformsupport/fontdatabases') diff --git a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp index 5305b8b970..fc04f3ab79 100644 --- a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp +++ b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp @@ -441,7 +441,7 @@ static void populateFromPattern(FcPattern *pattern) && requiresOpenType(j) && openType[j]) { FcChar8 *cap; res = FcPatternGetString (pattern, FC_CAPABILITY, 0, &cap); - if (res != FcResultMatch || !strstr((const char *)cap, openType[j])) + if (res == FcResultMatch && strstr(reinterpret_cast(cap), openType[j]) == 0) writingSystems.setSupported(QFontDatabase::WritingSystem(j),false); } } -- cgit v1.2.3 From 75bd795c9f6e5b970168605c9d6c41e60b28179a Mon Sep 17 00:00:00 2001 From: Konstantin Ritt Date: Wed, 27 Apr 2016 15:16:39 +0400 Subject: Query FC_CAPABILITY once per pattern Change-Id: I5f1219d5a476f1bd09e8c01847fe886f342b28a0 Reviewed-by: Eskil Abrahamsen Blomfeldt --- src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'src/platformsupport/fontdatabases') diff --git a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp index fc04f3ab79..c15e0a1183 100644 --- a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp +++ b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp @@ -436,11 +436,12 @@ static void populateFromPattern(FcPattern *pattern) } #if FC_VERSION >= 20297 + FcChar8 *cap = Q_NULLPTR; for (int j = 1; j < QFontDatabase::WritingSystemsCount; ++j) { if (writingSystems.supported(QFontDatabase::WritingSystem(j)) && requiresOpenType(j) && openType[j]) { - FcChar8 *cap; - res = FcPatternGetString (pattern, FC_CAPABILITY, 0, &cap); + if (cap == Q_NULLPTR) + res = FcPatternGetString(pattern, FC_CAPABILITY, 0, &cap); if (res == FcResultMatch && strstr(reinterpret_cast(cap), openType[j]) == 0) writingSystems.setSupported(QFontDatabase::WritingSystem(j),false); } -- cgit v1.2.3 From db2764db3466221ad680d63ff2224cdd016fc351 Mon Sep 17 00:00:00 2001 From: Konstantin Ritt Date: Wed, 27 Apr 2016 15:18:29 +0400 Subject: Get rid of requiresOpenType() helper There is already an array of writing systems for which GSUB|GPOS table is required (also rename it from "openType" to "capabilityForWritingSystem", to reflect its meaning). Change-Id: I7cfd4a80d5ca13f9312b3644b2bd738d6015c71c Reviewed-by: Eskil Abrahamsen Blomfeldt --- .../fontconfig/qfontconfigdatabase.cpp | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) (limited to 'src/platformsupport/fontdatabases') diff --git a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp index c15e0a1183..ca79224850 100644 --- a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp +++ b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp @@ -62,12 +62,6 @@ static inline int mapToQtWeightForRange(int fcweight, int fcLower, int fcUpper, return qtLower + ((fcweight - fcLower) * (qtUpper - qtLower)) / (fcUpper - fcLower); } -static inline bool requiresOpenType(int writingSystem) -{ - return ((writingSystem >= QFontDatabase::Syriac && writingSystem <= QFontDatabase::Sinhala) - || writingSystem == QFontDatabase::Khmer || writingSystem == QFontDatabase::Nko); -} - static inline int weightFromFcWeight(int fcweight) { // Font Config uses weights from 0 to 215 (the highest enum value) while QFont ranges from @@ -293,10 +287,10 @@ static const char *languageForWritingSystem[] = { Q_STATIC_ASSERT(sizeof(languageForWritingSystem) / sizeof(const char *) == QFontDatabase::WritingSystemsCount); #if FC_VERSION >= 20297 -// Newer FontConfig let's us sort out fonts that contain certain glyphs, but no -// open type tables for is directly. Do this so we don't pick some strange -// pseudo unicode font -static const char *openType[] = { +// Newer FontConfig let's us sort out fonts that report certain scripts support, +// but no open type tables for handling them correctly. +// Check the reported script presence in the FC_CAPABILITY's "otlayout:" section. +static const char *capabilityForWritingSystem[] = { 0, // Any 0, // Latin 0, // Greek @@ -332,7 +326,7 @@ static const char *openType[] = { 0, // Runic "nko " // N'Ko }; -Q_STATIC_ASSERT(sizeof(openType) / sizeof(const char *) == QFontDatabase::WritingSystemsCount); +Q_STATIC_ASSERT(sizeof(capabilityForWritingSystem) / sizeof(*capabilityForWritingSystem) == QFontDatabase::WritingSystemsCount); #endif static const char *getFcFamilyForStyleHint(const QFont::StyleHint style) @@ -438,11 +432,10 @@ static void populateFromPattern(FcPattern *pattern) #if FC_VERSION >= 20297 FcChar8 *cap = Q_NULLPTR; for (int j = 1; j < QFontDatabase::WritingSystemsCount; ++j) { - if (writingSystems.supported(QFontDatabase::WritingSystem(j)) - && requiresOpenType(j) && openType[j]) { + if (capabilityForWritingSystem[j] && writingSystems.supported(QFontDatabase::WritingSystem(j))) { if (cap == Q_NULLPTR) res = FcPatternGetString(pattern, FC_CAPABILITY, 0, &cap); - if (res == FcResultMatch && strstr(reinterpret_cast(cap), openType[j]) == 0) + if (res == FcResultMatch && strstr(reinterpret_cast(cap), capabilityForWritingSystem[j]) == 0) writingSystems.setSupported(QFontDatabase::WritingSystem(j),false); } } -- cgit v1.2.3 From 4c6324b5a770254ac66f80583bcdce9cb5e282c4 Mon Sep 17 00:00:00 2001 From: Konstantin Ritt Date: Wed, 27 Apr 2016 15:25:07 +0400 Subject: Micro optimization to QFontconfigDatabase Do not set WritingSystem supported just to unset it afterwards; test in-place and fallback gracefully. Change-Id: I6910019c08fcf3909b924c27271547aae2ea0ff1 Reviewed-by: Eskil Abrahamsen Blomfeldt --- .../fontconfig/qfontconfigdatabase.cpp | 24 +++++++++++----------- 1 file changed, 12 insertions(+), 12 deletions(-) (limited to 'src/platformsupport/fontdatabases') diff --git a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp index ca79224850..8ebabf3419 100644 --- a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp +++ b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp @@ -409,11 +409,23 @@ static void populateFromPattern(FcPattern *pattern) FcResult res = FcPatternGetLangSet(pattern, FC_LANG, 0, &langset); if (res == FcResultMatch) { bool hasLang = false; +#if FC_VERSION >= 20297 + FcChar8 *cap = Q_NULLPTR; + FcResult capRes = FcResultNoMatch; +#endif for (int j = 1; j < QFontDatabase::WritingSystemsCount; ++j) { const FcChar8 *lang = (const FcChar8*) languageForWritingSystem[j]; if (lang) { FcLangResult langRes = FcLangSetHasLang(langset, lang); if (langRes != FcLangDifferentLang) { +#if FC_VERSION >= 20297 + if (capabilityForWritingSystem[j] != Q_NULLPTR) { + if (cap == Q_NULLPTR) + capRes = FcPatternGetString(pattern, FC_CAPABILITY, 0, &cap); + if (capRes == FcResultMatch && strstr(reinterpret_cast(cap), capabilityForWritingSystem[j]) == 0) + continue; + } +#endif writingSystems.setSupported(QFontDatabase::WritingSystem(j)); hasLang = true; } @@ -429,18 +441,6 @@ static void populateFromPattern(FcPattern *pattern) writingSystems.setSupported(QFontDatabase::Other); } -#if FC_VERSION >= 20297 - FcChar8 *cap = Q_NULLPTR; - for (int j = 1; j < QFontDatabase::WritingSystemsCount; ++j) { - if (capabilityForWritingSystem[j] && writingSystems.supported(QFontDatabase::WritingSystem(j))) { - if (cap == Q_NULLPTR) - res = FcPatternGetString(pattern, FC_CAPABILITY, 0, &cap); - if (res == FcResultMatch && strstr(reinterpret_cast(cap), capabilityForWritingSystem[j]) == 0) - writingSystems.setSupported(QFontDatabase::WritingSystem(j),false); - } - } -#endif - FontFile *fontFile = new FontFile; fontFile->fileName = QString::fromLocal8Bit((const char *)file_value); fontFile->indexValue = indexValue; -- cgit v1.2.3