From 1896424554498e96f3e3e25999b7b550a1133a05 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Mon, 30 Sep 2024 14:53:29 +0200 Subject: [PATCH] Fix text drawing onto transparent ARGB32 We can not use the same blend routines for ARGB32 as we use for ARGB32PM. It needs to blend transparent colors differently. Pick-to: 6.5 Fixes: QTBUG-91262 Change-Id: I6b75fa8096b92452655dcad94478ae2a74415939 Reviewed-by: Eirik Aavitsland (cherry picked from commit bb854606ec8f95787dfd2a4d1b6bcaddbcf4d042) Reviewed-by: Qt Cherry-pick Bot --- src/gui/painting/qdrawhelper.cpp | 4 +-- .../gui/painting/qpainter/tst_qpainter.cpp | 26 +++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/gui/painting/qdrawhelper.cpp b/src/gui/painting/qdrawhelper.cpp index 62032a48690..866745cca69 100644 --- a/src/gui/painting/qdrawhelper.cpp +++ b/src/gui/painting/qdrawhelper.cpp @@ -6051,8 +6051,8 @@ DrawHelper qDrawHelper[] = { blend_color_generic, qt_bitmapblit_argb32, - qt_alphamapblit_argb32, - qt_alphargbblit_argb32, + qt_alphamapblit_generic, + qt_alphargbblit_generic, qt_rectfill_nonpremul_argb32 }, // Format_ARGB32_Premultiplied diff --git a/tests/auto/gui/painting/qpainter/tst_qpainter.cpp b/tests/auto/gui/painting/qpainter/tst_qpainter.cpp index 92b28f65bd0..7528690ae42 100644 --- a/tests/auto/gui/painting/qpainter/tst_qpainter.cpp +++ b/tests/auto/gui/painting/qpainter/tst_qpainter.cpp @@ -280,6 +280,7 @@ private slots: void fillPolygon(); + void textOnArgb32(); void drawImageAtPointF(); void scaledDashes(); #if QT_CONFIG(raster_fp) @@ -5460,6 +5461,31 @@ void tst_QPainter::fillPolygon() } } +void tst_QPainter::textOnArgb32() +{ + QImage backing(100, 20, QImage::Format_RGB32); + backing.fill(Qt::white); + QImage img(100, 20, QImage::Format_ARGB32); + img.fill(Qt::transparent); // Filled with transparent black + + QPainter imagePainter(&img); + imagePainter.setPen(Qt::red); + imagePainter.setFont(QFontDatabase::systemFont(QFontDatabase::GeneralFont)); + imagePainter.setRenderHints(QPainter::TextAntialiasing); + imagePainter.drawText(img.rect(), Qt::AlignCenter,"Text example"); + imagePainter.end(); + imagePainter.begin(&backing); + imagePainter.drawImage(backing.rect(), img); + imagePainter.end(); + for (int y = 0; y < backing.height(); ++y) { + for (int x = 0; x < backing.width(); ++x) { + const uint32_t px = backing.pixel(x, y); + // Red over white, should always be full red. + QCOMPARE(qRed(px), 255); + } + } +} + void tst_QPainter::drawImageAtPointF() { // Just test we do not crash