Windows: register alias for application font
Previously Qt didn't register an English name alias for application font files under Windows. Suppose we add an application font file using QFontDatabase::addApplicationFont(), the font family name returned by QFontDatabase::applicationFontFamilies() then was the English name of the font file, but the corresponding font family name returned by QFontDatabase::families() was the localized version. This prevented us from using the English font family to access the font since it was not registered as alias. Add an overload of populateFamily() which will register the English name of the application font file as alias. Task-number: QTBUG-47096 Change-Id: Idb89b7d8a419646c209426e826e7fd1ebee49662 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@theqtcompany.com> Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@theqtcompany.com>
This commit is contained in:
parent
6392927152
commit
4f15449bc2
@ -933,7 +933,7 @@ static bool addFontToDatabase(const QString &familyName, uchar charSet,
|
||||
}
|
||||
|
||||
static int QT_WIN_CALLBACK storeFont(ENUMLOGFONTEX* f, NEWTEXTMETRICEX *textmetric,
|
||||
int type, LPARAM)
|
||||
int type, LPARAM registerAlias)
|
||||
{
|
||||
const QString familyName = QString::fromWCharArray(f->elfLogFont.lfFaceName);
|
||||
const uchar charSet = f->elfLogFont.lfCharSet;
|
||||
@ -943,13 +943,13 @@ static int QT_WIN_CALLBACK storeFont(ENUMLOGFONTEX* f, NEWTEXTMETRICEX *textmetr
|
||||
// NEWTEXTMETRICEX is a NEWTEXTMETRIC, which according to the documentation is
|
||||
// identical to a TEXTMETRIC except for the last four members, which we don't use
|
||||
// anyway
|
||||
addFontToDatabase(familyName, charSet, (TEXTMETRIC *)textmetric, &signature, type, false);
|
||||
addFontToDatabase(familyName, charSet, (TEXTMETRIC *)textmetric, &signature, type, registerAlias);
|
||||
|
||||
// keep on enumerating
|
||||
return 1;
|
||||
}
|
||||
|
||||
void QWindowsFontDatabase::populateFamily(const QString &familyName)
|
||||
void QWindowsFontDatabase::populateFamily(const QString &familyName, bool registerAlias)
|
||||
{
|
||||
qCDebug(lcQpaFonts) << familyName;
|
||||
if (familyName.size() >= LF_FACESIZE) {
|
||||
@ -962,10 +962,15 @@ void QWindowsFontDatabase::populateFamily(const QString &familyName)
|
||||
familyName.toWCharArray(lf.lfFaceName);
|
||||
lf.lfFaceName[familyName.size()] = 0;
|
||||
lf.lfPitchAndFamily = 0;
|
||||
EnumFontFamiliesEx(dummy, &lf, (FONTENUMPROC)storeFont, 0, 0);
|
||||
EnumFontFamiliesEx(dummy, &lf, (FONTENUMPROC)storeFont, (LPARAM)registerAlias, 0);
|
||||
ReleaseDC(0, dummy);
|
||||
}
|
||||
|
||||
void QWindowsFontDatabase::populateFamily(const QString &familyName)
|
||||
{
|
||||
populateFamily(familyName, false);
|
||||
}
|
||||
|
||||
namespace {
|
||||
// Context for enumerating system fonts, records whether the default font has been encountered,
|
||||
// which is normally not enumerated by EnumFontFamiliesEx().
|
||||
@ -1382,7 +1387,7 @@ QStringList QWindowsFontDatabase::addApplicationFont(const QByteArray &fontData,
|
||||
|
||||
// Fonts based on files are added via populate, as they will show up in font enumeration.
|
||||
for (int j = 0; j < families.count(); ++j)
|
||||
populateFamily(families.at(j));
|
||||
populateFamily(families.at(j), true);
|
||||
}
|
||||
|
||||
m_applicationFonts << font;
|
||||
|
@ -100,6 +100,7 @@ public:
|
||||
static QString familyForStyleHint(QFont::StyleHint styleHint);
|
||||
|
||||
private:
|
||||
void populateFamily(const QString &familyName, bool registerAlias);
|
||||
void removeApplicationFonts();
|
||||
|
||||
struct WinApplicationFont {
|
||||
|
Loading…
Reference in New Issue
Block a user