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:
Jian Liang 2015-07-07 22:23:33 +08:00 committed by jian liang
parent 6392927152
commit 4f15449bc2
2 changed files with 11 additions and 5 deletions

View File

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

View File

@ -100,6 +100,7 @@ public:
static QString familyForStyleHint(QFont::StyleHint styleHint);
private:
void populateFamily(const QString &familyName, bool registerAlias);
void removeApplicationFonts();
struct WinApplicationFont {