summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@digia.com>2013-01-24 14:37:15 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-01-25 08:51:10 +0100
commitff1b65a58c21a77d00f75581a7492c2fafd67ae8 (patch)
tree9f1aa9d851a0498be785a3f86e014e539155b967
parent05b4000e01ff5785739617c3069fbe0b0d36a606 (diff)
Make QWindowsFontEngineData thread-local.
Task-number: QTBUG-29266 Change-Id: Id963187f1ef03caf4e9ed3c4397225a9ad7362bb Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com>
-rw-r--r--src/plugins/platforms/windows/qwindowsfontdatabase.cpp42
-rw-r--r--src/plugins/platforms/windows/qwindowsfontdatabase.h1
2 files changed, 35 insertions, 8 deletions
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 <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) {
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<QWindowsFontEngineData> m_fontEngineData;
QSet<QString> m_families;
struct WinApplicationFont {