From 03f492f91a9ac6d33be05488f7ea6fb5decaf873 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Fri, 9 Nov 2018 15:55:53 +0100 Subject: 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 Reviewed-by: Igor Bugaev --- src/quick/items/qquicktextnodeengine.cpp | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) (limited to 'src/quick/items/qquicktextnodeengine.cpp') 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 { -- cgit v1.2.3