diff options
author | Robin Burchell <robin.burchell@viroteck.net> | 2015-02-07 21:19:15 +0100 |
---|---|---|
committer | Robin Burchell <robin.burchell@viroteck.net> | 2015-02-12 17:21:19 +0000 |
commit | d8ee217d41b8c558013c624b15e99f2b8794e8c6 (patch) | |
tree | 4464033f09144e470bb3db44207dc36617c9a4be /src/quick | |
parent | e4132ab7d178a8d9adb28d1c9b984f396a856557 (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')
-rw-r--r-- | src/quick/items/qquicktext.cpp | 111 | ||||
-rw-r--r-- | src/quick/items/qquicktext_p_p.h | 4 |
2 files changed, 65 insertions, 50 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()); + } } } diff --git a/src/quick/items/qquicktext_p_p.h b/src/quick/items/qquicktext_p_p.h index 0c9af613fc..ff128389e5 100644 --- a/src/quick/items/qquicktext_p_p.h +++ b/src/quick/items/qquicktext_p_p.h @@ -97,6 +97,8 @@ public: int maximumLineCount; QQuickText::LineHeightMode lineHeightMode; QQuickText::FontSizeMode fontSizeMode; + QList<QQuickStyledTextImgTag*> imgTags; + QList<QQuickStyledTextImgTag*> visibleImgTags; }; QLazilyAllocated<ExtraData> extra; @@ -104,8 +106,6 @@ public: QUrl baseUrl; QFont font; QFont sourceFont; - QList<QQuickStyledTextImgTag*> imgTags; - QList<QQuickStyledTextImgTag*> visibleImgTags; QTextLayout layout; QTextLayout *elideLayout; |