From af31f1f2c38321628b960ef5af19a7737ed5d9db Mon Sep 17 00:00:00 2001 From: Eskil Abrahamsen Blomfeldt Date: Tue, 18 Mar 2025 15:11:17 +0100 Subject: [PATCH] Improve underline drawing for fonts in QPainter In the underline drawing code in QPainter there were some issues causing First of all, if an underline was very thick, then we would still just offset the drawing by 0.5 (as if it were 1 pixel wide) causing part of the underline to appear on top of the text. The shift here is intended to move the top edge of the underline to the top edge of the pixel where we want to draw it, so we need to offset it by half of the actual line thickness. In addition, fractional line widths look bad when drawn with aliased painting, which is the default. Depending on where the text would be, the thickness of a line might vary. Even if it's very close to an integer, e.g. 1.04 as in one case, then it will still sometimes fill two pixels if it happens to be placed directly between them. To ensure that we always fill the same number of pixels, we round the line thickness to nearest integer when antialiasing is not enabled. Pick-to: 6.8 Fixes: QTBUG-134626 Change-Id: I95bae3ac16010fc133995e5f9b6c2e5d022e3743 Reviewed-by: Eirik Aavitsland (cherry picked from commit 2b5533af920726723479557356f56d0778bcabd3) Reviewed-by: Qt Cherry-pick Bot --- src/gui/painting/qpainter.cpp | 12 ++++++-- tests/baseline/painting/CMakeLists.txt | 3 +- .../fonts/QtUnderlineTest-Regular.ttf | Bin 0 -> 21692 bytes .../fonts/QtUnderlineTest2-Regular.ttf | Bin 0 -> 21872 bytes tests/baseline/painting/scripts/text.qps | 26 ++++++++++++++++++ .../painting/tst_baseline_painting.cpp | 12 ++++++++ 6 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 tests/baseline/painting/fonts/QtUnderlineTest-Regular.ttf create mode 100644 tests/baseline/painting/fonts/QtUnderlineTest2-Regular.ttf diff --git a/src/gui/painting/qpainter.cpp b/src/gui/painting/qpainter.cpp index 4e8e1d65ecf..f5285a9120f 100644 --- a/src/gui/painting/qpainter.cpp +++ b/src/gui/painting/qpainter.cpp @@ -6039,11 +6039,16 @@ static void drawTextItemDecoration(QPainter *painter, const QPointF &pos, const painter->fillRect(pos.x(), 0, qCeil(width), qMin(wave.height(), descent), wave); painter->restore(); } else if (underlineStyle != QTextCharFormat::NoUnderline) { + const bool isAntialiasing = painter->renderHints().testFlag(QPainter::Antialiasing); + if (!isAntialiasing) + pen.setWidthF(qMax(fe->lineThickness().round(), QFixed(1)).toReal()); + const qreal lineThicknessOffset = pen.widthF() / 2.0; + // Deliberately ceil the offset to avoid the underline coming too close to // the text above it, but limit it to stay within descent. - qreal adjustedUnderlineOffset = std::ceil(underlineOffset) + 0.5; + qreal adjustedUnderlineOffset = std::ceil(underlineOffset) + lineThicknessOffset; if (underlineOffset <= fe->descent().toReal()) - adjustedUnderlineOffset = qMin(adjustedUnderlineOffset, fe->descent().toReal() - qreal(0.5)); + adjustedUnderlineOffset = qMin(adjustedUnderlineOffset, fe->descent().toReal() - lineThicknessOffset); const qreal underlinePos = pos.y() + adjustedUnderlineOffset; QColor uc = charFormat.underlineColor(); if (uc.isValid()) @@ -6056,6 +6061,9 @@ static void drawTextItemDecoration(QPainter *painter, const QPointF &pos, const textEngine->addUnderline(painter, underline); else painter->drawLine(underline); + + if (!isAntialiasing) + pen.setWidthF(fe->lineThickness().toReal()); } pen.setStyle(Qt::SolidLine); diff --git a/tests/baseline/painting/CMakeLists.txt b/tests/baseline/painting/CMakeLists.txt index 86dc752186b..940967a9468 100644 --- a/tests/baseline/painting/CMakeLists.txt +++ b/tests/baseline/painting/CMakeLists.txt @@ -8,7 +8,8 @@ # Collect test data file(GLOB_RECURSE test_data_glob RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} - scripts/*) + scripts/* + fonts/* ) list(APPEND test_data ${test_data_glob}) if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT) diff --git a/tests/baseline/painting/fonts/QtUnderlineTest-Regular.ttf b/tests/baseline/painting/fonts/QtUnderlineTest-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..0b165974abce5e09ccd228d188ff94c000bed069 GIT binary patch literal 21692 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 literal 0 HcmV?d00001 diff --git a/tests/baseline/painting/scripts/text.qps b/tests/baseline/painting/scripts/text.qps index 6bacdfd5e62..5f0576275e8 100644 --- a/tests/baseline/painting/scripts/text.qps +++ b/tests/baseline/painting/scripts/text.qps @@ -196,4 +196,30 @@ save drawText 0 20 "All the effects text drawing" restore +translate 0 35 +save + setPen black + setFont "QtUnderlineTest" 20 normal normal default underline + drawText 0 20 "1234" +restore +translate 0 35.5 +save + setPen black + setFont "QtUnderlineTest2" 18 normal normal default underline + drawText 0 20 "1234" +restore + +translate 0 35.5 +save + setPen black + setFont "QtUnderlineTest2" 12 normal normal default underline + drawText 0 20 "1234" +restore + +translate 0 35.5 +save + setPen black + setFont "QtUnderlineTest2" 12 normal normal default underline + drawText 0 20 "1234" +restore diff --git a/tests/baseline/painting/tst_baseline_painting.cpp b/tests/baseline/painting/tst_baseline_painting.cpp index d81f4468dcf..7e17926dc25 100644 --- a/tests/baseline/painting/tst_baseline_painting.cpp +++ b/tests/baseline/painting/tst_baseline_painting.cpp @@ -19,6 +19,8 @@ #include #endif +#include + #include #ifndef GL_RGB10 @@ -129,6 +131,16 @@ void tst_Lancelot::initTestCase() scriptChecksums.insert(fileName, qChecksum(cont)); } + QString underlineTestFont1 = QFINDTESTDATA("fonts/QtUnderlineTest-Regular.ttf"); + QVERIFY(!underlineTestFont1.isEmpty()); + int id = QFontDatabase::addApplicationFont(underlineTestFont1); + QVERIFY(id >= 0); + + QString underlineTestFont2 = QFINDTESTDATA("fonts/QtUnderlineTest2-Regular.ttf"); + QVERIFY(!underlineTestFont2.isEmpty()); + id = QFontDatabase::addApplicationFont(underlineTestFont2); + QVERIFY(id >= 0); + #ifndef QT_NO_OPENGL initOpenGL(); #endif