aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/items/qquicktext.cpp
diff options
context:
space:
mode:
authorRobin Burchell <robin.burchell@viroteck.net>2015-02-07 21:19:15 +0100
committerRobin Burchell <robin.burchell@viroteck.net>2015-02-12 17:21:19 +0000
commitd8ee217d41b8c558013c624b15e99f2b8794e8c6 (patch)
tree4464033f09144e470bb3db44207dc36617c9a4be /src/quick/items/qquicktext.cpp
parente4132ab7d178a8d9adb28d1c9b984f396a856557 (diff)
QQuickText: Decrease the size of QQuickTextPrivate by moving image tags to ExtraData.
Given that other data about images is already stored there (e.g. nbActiveDownloads), it seems curious to not store it all there. On x86_64, this drops the size of QQuickTextPrivate by 16 bytes (512 -> 496), and increases the size of ExtraData from 56 bytes to 72 bytes. Change-Id: Ib0a98199a74f757cf439d4ba276c7704504055b2 Reviewed-by: Gunnar Sletta <gunnar@sletta.org>
Diffstat (limited to 'src/quick/items/qquicktext.cpp')
-rw-r--r--src/quick/items/qquicktext.cpp111
1 files changed, 63 insertions, 48 deletions
diff --git a/src/quick/items/qquicktext.cpp b/src/quick/items/qquicktext.cpp
index e6c9a9b763..f64b0cdb19 100644
--- a/src/quick/items/qquicktext.cpp
+++ b/src/quick/items/qquicktext.cpp
@@ -254,8 +254,11 @@ QQuickTextPrivate::~QQuickTextPrivate()
{
delete elideLayout;
delete textLine; textLine = 0;
- qDeleteAll(imgTags);
- imgTags.clear();
+
+ if (extra.isAllocated()) {
+ qDeleteAll(extra->imgTags);
+ extra->imgTags.clear();
+ }
}
qreal QQuickTextPrivate::getImplicitWidth() const
@@ -305,8 +308,8 @@ void QQuickTextPrivate::updateLayout()
updateOnComponentComplete = false;
layoutTextElided = false;
- if (!visibleImgTags.isEmpty())
- visibleImgTags.clear();
+ if (extra.isAllocated())
+ extra->visibleImgTags.clear();
needToUpdateLayout = false;
// Setup instance of QTextLayout for all cases other than richtext
@@ -316,7 +319,10 @@ void QQuickTextPrivate::updateLayout()
layout.setFont(font);
// needs temporary bool because formatModifiesFontSize is in a bit-field
bool fontSizeModified = false;
- QQuickStyledText::parse(text, layout, imgTags, q->baseUrl(), qmlContext(q), !maximumLineCountValid, &fontSizeModified);
+ QList<QQuickStyledTextImgTag*> someImgTags = extra.isAllocated() ? extra->imgTags : QList<QQuickStyledTextImgTag*>();
+ QQuickStyledText::parse(text, layout, someImgTags, q->baseUrl(), qmlContext(q), !maximumLineCountValid, &fontSizeModified);
+ if (someImgTags.size() || extra.isAllocated())
+ extra.value().imgTags = someImgTags;
formatModifiesFontSize = fontSizeModified;
multilengthEos = -1;
} else {
@@ -373,7 +379,7 @@ void QQuickText::imageDownloadFinished()
if (d->extra.isAllocated() && d->extra->nbActiveDownloads == 0) {
bool needToUpdateLayout = false;
- foreach (QQuickStyledTextImgTag *img, d->visibleImgTags) {
+ foreach (QQuickStyledTextImgTag *img, d->extra->visibleImgTags) {
if (!img->size.isValid()) {
img->size = img->pix->implicitSize();
needToUpdateLayout = true;
@@ -705,8 +711,8 @@ QRectF QQuickTextPrivate::setupTextLayout(qreal *const baseline)
}
bool shouldUseDesignMetrics = renderType != QQuickText::NativeRendering;
- if (!visibleImgTags.isEmpty())
- visibleImgTags.clear();
+ if (extra.isAllocated())
+ extra->visibleImgTags.clear();
layout.setCacheEnabled(true);
QTextOption textOption = layout.textOption();
if (textOption.alignment() != q->effectiveHAlign()
@@ -1106,7 +1112,7 @@ void QQuickTextPrivate::setLineGeometry(QTextLine &line, qreal lineWidth, qreal
Q_Q(QQuickText);
line.setLineWidth(lineWidth);
- if (imgTags.isEmpty()) {
+ if (extra.isAllocated() && extra->imgTags.isEmpty()) {
line.setPosition(QPointF(line.position().x(), height));
height += (lineHeightMode() == QQuickText::FixedHeight) ? lineHeight() : line.height() * lineHeight();
return;
@@ -1118,39 +1124,41 @@ void QQuickTextPrivate::setLineGeometry(QTextLine &line, qreal lineWidth, qreal
QList<QQuickStyledTextImgTag *> imagesInLine;
- foreach (QQuickStyledTextImgTag *image, imgTags) {
- if (image->position >= line.textStart() &&
- image->position < line.textStart() + line.textLength()) {
-
- if (!image->pix) {
- QUrl url = q->baseUrl().resolved(image->url);
- image->pix = new QQuickPixmap(qmlEngine(q), url, image->size);
- if (image->pix->isLoading()) {
- image->pix->connectFinished(q, SLOT(imageDownloadFinished()));
- if (!extra.isAllocated() || !extra->nbActiveDownloads)
- extra.value().nbActiveDownloads = 0;
- extra->nbActiveDownloads++;
- } else if (image->pix->isReady()) {
- if (!image->size.isValid()) {
- image->size = image->pix->implicitSize();
- // if the size of the image was not explicitly set, we need to
- // call updateLayout() once again.
- needToUpdateLayout = true;
+ if (extra.isAllocated()) {
+ foreach (QQuickStyledTextImgTag *image, extra->imgTags) {
+ if (image->position >= line.textStart() &&
+ image->position < line.textStart() + line.textLength()) {
+
+ if (!image->pix) {
+ QUrl url = q->baseUrl().resolved(image->url);
+ image->pix = new QQuickPixmap(qmlEngine(q), url, image->size);
+ if (image->pix->isLoading()) {
+ image->pix->connectFinished(q, SLOT(imageDownloadFinished()));
+ if (!extra.isAllocated() || !extra->nbActiveDownloads)
+ extra.value().nbActiveDownloads = 0;
+ extra->nbActiveDownloads++;
+ } else if (image->pix->isReady()) {
+ if (!image->size.isValid()) {
+ image->size = image->pix->implicitSize();
+ // if the size of the image was not explicitly set, we need to
+ // call updateLayout() once again.
+ needToUpdateLayout = true;
+ }
+ } else if (image->pix->isError()) {
+ qmlInfo(q) << image->pix->error();
}
- } else if (image->pix->isError()) {
- qmlInfo(q) << image->pix->error();
}
- }
- qreal ih = qreal(image->size.height());
- if (image->align == QQuickStyledTextImgTag::Top)
- image->pos.setY(0);
- else if (image->align == QQuickStyledTextImgTag::Middle)
- image->pos.setY((textHeight / 2.0) - (ih / 2.0));
- else
- image->pos.setY(textHeight - ih);
- imagesInLine << image;
- textTop = qMax(textTop, qAbs(image->pos.y()));
+ qreal ih = qreal(image->size.height());
+ if (image->align == QQuickStyledTextImgTag::Top)
+ image->pos.setY(0);
+ else if (image->align == QQuickStyledTextImgTag::Middle)
+ image->pos.setY((textHeight / 2.0) - (ih / 2.0));
+ else
+ image->pos.setY(textHeight - ih);
+ imagesInLine << image;
+ textTop = qMax(textTop, qAbs(image->pos.y()));
+ }
}
}
@@ -1158,7 +1166,7 @@ void QQuickTextPrivate::setLineGeometry(QTextLine &line, qreal lineWidth, qreal
totalLineHeight = qMax(totalLineHeight, textTop + image->pos.y() + image->size.height());
image->pos.setX(line.cursorToX(image->position));
image->pos.setY(image->pos.y() + height + textTop);
- visibleImgTags << image;
+ extra->visibleImgTags << image;
}
line.setPosition(QPointF(line.position().x(), height + textTop));
@@ -1500,8 +1508,11 @@ void QQuickText::setText(const QString &n)
d->textHasChanged = true;
d->implicitWidthValid = false;
d->implicitHeightValid = false;
- qDeleteAll(d->imgTags);
- d->imgTags.clear();
+
+ if (d->extra.isAllocated()) {
+ qDeleteAll(d->extra->imgTags);
+ d->extra->imgTags.clear();
+ }
d->updateLayout();
setAcceptHoverEvents(d->richText || d->styledText);
emit textChanged(d->text);
@@ -2078,8 +2089,10 @@ void QQuickText::setBaseUrl(const QUrl &url)
}
if (d->styledText) {
d->textHasChanged = true;
- qDeleteAll(d->imgTags);
- d->imgTags.clear();
+ if (d->extra.isAllocated()) {
+ qDeleteAll(d->extra->imgTags);
+ d->extra->imgTags.clear();
+ }
d->updateLayout();
}
emit baseUrlChanged();
@@ -2256,10 +2269,12 @@ QSGNode *QQuickText::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data
if (d->elideLayout)
node->addTextLayout(QPointF(dx, dy), d->elideLayout, color, d->style, styleColor, linkColor);
- foreach (QQuickStyledTextImgTag *img, d->visibleImgTags) {
- QQuickPixmap *pix = img->pix;
- if (pix && pix->isReady())
- node->addImage(QRectF(img->pos.x() + dx, img->pos.y() + dy, pix->width(), pix->height()), pix->image());
+ if (d->extra.isAllocated()) {
+ foreach (QQuickStyledTextImgTag *img, d->extra->visibleImgTags) {
+ QQuickPixmap *pix = img->pix;
+ if (pix && pix->isReady())
+ node->addImage(QRectF(img->pos.x() + dx, img->pos.y() + dy, pix->width(), pix->height()), pix->image());
+ }
}
}