aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/items/qquicktextnodeengine.cpp
diff options
context:
space:
mode:
authorShawn Rutledge <shawn.rutledge@qt.io>2021-08-25 09:43:37 +0200
committerShawn Rutledge <shawn.rutledge@qt.io>2021-11-30 07:23:37 +0100
commit418e4d02e39eb5ac2f4befd72d36c7a2196cb35d (patch)
treeca04a34a16be240edd9f79facda909d6d0ba7a32 /src/quick/items/qquicktextnodeengine.cpp
parent5a6fa340f9bfa6b95921c9b19eab411aebf560ec (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.cpp19
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()));