summaryrefslogtreecommitdiffstats
path: root/src/gui/text/qrawfont.cpp
diff options
context:
space:
mode:
authorKonstantin Ritt <ritt.ks@gmail.com>2014-11-21 10:34:22 +0400
committerKonstantin Ritt <ritt.ks@gmail.com>2014-12-13 01:29:32 +0100
commit384388f2cd739fd1416e4016588c79fd9788e898 (patch)
treef05e0b3436ff129e18e300e54367dc3c1f2251eb /src/gui/text/qrawfont.cpp
parent37490d465b203ac109f422b482eda9704f4e8593 (diff)
Make QRawFont usage safer in a multi-threaded environment
QFontEngine must be accessed amd deleted only in a thread in which it was instantiated, so we remember that thread and check if it hasn't been changed every time we access the engine. Change-Id: I28bc0394ced9cbd437dc950d35ffcbd99cfa7152 Reviewed-by: Pierre Rossi <pierre.rossi@theqtcompany.com> Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'src/gui/text/qrawfont.cpp')
-rw-r--r--src/gui/text/qrawfont.cpp31
1 files changed, 5 insertions, 26 deletions
diff --git a/src/gui/text/qrawfont.cpp b/src/gui/text/qrawfont.cpp
index 0c3c9bb493..d21138e7ac 100644
--- a/src/gui/text/qrawfont.cpp
+++ b/src/gui/text/qrawfont.cpp
@@ -247,7 +247,6 @@ void QRawFont::loadFromData(const QByteArray &fontData,
d.detach();
d->cleanUp();
d->hintingPreference = hintingPreference;
- d->thread = QThread::currentThread();
d->loadFromData(fontData, pixelSize, hintingPreference);
}
@@ -700,8 +699,7 @@ QRawFont QRawFont::fromFont(const QFont &font, QFontDatabase::WritingSystem writ
}
if (fe != 0) {
- rawFont.d.data()->fontEngine = fe;
- rawFont.d.data()->fontEngine->ref.ref();
+ rawFont.d.data()->setFontEngine(fe);
rawFont.d.data()->hintingPreference = font.hintingPreference();
}
return rawFont;
@@ -712,42 +710,23 @@ QRawFont QRawFont::fromFont(const QFont &font, QFontDatabase::WritingSystem writ
*/
void QRawFont::setPixelSize(qreal pixelSize)
{
- if (d->fontEngine == 0 || qFuzzyCompare(d->fontEngine->fontDef.pixelSize, pixelSize))
+ if (!d->isValid() || qFuzzyCompare(d->fontEngine->fontDef.pixelSize, pixelSize))
return;
d.detach();
- QFontEngine *oldFontEngine = d->fontEngine;
-
- d->fontEngine = d->fontEngine->cloneWithSize(pixelSize);
- if (d->fontEngine != 0)
- d->fontEngine->ref.ref();
-
- if (!oldFontEngine->ref.deref())
- delete oldFontEngine;
+ d->setFontEngine(d->fontEngine->cloneWithSize(pixelSize));
}
/*!
\internal
*/
-void QRawFontPrivate::cleanUp()
-{
- if (fontEngine != 0) {
- if (!fontEngine->ref.deref())
- delete fontEngine;
- fontEngine = 0;
- }
- hintingPreference = QFont::PreferDefaultHinting;
-}
-
void QRawFontPrivate::loadFromData(const QByteArray &fontData, qreal pixelSize,
QFont::HintingPreference hintingPreference)
{
Q_ASSERT(fontEngine == 0);
QPlatformFontDatabase *pfdb = QGuiApplicationPrivate::platformIntegration()->fontDatabase();
- fontEngine = pfdb->fontEngine(fontData, pixelSize, hintingPreference);
- if (fontEngine != 0)
- fontEngine->ref.ref();
+ setFontEngine(pfdb->fontEngine(fontData, pixelSize, hintingPreference));
}
/*!
@@ -757,7 +736,7 @@ void QRawFontPrivate::loadFromData(const QByteArray &fontData, qreal pixelSize,
*/
QRectF QRawFont::boundingRect(quint32 glyphIndex) const
{
- if (!isValid())
+ if (!d->isValid())
return QRectF();
glyph_metrics_t gm = d->fontEngine->boundingBox(glyphIndex);