Fix fillRect on RGBA8888 images
The fill color was not correctly converted before being filled into RGBA8888 images. This patch adds a function with convertion and adds tests for it to tst_qpainter. Change-Id: If8b0e6db38b2794a60301842e25f377eb7216796 Reviewed-by: Gunnar Sletta <gunnar.sletta@digia.com>
This commit is contained in:
parent
5b9006bbdb
commit
de8567991f
@ -5901,7 +5901,7 @@ static void qt_alphargbblit_quint32(QRasterBuffer *rasterBuffer,
|
||||
}
|
||||
}
|
||||
|
||||
static void qt_rectfill_quint32(QRasterBuffer *rasterBuffer,
|
||||
static void qt_rectfill_argb32(QRasterBuffer *rasterBuffer,
|
||||
int x, int y, int width, int height,
|
||||
quint32 color)
|
||||
{
|
||||
@ -5917,7 +5917,7 @@ static void qt_rectfill_quint16(QRasterBuffer *rasterBuffer,
|
||||
qConvertRgb32To16(color), x, y, width, height, rasterBuffer->bytesPerLine());
|
||||
}
|
||||
|
||||
static void qt_rectfill_nonpremul_quint32(QRasterBuffer *rasterBuffer,
|
||||
static void qt_rectfill_nonpremul_argb32(QRasterBuffer *rasterBuffer,
|
||||
int x, int y, int width, int height,
|
||||
quint32 color)
|
||||
{
|
||||
@ -5925,6 +5925,22 @@ static void qt_rectfill_nonpremul_quint32(QRasterBuffer *rasterBuffer,
|
||||
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<quint32>(reinterpret_cast<quint32 *>(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<quint32>(reinterpret_cast<quint32 *>(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
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -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<QImage::Format>("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<QImage::Format>("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<QPainterPath>("path");
|
||||
|
Loading…
Reference in New Issue
Block a user