diff options
Diffstat (limited to 'src/plugins/platforms/windows/qwindowsfontdatabase.cpp')
-rw-r--r-- | src/plugins/platforms/windows/qwindowsfontdatabase.cpp | 44 |
1 files changed, 36 insertions, 8 deletions
diff --git a/src/plugins/platforms/windows/qwindowsfontdatabase.cpp b/src/plugins/platforms/windows/qwindowsfontdatabase.cpp index a3ec31a243..c1c906523f 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,19 +1113,46 @@ 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() { - // Properties accessed by QWin32PrintEngine (QtPrintSupport) + QWindowsFontEngineDataPtr *data = fontEngineData(); + if (data->isNull()) + *data = QWindowsFontEngineDataPtr(new QWindowsFontEngineData); + return *data; +} +#endif // QT_NO_THREAD + +QWindowsFontDatabase::QWindowsFontDatabase() +{ + // Properties accessed by QWin32PrintEngine (Qt Print Support) static const int hfontMetaTypeId = qRegisterMetaType<HFONT>(); static const int logFontMetaTypeId = qRegisterMetaType<LOGFONT>(); 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() @@ -1136,7 +1164,7 @@ QFontEngine * QWindowsFontDatabase::fontEngine(const QFontDef &fontDef, QChar::S { 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; @@ -1187,7 +1215,7 @@ QFontEngine *QWindowsFontDatabase::fontEngine(const QByteArray &fontData, qreal fontEngine = QWindowsFontDatabase::createEngine(QChar::Script_Common, request, 0, QWindowsContext::instance()->defaultDPI(), false, QStringList(), - m_fontEngineData); + sharedFontData()); if (fontEngine) { if (request.family != fontEngine->fontDef.family) { |