summaryrefslogtreecommitdiffstats
path: root/src/gui/text/qtextlayout.cpp
diff options
context:
space:
mode:
authorJordi Pujol Foyo <jordi@vikingsoftware.com>2020-05-08 15:23:21 +0200
committerJordi Pujol Foyo <jordi@vikingsoftware.com>2020-08-26 16:40:10 +0200
commit560117351cd1e032c30e2691a2e933e3ebb84edd (patch)
tree9134bc2119f5ae0089642aeff842a4c67894a2bd /src/gui/text/qtextlayout.cpp
parentcba2d0443411b937586f259059e7f14c1cf5b512 (diff)
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 <qt_ci_bot@qt-project.org> Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
Diffstat (limited to 'src/gui/text/qtextlayout.cpp')
-rw-r--r--src/gui/text/qtextlayout.cpp20
1 files changed, 15 insertions, 5 deletions
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);
}
}