From 036639c2b575de238a519cb029c4ba70d4c8980d Mon Sep 17 00:00:00 2001 From: Eskil Abrahamsen Blomfeldt Date: Wed, 21 Sep 2016 14:55:00 +0200 Subject: Windows/freetype: Fix loading non-regular fonts When resolving the filenames of fonts, we would first match against the font face name, meaning that an italic font, for instance would always be matched to the file of the regular font in the same face. To fix this, we look up the full name in the file name cache first, before the face name. Also, since the font names in the registry are the English names, but the names we get when enumerating the fonts on the system can be localized on non-English locales, we need to translate the full name of the font before we give up on matching it against the registry. Since this can be a heavy operation, we add a cut-off which skips resolving the English name when the style is one of the most common "Italic" or "Bold" since we know these to be English. [ChangeLog][QtGui][Windows] Fix selecting non-regular fonts when using the Freetype engine. Task-number: QTBUG-47485 Change-Id: If897abb93dc93263902b1c62bc3f66c4d06721c2 Reviewed-by: Friedemann Kleint Reviewed-by: Lars Knoll Reviewed-by: Allan Sandfeld Jensen --- src/plugins/platforms/windows/qwindowsfontdatabase.cpp | 9 +++++++-- .../platforms/windows/qwindowsfontdatabase_ft.cpp | 16 +++++++++++++--- 2 files changed, 20 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/plugins/platforms/windows/qwindowsfontdatabase.cpp b/src/plugins/platforms/windows/qwindowsfontdatabase.cpp index 9f2d0c8a33..04b9530890 100644 --- a/src/plugins/platforms/windows/qwindowsfontdatabase.cpp +++ b/src/plugins/platforms/windows/qwindowsfontdatabase.cpp @@ -908,7 +908,7 @@ static FontNames getCanonicalFontNames(const uchar *table, quint32 bytes) } // namespace -QString getEnglishName(const QString &familyName) +QString getEnglishName(const QString &familyName, bool includeStyle = false) { QString i18n_name; QString faceName = familyName; @@ -946,7 +946,12 @@ QString getEnglishName(const QString &familyName) if ( bytes == GDI_ERROR ) goto error; - i18n_name = getCanonicalFontNames(table, bytes).name; + { + const FontNames names = getCanonicalFontNames(table, bytes); + i18n_name = names.name; + if (includeStyle) + i18n_name += QLatin1Char(' ') + names.style; + } error: delete [] table; SelectObject( hdc, oldobj ); diff --git a/src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp b/src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp index 4d8966f934..f7c8dbdf23 100644 --- a/src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp +++ b/src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp @@ -102,7 +102,7 @@ static FontFile * createFontFile(const QString &fileName, int index) } extern bool localizedName(const QString &name); -extern QString getEnglishName(const QString &familyName); +extern QString getEnglishName(const QString &familyName, bool includeStyle = false); namespace { struct FontKey @@ -235,9 +235,19 @@ static bool addFontToDatabase(const QString &faceName, } int index = 0; - const FontKey *key = findFontKey(faceName, &index); + const FontKey *key = findFontKey(fullName, &index); if (!key) { - key = findFontKey(fullName, &index); + // On non-English locales, the styles of the font may be localized in enumeration, but + // not in the registry. + QLocale systemLocale = QLocale::system(); + if (systemLocale.language() != QLocale::C + && systemLocale.language() != QLocale::English + && styleName != QLatin1String("Italic") + && styleName != QLatin1String("Bold")) { + key = findFontKey(getEnglishName(fullName, true), &index); + } + if (!key) + key = findFontKey(faceName, &index); if (!key && !registerAlias && englishName.isEmpty() && localizedName(faceName)) englishName = getEnglishName(faceName); if (!key && !englishName.isEmpty()) -- cgit v1.2.3