From ff1b65a58c21a77d00f75581a7492c2fafd67ae8 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Thu, 24 Jan 2013 14:37:15 +0100 Subject: Make QWindowsFontEngineData thread-local. Task-number: QTBUG-29266 Change-Id: Id963187f1ef03caf4e9ed3c4397225a9ad7362bb Reviewed-by: Eskil Abrahamsen Blomfeldt --- .../platforms/windows/qwindowsfontdatabase.cpp | 42 ++++++++++++++++++---- .../platforms/windows/qwindowsfontdatabase.h | 1 - 2 files changed, 35 insertions(+), 8 deletions(-) (limited to 'src/plugins') diff --git a/src/plugins/platforms/windows/qwindowsfontdatabase.cpp b/src/plugins/platforms/windows/qwindowsfontdatabase.cpp index b5b2232702..2d68c4684a 100644 --- a/src/plugins/platforms/windows/qwindowsfontdatabase.cpp +++ b/src/plugins/platforms/windows/qwindowsfontdatabase.cpp @@ -52,6 +52,7 @@ #include #include #include +#include #include @@ -1112,8 +1113,33 @@ void QWindowsFontDatabase::populate(const QString &family) ReleaseDC(0, dummy); } -QWindowsFontDatabase::QWindowsFontDatabase() : - m_fontEngineData(new QWindowsFontEngineData) +typedef QSharedPointer QWindowsFontEngineDataPtr; + +#ifndef QT_NO_THREAD +typedef QThreadStorage FontEngineThreadLocalData; + +Q_GLOBAL_STATIC(FontEngineThreadLocalData, fontEngineThreadLocalData) + +QSharedPointer sharedFontData() +{ + FontEngineThreadLocalData *data = fontEngineThreadLocalData(); + if (!data->hasLocalData()) + data->setLocalData(QSharedPointer(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(); @@ -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) { diff --git a/src/plugins/platforms/windows/qwindowsfontdatabase.h b/src/plugins/platforms/windows/qwindowsfontdatabase.h index 32b650595b..c14d6027c2 100644 --- a/src/plugins/platforms/windows/qwindowsfontdatabase.h +++ b/src/plugins/platforms/windows/qwindowsfontdatabase.h @@ -106,7 +106,6 @@ public: private: void populate(const QString &family = QString()); void removeApplicationFonts(); - QSharedPointer m_fontEngineData; QSet m_families; struct WinApplicationFont { -- cgit v1.2.3