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:
parent
27d2593e6d
commit
036639c2b5
@ -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 );
|
||||
|
@ -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())
|
||||
|
Loading…
Reference in New Issue
Block a user