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 00000000000..0b165974abc Binary files /dev/null and b/tests/baseline/painting/fonts/QtUnderlineTest-Regular.ttf differ diff --git a/tests/baseline/painting/fonts/QtUnderlineTest2-Regular.ttf b/tests/baseline/painting/fonts/QtUnderlineTest2-Regular.ttf new file mode 100644 index 00000000000..b830569a1a4 Binary files /dev/null and b/tests/baseline/painting/fonts/QtUnderlineTest2-Regular.ttf differ 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