Make QWindowsMultiFontEngine support deferred fallback families query

This finishes 800232e1d3, which encovered
a tricky issue in QFontEngineMultiQPA::createMultiFontEngine().

Task-number: QTBUG-37836
Change-Id: I6d432e09e755f5d9ded09752c4c092f4857ad224
Reviewed-by: Pierre Rossi <pierre.rossi@gmail.com>
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
bb10
Konstantin Ritt 2014-03-27 13:57:36 +02:00 committed by The Qt Project
parent 5f19e2c8f3
commit 4a46b15514
3 changed files with 9 additions and 33 deletions

View File

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

View File

@ -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)
QWindowsMultiFontEngine::QWindowsMultiFontEngine(QFontEngine *fe, int script)
: QFontEngineMultiQPA(fe, script)
{
engines[0] = first;
first->ref.ref();
fontDef = engines[0]->fontDef;
cache_cost = first->cache_cost;
}
void QWindowsMultiFontEngine::setFallbackFamiliesList(const QStringList &fallbacks)
{
// 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

View File

@ -53,7 +53,7 @@
// We mean it.
//
#include <QtGui/private/qfontengine_p.h>
#include <QtGui/private/qfontengine_qpa_p.h>
#include <QtGui/QImage>
#include <QtCore/QSharedPointer>
@ -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