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 <Friedemann.Kleint@qt.io>
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
This commit is contained in:
Eskil Abrahamsen Blomfeldt 2016-09-21 14:55:00 +02:00
parent 27d2593e6d
commit 036639c2b5
2 changed files with 20 additions and 5 deletions

View File

@ -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 );

View File

@ -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())