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
parent
5f19e2c8f3
commit
4a46b15514
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue