summaryrefslogtreecommitdiffstats
path: root/src/gui/text
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@theqtcompany.com>2014-12-18 12:12:58 +0100
committerSimon Hausmann <simon.hausmann@theqtcompany.com>2014-12-18 12:12:58 +0100
commite281537f2049af0b96fd87158f2b7212afe8ab5f (patch)
tree7f9e3b14a2456cc779aa165457192094507dd257 /src/gui/text
parente0a8b5ce88bc50440dcec2fe3a86d83e2a7dc7b0 (diff)
parent84569773db68408704193268bc42a200bb25a924 (diff)
Merge remote-tracking branch 'origin/5.4' into dev
Conflicts: src/corelib/global/qglobal.h src/platformsupport/platformcompositor/qopenglcompositor.cpp src/platformsupport/platformcompositor/qopenglcompositorbackingstore.cpp tests/auto/gui/kernel/qwindow/tst_qwindow.cpp Change-Id: I5422868500be695584a496dbbbc719d146bc572d
Diffstat (limited to 'src/gui/text')
-rw-r--r--src/gui/text/qrawfont.cpp31
-rw-r--r--src/gui/text/qrawfont_p.h37
-rw-r--r--src/gui/text/qtextlayout.cpp10
3 files changed, 44 insertions, 34 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);
diff --git a/src/gui/text/qrawfont_p.h b/src/gui/text/qrawfont_p.h
index f7a951ec59..9b0846de9a 100644
--- a/src/gui/text/qrawfont_p.h
+++ b/src/gui/text/qrawfont_p.h
@@ -66,10 +66,11 @@ public:
{}
QRawFontPrivate(const QRawFontPrivate &other)
- : hintingPreference(other.hintingPreference)
+ : fontEngine(other.fontEngine)
+ , hintingPreference(other.hintingPreference)
, thread(other.thread)
{
- fontEngine = other.fontEngine;
+ Q_ASSERT(fontEngine == 0 || thread == QThread::currentThread());
if (fontEngine != 0)
fontEngine->ref.ref();
}
@@ -80,13 +81,38 @@ public:
cleanUp();
}
+ inline void cleanUp()
+ {
+ setFontEngine(0);
+ hintingPreference = QFont::PreferDefaultHinting;
+ }
+
inline bool isValid() const
{
- Q_ASSERT(thread == 0 || thread == QThread::currentThread());
+ Q_ASSERT(fontEngine == 0 || thread == QThread::currentThread());
return fontEngine != 0;
}
- void cleanUp();
+ inline void setFontEngine(QFontEngine *engine)
+ {
+ Q_ASSERT(fontEngine == 0 || thread == QThread::currentThread());
+ if (fontEngine == engine)
+ return;
+
+ if (fontEngine != 0) {
+ if (!fontEngine->ref.deref())
+ delete fontEngine;
+ thread = 0;
+ }
+
+ fontEngine = engine;
+
+ if (fontEngine != 0) {
+ fontEngine->ref.ref();
+ Q_ASSERT(thread = QThread::currentThread()); // set only if assertions enabled
+ }
+ }
+
void loadFromData(const QByteArray &fontData,
qreal pixelSize,
QFont::HintingPreference hintingPreference);
@@ -95,9 +121,10 @@ public:
QFontEngine *fontEngine;
QFont::HintingPreference hintingPreference;
- QThread *thread;
QAtomicInt ref;
+private:
+ QThread *thread;
};
QT_END_NAMESPACE
diff --git a/src/gui/text/qtextlayout.cpp b/src/gui/text/qtextlayout.cpp
index 1ac50d3e5c..52d2ba0d54 100644
--- a/src/gui/text/qtextlayout.cpp
+++ b/src/gui/text/qtextlayout.cpp
@@ -1776,6 +1776,11 @@ void QTextLine::layout_helper(int maxGlyphs)
QFixed x = line.x + line.textWidth + lbh.tmpData.textWidth + lbh.spaceData.textWidth;
QFixed tabWidth = eng->calculateTabWidth(item, x);
+ attributes = eng->attributes();
+ if (!attributes)
+ return;
+ lbh.logClusters = eng->layoutData->logClustersPtr;
+ lbh.glyphs = eng->shapedGlyphs(&current);
lbh.spaceData.textWidth += tabWidth;
lbh.spaceData.length++;
@@ -2063,9 +2068,8 @@ static QGlyphRun glyphRunWithInfo(QFontEngine *fontEngine,
// Make a font for this particular engine
QRawFont font;
QRawFontPrivate *fontD = QRawFontPrivate::get(font);
- fontD->fontEngine = fontEngine;
- fontD->thread = QThread::currentThread();
- fontD->fontEngine->ref.ref();
+ fontD->setFontEngine(fontEngine);
+
QVarLengthArray<glyph_t> glyphsArray;
QVarLengthArray<QFixedPoint> positionsArray;