diff --git a/src/gui/painting/qdrawhelper.cpp b/src/gui/painting/qdrawhelper.cpp index b2108ef67e..a037545dc2 100644 --- a/src/gui/painting/qdrawhelper.cpp +++ b/src/gui/painting/qdrawhelper.cpp @@ -5901,9 +5901,9 @@ static void qt_alphargbblit_quint32(QRasterBuffer *rasterBuffer, } } -static void qt_rectfill_quint32(QRasterBuffer *rasterBuffer, - int x, int y, int width, int height, - quint32 color) +static void qt_rectfill_argb32(QRasterBuffer *rasterBuffer, + int x, int y, int width, int height, + quint32 color) { qt_rectfill(reinterpret_cast(rasterBuffer->buffer()), color, x, y, width, height, rasterBuffer->bytesPerLine()); @@ -5917,14 +5917,30 @@ static void qt_rectfill_quint16(QRasterBuffer *rasterBuffer, qConvertRgb32To16(color), x, y, width, height, rasterBuffer->bytesPerLine()); } -static void qt_rectfill_nonpremul_quint32(QRasterBuffer *rasterBuffer, - int x, int y, int width, int height, - quint32 color) +static void qt_rectfill_nonpremul_argb32(QRasterBuffer *rasterBuffer, + int x, int y, int width, int height, + quint32 color) { qt_rectfill(reinterpret_cast(rasterBuffer->buffer()), INV_PREMUL(color), x, y, width, height, rasterBuffer->bytesPerLine()); } +static void qt_rectfill_rgba(QRasterBuffer *rasterBuffer, + int x, int y, int width, int height, + quint32 color) +{ + qt_rectfill(reinterpret_cast(rasterBuffer->buffer()), + ARGB2RGBA(color), x, y, width, height, rasterBuffer->bytesPerLine()); +} + +static void qt_rectfill_nonpremul_rgba(QRasterBuffer *rasterBuffer, + int x, int y, int width, int height, + quint32 color) +{ + qt_rectfill(reinterpret_cast(rasterBuffer->buffer()), + ARGB2RGBA(INV_PREMUL(color)), x, y, width, height, rasterBuffer->bytesPerLine()); +} + // Map table for destination image format. Contains function pointers // for blends of various types unto the destination @@ -5958,7 +5974,7 @@ DrawHelper qDrawHelper[QImage::NImageFormats] = qt_bitmapblit_quint32, qt_alphamapblit_quint32, qt_alphargbblit_quint32, - qt_rectfill_quint32 + qt_rectfill_argb32 }, // Format_ARGB32, { @@ -5967,7 +5983,7 @@ DrawHelper qDrawHelper[QImage::NImageFormats] = qt_bitmapblit_quint32, qt_alphamapblit_quint32, qt_alphargbblit_quint32, - qt_rectfill_nonpremul_quint32 + qt_rectfill_nonpremul_argb32 }, // Format_ARGB32_Premultiplied { @@ -5976,7 +5992,7 @@ DrawHelper qDrawHelper[QImage::NImageFormats] = qt_bitmapblit_quint32, qt_alphamapblit_quint32, qt_alphargbblit_quint32, - qt_rectfill_quint32 + qt_rectfill_argb32 }, // Format_RGB16 { @@ -6047,7 +6063,7 @@ DrawHelper qDrawHelper[QImage::NImageFormats] = 0, 0, #endif - qt_rectfill_quint32 + qt_rectfill_rgba }, // Format_RGBA8888 { @@ -6061,7 +6077,7 @@ DrawHelper qDrawHelper[QImage::NImageFormats] = 0, 0, #endif - qt_rectfill_quint32 + qt_rectfill_nonpremul_rgba }, // Format_RGB8888_Premultiplied { @@ -6075,7 +6091,7 @@ DrawHelper qDrawHelper[QImage::NImageFormats] = 0, 0, #endif - qt_rectfill_quint32 + qt_rectfill_rgba } }; diff --git a/tests/auto/gui/painting/qpainter/tst_qpainter.cpp b/tests/auto/gui/painting/qpainter/tst_qpainter.cpp index e5ded203cf..5a1ca855a1 100644 --- a/tests/auto/gui/painting/qpainter/tst_qpainter.cpp +++ b/tests/auto/gui/painting/qpainter/tst_qpainter.cpp @@ -122,10 +122,15 @@ private slots: void drawRect(); void drawRect2(); + void fillRect_data(); void fillRect(); + void fillRect2_data(); void fillRect2(); + void fillRect3_data() { fillRect2_data(); } void fillRect3(); + void fillRect4_data() { fillRect2_data(); } void fillRect4(); + void fillRectNonPremul(); void drawEllipse_data(); void drawEllipse(); @@ -1079,9 +1084,19 @@ void tst_QPainter::drawRect2() } } +void tst_QPainter::fillRect_data() +{ + QTest::addColumn("format"); + + QTest::newRow("argb32pm") << QImage::Format_ARGB32_Premultiplied; + QTest::newRow("rgba8888pm") << QImage::Format_RGBA8888_Premultiplied; +} + void tst_QPainter::fillRect() { - QImage image(100, 100, QImage::Format_ARGB32_Premultiplied); + QFETCH(QImage::Format, format); + + QImage image(100, 100, format); image.fill(QColor(0, 0, 0, 0).rgba()); QPainter p(&image); @@ -1103,17 +1118,29 @@ void tst_QPainter::fillRect() QRect(0, 0, 50, 100)); } +void tst_QPainter::fillRect2_data() +{ + QTest::addColumn("format"); + + QTest::newRow("argb32") << QImage::Format_ARGB32; + QTest::newRow("argb32pm") << QImage::Format_ARGB32_Premultiplied; + QTest::newRow("rgba8888") << QImage::Format_RGBA8888; + QTest::newRow("rgba8888pm") << QImage::Format_RGBA8888_Premultiplied; +} + void tst_QPainter::fillRect2() { + QFETCH(QImage::Format, format); + QRgb background = 0x0; - QImage img(1, 20, QImage::Format_ARGB32_Premultiplied); + QImage img(1, 20, format); img.fill(background); QPainter p(&img); QRectF rect(0, 1, 1.2, 18); - p.fillRect(rect, Qt::black); + p.fillRect(rect, Qt::yellow); p.end(); @@ -1122,11 +1149,14 @@ void tst_QPainter::fillRect2() QCOMPARE(img.pixel(0, 1), img.pixel(0, 2)); QCOMPARE(img.pixel(0, img.height() - 2), img.pixel(0, img.height() - 3)); + QCOMPARE(img.pixel(0, 1), QColor(Qt::yellow).rgba()); } void tst_QPainter::fillRect3() { - QImage img(1, 1, QImage::Format_ARGB32_Premultiplied); + QFETCH(QImage::Format, format); + + QImage img(1, 1, format); img.fill(QColor(Qt::black).rgba()); QPainter p(&img); @@ -1139,7 +1169,9 @@ void tst_QPainter::fillRect3() void tst_QPainter::fillRect4() { - QImage image(100, 1, QImage::Format_ARGB32_Premultiplied); + QFETCH(QImage::Format, format); + + QImage image(100, 1, format); image.fill(0x0); QImage expected = image; @@ -1157,6 +1189,24 @@ void tst_QPainter::fillRect4() QCOMPARE(image, expected); } +void tst_QPainter::fillRectNonPremul() +{ + QImage img1(1, 1, QImage::Format_ARGB32); + QImage img2(1, 1, QImage::Format_RGBA8888); + + QPainter p1(&img1); + QPainter p2(&img2); + + QRectF rect(0, 0, 1, 1); + p1.fillRect(rect, qRgba(31, 63, 127, 127)); + p2.fillRect(rect, qRgba(31, 63, 127, 127)); + + p1.end(); + p2.end(); + + QCOMPARE(img1.pixel(0, 0), img2.pixel(0,0)); +} + void tst_QPainter::drawPath_data() { QTest::addColumn("path");