diff options
author | Lars Knoll <lars.knoll@qt.io> | 2018-11-09 15:55:53 +0100 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2018-11-22 08:26:01 +0000 |
commit | 03f492f91a9ac6d33be05488f7ea6fb5decaf873 (patch) | |
tree | f7605b5baeee0fde4eb263d5b3fa2f93b969d750 | |
parent | 560a1991ac4524ff16352da23a2b54d717548f33 (diff) |
Fix vertical alignment of images in a text document
The vertical alignment was not calculated correctly in all cases,
this should fix it by retrieving the height and baseline for the
current text line and doing the calculation correctly in all cases.
Change-Id: I5bb650ede46dc03d51bf0f64b77dc4ca77d30fd2
Fixes: QTBUG-59310
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
Reviewed-by: Igor Bugaev <freedbrt@gmail.com>
-rw-r--r-- | src/quick/items/qquicktextedit.cpp | 2 | ||||
-rw-r--r-- | src/quick/items/qquicktextnode.cpp | 2 | ||||
-rw-r--r-- | src/quick/items/qquicktextnodeengine.cpp | 27 | ||||
-rw-r--r-- | src/quick/items/qquicktextnodeengine_p.h | 2 |
4 files changed, 20 insertions, 13 deletions
diff --git a/src/quick/items/qquicktextedit.cpp b/src/quick/items/qquicktextedit.cpp index 328f7c9103..06a0fc396b 100644 --- a/src/quick/items/qquicktextedit.cpp +++ b/src/quick/items/qquicktextedit.cpp @@ -2101,7 +2101,7 @@ QSGNode *QQuickTextEdit::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData * QTextCharFormat format = a->formatAccessor(pos); QTextBlock block = textFrame->firstCursorPosition().block(); engine.setCurrentLine(block.layout()->lineForTextPosition(pos - block.position())); - engine.addTextObject(QPointF(0, 0), format, QQuickTextNodeEngine::Unselected, d->document, + engine.addTextObject(block, QPointF(0, 0), format, QQuickTextNodeEngine::Unselected, d->document, pos, textFrame->frameFormat().position()); nodeStart = pos; } else { diff --git a/src/quick/items/qquicktextnode.cpp b/src/quick/items/qquicktextnode.cpp index 13a8219cbd..0dd12207b7 100644 --- a/src/quick/items/qquicktextnode.cpp +++ b/src/quick/items/qquicktextnode.cpp @@ -205,7 +205,7 @@ void QQuickTextNode::addTextDocument(const QPointF &position, QTextDocument *tex QTextBlock block = textFrame->firstCursorPosition().block(); engine.setCurrentLine(block.layout()->lineForTextPosition(pos - block.position())); - engine.addTextObject(rect.topLeft(), format, QQuickTextNodeEngine::Unselected, textDocument, + engine.addTextObject(block, rect.topLeft(), format, QQuickTextNodeEngine::Unselected, textDocument, pos, textFrame->frameFormat().position()); } else { QTextFrame::iterator it = textFrame->begin(); diff --git a/src/quick/items/qquicktextnodeengine.cpp b/src/quick/items/qquicktextnodeengine.cpp index a53ca2a2a4..504d629b3e 100644 --- a/src/quick/items/qquicktextnodeengine.cpp +++ b/src/quick/items/qquicktextnodeengine.cpp @@ -423,10 +423,11 @@ void QQuickTextNodeEngine::addImage(const QRectF &rect, const QImage &image, qre QRectF searchRect = rect; if (layoutPosition == QTextFrameFormat::InFlow) { if (m_currentLineTree.isEmpty()) { + qreal y = m_currentLine.ascent() - ascent; if (m_currentTextDirection == Qt::RightToLeft) - searchRect.moveTopRight(m_position + m_currentLine.rect().topRight() + QPointF(0, 1)); + searchRect.moveTopRight(m_position + m_currentLine.rect().topRight() + QPointF(0, y)); else - searchRect.moveTopLeft(m_position + m_currentLine.position() + QPointF(0,1)); + searchRect.moveTopLeft(m_position + m_currentLine.position() + QPointF(0, y)); } else { const BinaryTreeNode *lastNode = m_currentLineTree.data() + m_currentLineTree.size() - 1; if (lastNode->glyphRun.isRightToLeft()) { @@ -443,7 +444,7 @@ void QQuickTextNodeEngine::addImage(const QRectF &rect, const QImage &image, qre m_hasContents = true; } -void QQuickTextNodeEngine::addTextObject(const QPointF &position, const QTextCharFormat &format, +void QQuickTextNodeEngine::addTextObject(const QTextBlock &block, const QPointF &position, const QTextCharFormat &format, SelectionState selectionState, QTextDocument *textDocument, int pos, QTextFrameFormat::Position layoutPosition) @@ -476,17 +477,23 @@ void QQuickTextNodeEngine::addTextObject(const QPointF &position, const QTextCha } qreal ascent; - QFontMetrics m(format.font()); + QTextLine line = block.layout()->lineForTextPosition(pos); switch (format.verticalAlignment()) { - case QTextCharFormat::AlignMiddle: - ascent = size.height() / 2 - 1; + case QTextCharFormat::AlignTop: + ascent = line.ascent(); break; - case QTextCharFormat::AlignBaseline: - ascent = size.height() - m.descent() - 1; + case QTextCharFormat::AlignMiddle: { + QFontMetrics m(format.font()); + ascent = (size.height() - m.xHeight()) / 2; + break; + } + case QTextCharFormat::AlignBottom: + ascent = size.height() - line.descent(); break; + case QTextCharFormat::AlignBaseline: default: - ascent = size.height() - 1; + ascent = size.height(); } addImage(QRectF(position, size), image, ascent, selectionState, layoutPosition); @@ -1058,7 +1065,7 @@ void QQuickTextNodeEngine::addTextBlock(QTextDocument *textDocument, const QText ? QQuickTextNodeEngine::Selected : QQuickTextNodeEngine::Unselected; - addTextObject(QPointF(), charFormat, selectionState, textDocument, textPos); + addTextObject(block, QPointF(), charFormat, selectionState, textDocument, textPos); } textPos += text.length(); } else { diff --git a/src/quick/items/qquicktextnodeengine_p.h b/src/quick/items/qquicktextnodeengine_p.h index 18c624513a..49c1766045 100644 --- a/src/quick/items/qquicktextnodeengine_p.h +++ b/src/quick/items/qquicktextnodeengine_p.h @@ -179,7 +179,7 @@ public: const QVarLengthArray<QTextLayout::FormatRange> &colorChanges, int textPos, int fragmentEnd, int selectionStart, int selectionEnd); - void addTextObject(const QPointF &position, const QTextCharFormat &format, + void addTextObject(const QTextBlock &block, const QPointF &position, const QTextCharFormat &format, SelectionState selectionState, QTextDocument *textDocument, int pos, QTextFrameFormat::Position layoutPosition = QTextFrameFormat::InFlow); |