Fix drawing vertical gradients in RGBA8888 formats

The RGBA8888 formats was incorrectly using the qt_gradient_quint32
which is argb specific. This caused vertical gradients but only
vertical gradients to be drawn incorrectly.

This changes the RGBA8888 formats formats to use the generic gradient
method and renames qt_gradient_quint32 to qt_gradient_argb32 to
indicate its limitation.

Change-Id: Ia1cd48ca7f4f78b64f31d6263e81cd8ac3b0954e
Reviewed-by: Gunnar Sletta <gunnar.sletta@jollamobile.com>
bb10
Allan Sandfeld Jensen 2014-02-07 14:38:47 +01:00 committed by The Qt Project
parent 2a3f635953
commit 15f3191981
2 changed files with 53 additions and 7 deletions

View File

@ -5507,7 +5507,7 @@ inline void qt_bitmapblit_template(QRasterBuffer *rasterBuffer,
}
}
static void qt_gradient_quint32(int count, const QSpan *spans, void *userData)
static void qt_gradient_argb32(int count, const QSpan *spans, void *userData)
{
QSpanData *data = reinterpret_cast<QSpanData *>(userData);
@ -5964,7 +5964,7 @@ DrawHelper qDrawHelper[QImage::NImageFormats] =
// Format_RGB32,
{
blend_color_argb,
qt_gradient_quint32,
qt_gradient_argb32,
qt_bitmapblit_quint32,
qt_alphamapblit_quint32,
qt_alphargbblit_quint32,
@ -5973,7 +5973,7 @@ DrawHelper qDrawHelper[QImage::NImageFormats] =
// Format_ARGB32,
{
blend_color_generic,
qt_gradient_quint32,
qt_gradient_argb32,
qt_bitmapblit_quint32,
qt_alphamapblit_quint32,
qt_alphargbblit_quint32,
@ -5982,7 +5982,7 @@ DrawHelper qDrawHelper[QImage::NImageFormats] =
// Format_ARGB32_Premultiplied
{
blend_color_argb,
qt_gradient_quint32,
qt_gradient_argb32,
qt_bitmapblit_quint32,
qt_alphamapblit_quint32,
qt_alphargbblit_quint32,
@ -6048,7 +6048,7 @@ DrawHelper qDrawHelper[QImage::NImageFormats] =
// Format_RGBX8888
{
blend_color_generic,
qt_gradient_quint32,
blend_src_generic,
qt_bitmapblit_quint32,
#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
qt_alphamapblit_quint32,
@ -6062,7 +6062,7 @@ DrawHelper qDrawHelper[QImage::NImageFormats] =
// Format_RGBA8888
{
blend_color_generic,
qt_gradient_quint32,
blend_src_generic,
qt_bitmapblit_quint32,
#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
qt_alphamapblit_quint32,
@ -6076,7 +6076,7 @@ DrawHelper qDrawHelper[QImage::NImageFormats] =
// Format_RGB8888_Premultiplied
{
blend_color_generic,
qt_gradient_quint32,
blend_src_generic,
qt_bitmapblit_quint32,
#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
qt_alphamapblit_quint32,

View File

@ -201,6 +201,9 @@ private slots:
void linearGradientSymmetry();
void gradientInterpolation();
void gradientPixelFormat_data();
void gradientPixelFormat();
void fpe_pixmapTransform();
void fpe_zeroLengthLines();
void fpe_divByZero();
@ -3723,6 +3726,49 @@ void tst_QPainter::linearGradientSymmetry()
QCOMPARE(a, b);
}
void tst_QPainter::gradientPixelFormat_data()
{
QTest::addColumn<QImage::Format>("format");
QTest::newRow("argb32") << QImage::Format_ARGB32;
QTest::newRow("rgb32") << QImage::Format_RGB32;
QTest::newRow("rgb888") << QImage::Format_RGB888;
QTest::newRow("rgbx8888") << QImage::Format_RGBX8888;
QTest::newRow("rgba8888") << QImage::Format_RGBA8888;
QTest::newRow("rgba8888_pm") << QImage::Format_RGBA8888_Premultiplied;
}
void tst_QPainter::gradientPixelFormat()
{
QFETCH(QImage::Format, format);
QImage a(8, 64, QImage::Format_ARGB32_Premultiplied);
QImage b(8, 64, format);
QGradientStops stops;
stops << qMakePair(qreal(0.0), QColor(Qt::blue));
stops << qMakePair(qreal(0.3), QColor(Qt::red));
stops << qMakePair(qreal(0.6), QColor(Qt::green));
stops << qMakePair(qreal(1.0), QColor(Qt::black));
a.fill(0);
b.fill(0);
QLinearGradient gradient(QRectF(b.rect()).topLeft(), QRectF(b.rect()).bottomLeft());
gradient.setStops(stops);
QPainter pa(&a);
pa.fillRect(a.rect(), gradient);
pa.end();
QPainter pb(&b);
pb.fillRect(b.rect(), gradient);
pb.end();
QCOMPARE(a, b.convertToFormat(QImage::Format_ARGB32_Premultiplied));
}
void tst_QPainter::gradientInterpolation()
{
QImage image(256, 8, QImage::Format_ARGB32_Premultiplied);