aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/items/qquicktextnodeengine.cpp
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2018-11-09 15:55:53 +0100
committerLars Knoll <lars.knoll@qt.io>2018-11-22 08:26:01 +0000
commit03f492f91a9ac6d33be05488f7ea6fb5decaf873 (patch)
treef7605b5baeee0fde4eb263d5b3fa2f93b969d750 /src/quick/items/qquicktextnodeengine.cpp
parent560a1991ac4524ff16352da23a2b54d717548f33 (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>
Diffstat (limited to 'src/quick/items/qquicktextnodeengine.cpp')
-rw-r--r--src/quick/items/qquicktextnodeengine.cpp27
1 files changed, 17 insertions, 10 deletions
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 {