summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp
diff options
context:
space:
mode:
authorVladimir <riuson@gmail.com>2014-08-20 15:06:30 +0600
committerVladimir N <riuson@gmail.com>2014-09-28 16:41:05 +0200
commit8456adf0eeb9df8dd5f0547d4ad5a81888295f03 (patch)
tree79bfee0cf183b3e1242555309eef8415861d1133 /src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp
parent15fc84c48b090d01f9a67901d21a20429eb1a62b (diff)
Fix font enumeration, with the same family name, on Windows.
Function EnumFontFamiliesEx with parameters (lfCharSet = DEFAULT_CHARSET, lfFaceName = '\0') enumerates only first installed font from many with same family name. This patch calls EnumFontFamiliesEx twice: 1. Without family name to enumerate families; 2. With family name to enumerate fonts with same family. Task-number: QTBUG-40828 Change-Id: Ic36a24a9e70f735a7324c05fe4b70f7c7e5710d0 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com> Reviewed-by: Allan Sandfeld Jensen <allan.jensen@digia.com>
Diffstat (limited to 'src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp')
-rw-r--r--src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp36
1 files changed, 34 insertions, 2 deletions
diff --git a/src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp b/src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp
index 99c9e0faba..011fc9facb 100644
--- a/src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp
+++ b/src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp
@@ -375,6 +375,31 @@ static int QT_WIN_CALLBACK storeFont(ENUMLOGFONTEX* f, NEWTEXTMETRICEX *textmetr
return 1;
}
+static int QT_WIN_CALLBACK storeFontSub(ENUMLOGFONTEX* f, NEWTEXTMETRICEX *textmetric,
+ int type, LPARAM namesSetIn)
+{
+ Q_UNUSED(textmetric)
+ Q_UNUSED(type)
+
+ HDC dummy = GetDC(0);
+ LOGFONT lf;
+ lf.lfCharSet = DEFAULT_CHARSET;
+ if (wcslen(f->elfLogFont.lfFaceName) >= LF_FACESIZE) {
+ qWarning("%s: Unable to enumerate family '%s'.",
+ __FUNCTION__, qPrintable(QString::fromWCharArray(f->elfLogFont.lfFaceName)));
+ return 1;
+ }
+ wmemcpy(lf.lfFaceName, f->elfLogFont.lfFaceName,
+ wcslen(f->elfLogFont.lfFaceName) + 1);
+ lf.lfPitchAndFamily = 0;
+ EnumFontFamiliesEx(dummy, &lf, (FONTENUMPROC)storeFont,
+ (LPARAM)namesSetIn, 0);
+ ReleaseDC(0, dummy);
+
+ // keep on enumerating
+ return 1;
+}
+
void QWindowsFontDatabaseFT::populateFontDatabase()
{
m_families.clear();
@@ -409,8 +434,15 @@ void QWindowsFontDatabaseFT::populate(const QString &family)
wmemcpy(lf.lfFaceName, reinterpret_cast<const wchar_t*>(family.utf16()),
family.size() + 1);
lf.lfPitchAndFamily = 0;
- EnumFontFamiliesEx(dummy, &lf, (FONTENUMPROC)storeFont,
- (LPARAM)&m_families, 0);
+
+ if (family.isEmpty()) {
+ EnumFontFamiliesEx(dummy, &lf, (FONTENUMPROC)storeFontSub,
+ (LPARAM)&m_families, 0);
+ } else {
+ EnumFontFamiliesEx(dummy, &lf, (FONTENUMPROC)storeFont,
+ (LPARAM)&m_families, 0);
+ }
+
ReleaseDC(0, dummy);
}