aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorEskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@nokia.com>2011-05-05 16:49:06 +0200
committerEskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@nokia.com>2011-05-06 09:56:25 +0200
commit27c5aabe9bd9d4881262312588ece7713de67ad4 (patch)
tree3384723fdc30e3338598cc35c42a01900abb385d /src
parent55ff812974dd038a597cd968b66c07b6aeff74b2 (diff)
Fix potential crash when displaying multiscripted text
Shaping has to be done in the current thread, otherwise the font engines index for each glyph (referenced in the msb of the glyph index) might not be valid yet, because the font engines list is populated when shaping is done. So we need to make sure that the render thread relayouts. Geometry changes will already cause a relayout, which will in turn cause another relayout when the paint node is updated. There doesn't seem to be any convenient and safe way of avoiding this doubling of the layout step if we want to have rendering in a different thread than the QML graph. Reviewed-by: Gunnar
Diffstat (limited to 'src')
-rw-r--r--src/declarative/items/qsgtext.cpp8
-rw-r--r--src/declarative/items/qsgtext_p_p.h1
2 files changed, 8 insertions, 1 deletions
diff --git a/src/declarative/items/qsgtext.cpp b/src/declarative/items/qsgtext.cpp
index f2ec7b21fa..e7e655d591 100644
--- a/src/declarative/items/qsgtext.cpp
+++ b/src/declarative/items/qsgtext.cpp
@@ -106,7 +106,7 @@ QSGTextPrivate::QSGTextPrivate()
imageCacheDirty(true), updateOnComponentComplete(true),
richText(false), singleline(false), cacheAllTextAsImage(true), internalWidthUpdate(false),
requireImplicitWidth(false), truncated(false), hAlignImplicit(true), rightToLeftText(false),
- layoutTextElided(false), naturalWidth(0), doc(0), nodeType(NodeIsNull)
+ layoutTextElided(false), naturalWidth(0), doc(0), layoutThread(0), nodeType(NodeIsNull)
{
cacheAllTextAsImage = enableImageCache();
}
@@ -378,6 +378,8 @@ QRect QSGTextPrivate::setupTextLayout()
bool elideText = false;
bool truncate = false;
+ layoutThread = QThread::currentThread();
+
QFontMetrics fm(layout.font());
elidePos = QPointF();
@@ -1070,6 +1072,10 @@ QSGNode *QSGText::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data)
QRectF bounds = boundingRect();
+ // We need to make sure the layout is done in the current thread
+ if (d->layoutThread != QThread::currentThread())
+ d->updateLayout();
+
// XXX todo - some styled text can be done by the QSGTextNode
if (richTextAsImage || d->cacheAllTextAsImage || (!QSGDistanceFieldGlyphCache::distanceFieldEnabled() && d->style != Normal)) {
bool wasDirty = d->imageCacheDirty;
diff --git a/src/declarative/items/qsgtext_p_p.h b/src/declarative/items/qsgtext_p_p.h
index 8d26394c3f..a3836a19f8 100644
--- a/src/declarative/items/qsgtext_p_p.h
+++ b/src/declarative/items/qsgtext_p_p.h
@@ -134,6 +134,7 @@ public:
QPixmap textLayoutImage(bool drawStyle);
void drawTextLayout(QPainter *p, const QPointF &pos, bool drawStyle);
QTextLayout layout;
+ QThread *layoutThread;
static QPixmap drawOutline(const QPixmap &source, const QPixmap &styleSource);
static QPixmap drawOutline(const QPixmap &source, const QPixmap &styleSource, int yOffset);