Make QWindowsFontEngineData thread-local.
Task-number: QTBUG-29266 Change-Id: Id963187f1ef03caf4e9ed3c4397225a9ad7362bb Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com>bb10
parent
05b4000e01
commit
ff1b65a58c
|
|
@ -52,6 +52,7 @@
|
|||
#include <QtCore/qmath.h>
|
||||
#include <QtCore/QDebug>
|
||||
#include <QtCore/QtEndian>
|
||||
#include <QtCore/QThreadStorage>
|
||||
|
||||
#include <wchar.h>
|
||||
|
||||
|
|
@ -1112,8 +1113,33 @@ void QWindowsFontDatabase::populate(const QString &family)
|
|||
ReleaseDC(0, dummy);
|
||||
}
|
||||
|
||||
QWindowsFontDatabase::QWindowsFontDatabase() :
|
||||
m_fontEngineData(new QWindowsFontEngineData)
|
||||
typedef QSharedPointer<QWindowsFontEngineData> QWindowsFontEngineDataPtr;
|
||||
|
||||
#ifndef QT_NO_THREAD
|
||||
typedef QThreadStorage<QWindowsFontEngineDataPtr> FontEngineThreadLocalData;
|
||||
|
||||
Q_GLOBAL_STATIC(FontEngineThreadLocalData, fontEngineThreadLocalData)
|
||||
|
||||
QSharedPointer<QWindowsFontEngineData> sharedFontData()
|
||||
{
|
||||
FontEngineThreadLocalData *data = fontEngineThreadLocalData();
|
||||
if (!data->hasLocalData())
|
||||
data->setLocalData(QSharedPointer<QWindowsFontEngineData>(new QWindowsFontEngineData));
|
||||
return data->localData();
|
||||
}
|
||||
#else // !QT_NO_THREAD
|
||||
Q_GLOBAL_STATIC(QWindowsFontEngineDataPtr, fontEngineData)
|
||||
|
||||
QWindowsFontEngineDataPtr sharedFontData()
|
||||
{
|
||||
QWindowsFontEngineDataPtr *data = fontEngineData();
|
||||
if (data->isNull())
|
||||
*data = QWindowsFontEngineDataPtr(new QWindowsFontEngineData);
|
||||
return *data;
|
||||
}
|
||||
#endif // QT_NO_THREAD
|
||||
|
||||
QWindowsFontDatabase::QWindowsFontDatabase()
|
||||
{
|
||||
// Properties accessed by QWin32PrintEngine (QtPrintSupport)
|
||||
static const int hfontMetaTypeId = qRegisterMetaType<HFONT>();
|
||||
|
|
@ -1121,10 +1147,12 @@ QWindowsFontDatabase::QWindowsFontDatabase() :
|
|||
Q_UNUSED(hfontMetaTypeId)
|
||||
Q_UNUSED(logFontMetaTypeId)
|
||||
|
||||
if (QWindowsContext::verboseFonts)
|
||||
if (QWindowsContext::verboseFonts) {
|
||||
const QWindowsFontEngineDataPtr data = sharedFontData();
|
||||
qDebug() << __FUNCTION__ << "Clear type: "
|
||||
<< m_fontEngineData->clearTypeEnabled << "gamma: "
|
||||
<< m_fontEngineData->fontSmoothingGamma;
|
||||
<< data->clearTypeEnabled << "gamma: "
|
||||
<< data->fontSmoothingGamma;
|
||||
}
|
||||
}
|
||||
|
||||
QWindowsFontDatabase::~QWindowsFontDatabase()
|
||||
|
|
@ -1138,7 +1166,7 @@ QFontEngine * QWindowsFontDatabase::fontEngine(const QFontDef &fontDef,
|
|||
{
|
||||
QFontEngine *fe = QWindowsFontDatabase::createEngine(script, fontDef,
|
||||
0, QWindowsContext::instance()->defaultDPI(), false,
|
||||
QStringList(), m_fontEngineData);
|
||||
QStringList(), sharedFontData());
|
||||
if (QWindowsContext::verboseFonts)
|
||||
qDebug() << __FUNCTION__ << "FONTDEF" << fontDef << script << fe << handle;
|
||||
return fe;
|
||||
|
|
@ -1189,7 +1217,7 @@ QFontEngine *QWindowsFontDatabase::fontEngine(const QByteArray &fontData, qreal
|
|||
|
||||
fontEngine = QWindowsFontDatabase::createEngine(QUnicodeTables::Common, request, 0,
|
||||
QWindowsContext::instance()->defaultDPI(), false, QStringList(),
|
||||
m_fontEngineData);
|
||||
sharedFontData());
|
||||
|
||||
if (fontEngine) {
|
||||
if (request.family != fontEngine->fontDef.family) {
|
||||
|
|
|
|||
|
|
@ -106,7 +106,6 @@ public:
|
|||
private:
|
||||
void populate(const QString &family = QString());
|
||||
void removeApplicationFonts();
|
||||
QSharedPointer<QWindowsFontEngineData> m_fontEngineData;
|
||||
QSet<QString> m_families;
|
||||
|
||||
struct WinApplicationFont {
|
||||
|
|
|
|||
Loading…
Reference in New Issue