From 4a46b15514368a99295d1ca9a94927d8d6cf6cd8 Mon Sep 17 00:00:00 2001 From: Konstantin Ritt Date: Thu, 27 Mar 2014 13:57:36 +0200 Subject: Make QWindowsMultiFontEngine support deferred fallback families query This finishes 800232e1d3ebfbac28d07014a3c646ea00fcf6ad, which encovered a tricky issue in QFontEngineMultiQPA::createMultiFontEngine(). Task-number: QTBUG-37836 Change-Id: I6d432e09e755f5d9ded09752c4c092f4857ad224 Reviewed-by: Pierre Rossi Reviewed-by: Lars Knoll --- .../platforms/windows/qwindowsfontdatabase.cpp | 3 +-- .../platforms/windows/qwindowsfontengine.cpp | 29 +++------------------- src/plugins/platforms/windows/qwindowsfontengine.h | 10 +++----- 3 files changed, 9 insertions(+), 33 deletions(-) diff --git a/src/plugins/platforms/windows/qwindowsfontdatabase.cpp b/src/plugins/platforms/windows/qwindowsfontdatabase.cpp index 8f9ddc2168..1432dfdcd9 100644 --- a/src/plugins/platforms/windows/qwindowsfontdatabase.cpp +++ b/src/plugins/platforms/windows/qwindowsfontdatabase.cpp @@ -1040,8 +1040,7 @@ QWindowsFontDatabase::~QWindowsFontDatabase() QFontEngineMulti *QWindowsFontDatabase::fontEngineMulti(QFontEngine *fontEngine, QChar::Script script) { - Q_UNUSED(script) - return new QWindowsMultiFontEngine(fontEngine, QStringList()); + return new QWindowsMultiFontEngine(fontEngine, script); } QFontEngine * QWindowsFontDatabase::fontEngine(const QFontDef &fontDef, void *handle) diff --git a/src/plugins/platforms/windows/qwindowsfontengine.cpp b/src/plugins/platforms/windows/qwindowsfontengine.cpp index c3774064e3..4f3a007bd7 100644 --- a/src/plugins/platforms/windows/qwindowsfontengine.cpp +++ b/src/plugins/platforms/windows/qwindowsfontengine.cpp @@ -1278,35 +1278,14 @@ void QWindowsFontEngine::initFontInfo(const QFontDef &request, Will probably be superseded by a common Free Type font engine in Qt 5.X. */ - -QWindowsMultiFontEngine::QWindowsMultiFontEngine(QFontEngine *first, const QStringList &fallbacks) - : QFontEngineMulti(fallbacks.size() + 1), - fallbackFamilies(fallbacks) -{ - engines[0] = first; - first->ref.ref(); - fontDef = engines[0]->fontDef; - cache_cost = first->cache_cost; -} - -void QWindowsMultiFontEngine::setFallbackFamiliesList(const QStringList &fallbacks) +QWindowsMultiFontEngine::QWindowsMultiFontEngine(QFontEngine *fe, int script) + : QFontEngineMultiQPA(fe, script) { - // Original FontEngine to restore after the fill. - QFontEngine *fe = engines[0]; - fallbackFamilies = fallbacks; - if (!fallbackFamilies.isEmpty()) { - engines.fill(0, fallbackFamilies.size() + 1); - engines[0] = fe; - } else { - // Turns out we lied about having any fallback at all. - fallbackFamilies << fe->fontDef.family; - engines[1] = fe; - fe->ref.ref(); - } } void QWindowsMultiFontEngine::loadEngine(int at) { + ensureFallbackFamiliesQueried(); Q_ASSERT(at < engines.size()); Q_ASSERT(engines.at(at) == 0); @@ -1329,7 +1308,7 @@ void QWindowsMultiFontEngine::loadEngine(int at) data = fe->fontEngineData(); } - const QString fam = fallbackFamilies.at(at-1); + const QString fam = fallbackFamilyAt(at - 1); memcpy(lf.lfFaceName, fam.utf16(), sizeof(wchar_t) * qMin(fam.length() + 1, 32)); // 32 = Windows hard-coded #ifndef QT_NO_DIRECTWRITE diff --git a/src/plugins/platforms/windows/qwindowsfontengine.h b/src/plugins/platforms/windows/qwindowsfontengine.h index 7d93484220..7a0803830c 100644 --- a/src/plugins/platforms/windows/qwindowsfontengine.h +++ b/src/plugins/platforms/windows/qwindowsfontengine.h @@ -53,7 +53,7 @@ // We mean it. // -#include +#include #include #include @@ -166,15 +166,13 @@ private: mutable int designAdvancesSize; }; -class QWindowsMultiFontEngine : public QFontEngineMulti + +class QWindowsMultiFontEngine : public QFontEngineMultiQPA { public: - QWindowsMultiFontEngine(QFontEngine *first, const QStringList &fallbacks); + explicit QWindowsMultiFontEngine(QFontEngine *fe, int script); - void setFallbackFamiliesList(const QStringList &fallbacks); void loadEngine(int at); - - QStringList fallbackFamilies; }; QT_END_NAMESPACE -- cgit v1.2.3