aboutsummaryrefslogtreecommitdiffstats
path: root/src/declarative/items/qsgtext.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/declarative/items/qsgtext.cpp')
-rw-r--r--src/declarative/items/qsgtext.cpp50
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();
}