From 560117351cd1e032c30e2691a2e933e3ebb84edd Mon Sep 17 00:00:00 2001 From: Jordi Pujol Foyo Date: Fri, 8 May 2020 15:23:21 +0200 Subject: Allow arbitrary baseline shift in QTextCharacterFormat Added 6 new methods in QTextFormat and QTextDocument to allow setting/getting specific % positioning for baseline and super/ subscript. Modified QTextLayout to honor those new settings. [ChangeLog][QtGui][QTextLayout,QTextFormat,QTextDocument] Allow text layout modification based on baseline offset and super/subscript % height positioning Fixes: QTBUG-18260 Change-Id: I0796f18224aac8df6baf8359c35022fd98fe64ef Reviewed-by: Qt CI Bot Reviewed-by: Eskil Abrahamsen Blomfeldt --- src/gui/text/qtextlayout.cpp | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) (limited to 'src/gui/text/qtextlayout.cpp') diff --git a/src/gui/text/qtextlayout.cpp b/src/gui/text/qtextlayout.cpp index ec4270ea9c..cd064364d5 100644 --- a/src/gui/text/qtextlayout.cpp +++ b/src/gui/text/qtextlayout.cpp @@ -2511,6 +2511,8 @@ void QTextLine::draw(QPainter *p, const QPointF &pos, const QTextLayout::FormatR const QFixed y = QFixed::fromReal(pos.y()) + line.y + lineBase; + const QTextFormatCollection *formatCollection = eng->formatCollection(); + bool suppressColors = (eng->option.flags() & QTextOption::SuppressColors); while (!iterator.atEnd()) { QScriptItem &si = iterator.next(); @@ -2525,10 +2527,12 @@ void QTextLine::draw(QPainter *p, const QPointF &pos, const QTextLayout::FormatR QFixed itemBaseLine = y; QFont f = eng->font(si); QTextCharFormat format; + if (formatCollection != nullptr) + format = formatCollection->defaultTextFormat(); + if (eng->hasFormats() || selection || formatCollection) { + format.merge(eng->format(&si)); - if (eng->hasFormats() || selection) { - format = eng->format(&si); if (suppressColors) { format.clearForeground(); format.clearBackground(); @@ -2540,14 +2544,20 @@ void QTextLine::draw(QPainter *p, const QPointF &pos, const QTextLayout::FormatR setPenAndDrawBackground(p, pen, format, QRectF(iterator.x.toReal(), (y - lineBase).toReal(), iterator.itemWidth.toReal(), line.height().toReal())); + const qreal baseLineOffset = format.baselineOffset() / 100.0; QTextCharFormat::VerticalAlignment valign = format.verticalAlignment(); - if (valign == QTextCharFormat::AlignSuperScript || valign == QTextCharFormat::AlignSubScript) { + if (valign == QTextCharFormat::AlignSuperScript + || valign == QTextCharFormat::AlignSubScript + || !qFuzzyIsNull(baseLineOffset)) + { QFontEngine *fe = f.d->engineForScript(si.analysis.script); QFixed height = fe->ascent() + fe->descent(); + itemBaseLine -= height * QFixed::fromReal(baseLineOffset); + if (valign == QTextCharFormat::AlignSubScript) - itemBaseLine += height / 6; + itemBaseLine += height * QFixed::fromReal(format.subScriptBaseline() / 100.0); else if (valign == QTextCharFormat::AlignSuperScript) - itemBaseLine -= height / 2; + itemBaseLine -= height * QFixed::fromReal(format.superScriptBaseline() / 100.0); } } -- cgit v1.2.3