Make QWindowsFontEngineData thread-local.

Task-number: QTBUG-29266

Change-Id: Id963187f1ef03caf4e9ed3c4397225a9ad7362bb
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com>
bb10
Friedemann Kleint 2013-01-24 14:37:15 +01:00 committed by The Qt Project
parent 05b4000e01
commit ff1b65a58c
2 changed files with 35 additions and 8 deletions

View File

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

View File

@ -106,7 +106,6 @@ public:
private:
void populate(const QString &family = QString());
void removeApplicationFonts();
QSharedPointer<QWindowsFontEngineData> m_fontEngineData;
QSet<QString> m_families;
struct WinApplicationFont {