diff options
Diffstat (limited to 'src/declarative/items/qsgtext.cpp')
-rw-r--r-- | src/declarative/items/qsgtext.cpp | 50 |
1 files changed, 34 insertions, 16 deletions
diff --git a/src/declarative/items/qsgtext.cpp b/src/declarative/items/qsgtext.cpp index b99e929a84..3398824f69 100644 --- a/src/declarative/items/qsgtext.cpp +++ b/src/declarative/items/qsgtext.cpp @@ -102,10 +102,11 @@ QSGTextPrivate::QSGTextPrivate() lineHeightMode(QSGText::ProportionalHeight), lineCount(1), maximumLineCount(INT_MAX), maximumLineCountValid(false), texture(0), - imageCacheDirty(true), updateOnComponentComplete(true), + imageCacheDirty(false), updateOnComponentComplete(true), richText(false), singleline(false), cacheAllTextAsImage(true), internalWidthUpdate(false), requireImplicitWidth(false), truncated(false), hAlignImplicit(true), rightToLeftText(false), - layoutTextElided(false), naturalWidth(0), doc(0), layoutThread(0), nodeType(NodeIsNull) + layoutTextElided(false), richTextAsImage(false), textureImageCacheDirty(false), naturalWidth(0), + doc(0), layoutThread(0), nodeType(NodeIsNull) { cacheAllTextAsImage = enableImageCache(); } @@ -289,6 +290,8 @@ void QSGTextPrivate::updateSize() int dy = q->height(); QSize size(0, 0); + layoutThread = QThread::currentThread(); + //setup instance of QTextLayout for all cases other than richtext if (!richText) { QRect textRect = setupTextLayout(); @@ -377,8 +380,6 @@ QRect QSGTextPrivate::setupTextLayout() bool elideText = false; bool truncate = false; - layoutThread = QThread::currentThread(); - QFontMetrics fm(layout.font()); elidePos = QPointF(); @@ -573,14 +574,15 @@ void QSGTextPrivate::invalidateImageCache() { Q_Q(QSGText); - if(cacheAllTextAsImage || (!QSGDistanceFieldGlyphCache::distanceFieldEnabled() && style != QSGText::Normal)){//If actually using the image cache + if(richTextAsImage || cacheAllTextAsImage || (!QSGDistanceFieldGlyphCache::distanceFieldEnabled() && style != QSGText::Normal)){//If actually using the image cache if (imageCacheDirty) return; imageCacheDirty = true; - imageCache = QPixmap(); - } - if (q->isComponentComplete()) + + if (q->isComponentComplete()) + QCoreApplication::postEvent(q, new QEvent(QEvent::User)); + } else if (q->isComponentComplete()) q->update(); } @@ -589,6 +591,8 @@ void QSGTextPrivate::invalidateImageCache() */ void QSGTextPrivate::checkImageCache() { + Q_Q(QSGText); + if (!imageCacheDirty) return; @@ -629,6 +633,8 @@ void QSGTextPrivate::checkImageCache() } imageCacheDirty = false; + textureImageCacheDirty = true; + q->update(); } /*! @@ -748,6 +754,7 @@ void QSGText::setText(const QString &n) d->ensureDoc(); d->doc->setText(n); d->rightToLeftText = d->doc->toPlainText().isRightToLeft(); + d->richTextAsImage = QSGTextNode::isComplexRichText(d->doc); } else { d->rightToLeftText = d->text.isRightToLeft(); } @@ -987,6 +994,7 @@ void QSGText::setTextFormat(TextFormat format) if (!wasRich && d->richText && isComponentComplete()) { d->ensureDoc(); d->doc->setText(d->text); + d->richTextAsImage = QSGTextNode::isComplexRichText(d->doc); } d->updateLayout(); @@ -1063,10 +1071,9 @@ QSGNode *QSGText::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data) Q_UNUSED(data); Q_D(QSGText); - bool richTextAsImage = false; - if (d->richText) { - d->ensureDoc(); - richTextAsImage = QSGTextNode::isComplexRichText(d->doc); + if (d->text.isEmpty()) { + delete oldNode; + return 0; } QRectF bounds = boundingRect(); @@ -1076,10 +1083,9 @@ QSGNode *QSGText::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data) 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; - - d->checkImageCache(); + if (d->richTextAsImage || d->cacheAllTextAsImage || (!QSGDistanceFieldGlyphCache::distanceFieldEnabled() && d->style != Normal)) { + bool wasDirty = d->textureImageCacheDirty; + d->textureImageCacheDirty = false; if (d->imageCache.isNull()) { delete oldNode; @@ -1139,6 +1145,17 @@ QSGNode *QSGText::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data) } } +bool QSGText::event(QEvent *e) +{ + Q_D(QSGText); + if (e->type() == QEvent::User) { + d->checkImageCache(); + return true; + } else { + return QSGImplicitSizeItem::event(e); + } +} + qreal QSGText::paintedWidth() const { Q_D(const QSGText); @@ -1207,6 +1224,7 @@ void QSGText::componentComplete() d->ensureDoc(); d->doc->setText(d->text); d->rightToLeftText = d->doc->toPlainText().isRightToLeft(); + d->richTextAsImage = QSGTextNode::isComplexRichText(d->doc); } else { d->rightToLeftText = d->text.isRightToLeft(); } |