diff options
| author | Shawn Rutledge <shawn.rutledge@qt.io> | 2021-08-25 09:43:37 +0200 |
|---|---|---|
| committer | Shawn Rutledge <shawn.rutledge@qt.io> | 2021-11-30 07:23:37 +0100 |
| commit | 418e4d02e39eb5ac2f4befd72d36c7a2196cb35d (patch) | |
| tree | ca04a34a16be240edd9f79facda909d6d0ba7a32 /src/quick/items/qquicktextnodeengine.cpp | |
| parent | 5a6fa340f9bfa6b95921c9b19eab411aebf560ec (diff) | |
Large Rich Text: don't populate blocks outside the viewport into SG
If some parent item (such as Flickable, or QQuickRootItem) is acting
as a viewport, QQuickTextNodeEngine::addTextBlock() will skip any
block that is completely outside the viewport.
The result is that Flickable { Text { } } works OK for a viewer of
large rich text documents (such as HTML or Markdown).
Task-number: QTBUG-60491
Task-number: QTBUG-90734
Change-Id: I6a7f20d2ac0e8d0f4da1a2ebf43cbbeb1e05cea0
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
Diffstat (limited to 'src/quick/items/qquicktextnodeengine.cpp')
| -rw-r--r-- | src/quick/items/qquicktextnodeengine.cpp | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/src/quick/items/qquicktextnodeengine.cpp b/src/quick/items/qquicktextnodeengine.cpp index 3358ae1ba6..cd641a742d 100644 --- a/src/quick/items/qquicktextnodeengine.cpp +++ b/src/quick/items/qquicktextnodeengine.cpp @@ -58,6 +58,8 @@ QT_BEGIN_NAMESPACE +Q_DECLARE_LOGGING_CATEGORY(lcSgText) + QQuickTextNodeEngine::BinaryTreeNodeKey::BinaryTreeNodeKey(BinaryTreeNode *node) : fontEngine(QRawFontPrivate::get(node->glyphRun.rawFont())->fontEngine) , clipNode(node->clipNode) @@ -980,7 +982,17 @@ void QQuickTextNodeEngine::mergeFormats(QTextLayout *textLayout, QVarLengthArray } -void QQuickTextNodeEngine::addTextBlock(QTextDocument *textDocument, const QTextBlock &block, const QPointF &position, const QColor &textColor, const QColor &anchorColor, int selectionStart, int selectionEnd) +/*! + \internal + Adds the \a block from the \a textDocument at \a position if its + \l {QAbstractTextDocumentLayout::blockBoundingRect()}{bounding rect} + intersects the \a viewport, or if \c viewport is not valid + (i.e. use a default-constructed QRectF to skip the viewport check). + + \sa QQuickItem::clipRect() + */ +void QQuickTextNodeEngine::addTextBlock(QTextDocument *textDocument, const QTextBlock &block, const QPointF &position, + const QColor &textColor, const QColor &anchorColor, int selectionStart, int selectionEnd, const QRectF &viewport) { Q_ASSERT(textDocument); #if QT_CONFIG(im) @@ -995,6 +1007,11 @@ void QQuickTextNodeEngine::addTextBlock(QTextDocument *textDocument, const QText const QTextCharFormat charFormat = block.charFormat(); const QRectF blockBoundingRect = textDocument->documentLayout()->blockBoundingRect(block).translated(position); + if (viewport.isValid()) { + if (!blockBoundingRect.intersects(viewport)) + return; + qCDebug(lcSgText) << "adding block with length" << block.length() << ':' << blockBoundingRect << "in viewport" << viewport; + } if (charFormat.background().style() != Qt::NoBrush) m_backgrounds.append(qMakePair(blockBoundingRect, charFormat.background().color())); |
