diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2021-05-04 13:03:50 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2021-05-27 00:18:04 +0200 |
commit | da30e402f38a434f856fa8670a8813c3cffe6440 (patch) | |
tree | 80a50d2a5e232fdde6c20f8181558e00d3533aff /tests/auto/gui/painting | |
parent | f3e7073f938ead15d8651623a23fe402186cb709 (diff) |
Add SIMD optimizations for color-transform writes
Add NEON for RGB32 and RGBA64 writeback, and SSE2 for
RGBA64 writeback.
Change-Id: Id9ee803267a78f5bdff5beaa719e7a59c1dbb9fb
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'tests/auto/gui/painting')
-rw-r--r-- | tests/auto/gui/painting/qcolorspace/tst_qcolorspace.cpp | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/tests/auto/gui/painting/qcolorspace/tst_qcolorspace.cpp b/tests/auto/gui/painting/qcolorspace/tst_qcolorspace.cpp index 0c8536d385..913fe55364 100644 --- a/tests/auto/gui/painting/qcolorspace/tst_qcolorspace.cpp +++ b/tests/auto/gui/painting/qcolorspace/tst_qcolorspace.cpp @@ -61,6 +61,8 @@ private slots: void imageConversion(); void imageConversion64_data(); void imageConversion64(); + void imageConversion64PM_data(); + void imageConversion64PM(); void imageConversionOverLargerGamut_data(); void imageConversionOverLargerGamut(); @@ -353,6 +355,76 @@ void tst_QColorSpace::imageConversion64() } } +void tst_QColorSpace::imageConversion64PM_data() +{ + imageConversion64_data(); +} + +void tst_QColorSpace::imageConversion64PM() +{ + QFETCH(QColorSpace::NamedColorSpace, fromColorSpace); + QFETCH(QColorSpace::NamedColorSpace, toColorSpace); + + QImage testImage(256, 16, QImage::Format_RGBA64_Premultiplied); + + for (int j = 0; j < 16; ++j) { + int a = j * 15; + for (int i = 0; i < 256; ++i) + testImage.setPixel(i, j, qPremultiply(qRgba(i, i, i, a))); + } + + testImage.setColorSpace(fromColorSpace); + QCOMPARE(testImage.colorSpace(), QColorSpace(fromColorSpace)); + + testImage.convertToColorSpace(toColorSpace); + QCOMPARE(testImage.colorSpace(), QColorSpace(toColorSpace)); + + int lastRed = 0; + int lastGreen = 0; + int lastBlue = 0; + for (int j = 0; j < 16; ++j) { + for (int i = 0; i < 256; ++i) { + QRgb p = testImage.pixel(i, j); + QVERIFY(qRed(p) >= lastRed); + QVERIFY(qGreen(p) >= lastGreen); + QVERIFY(qBlue(p) >= lastBlue); + QCOMPARE(qAlpha(p), j * 15); + lastRed = qRed(p); + lastGreen = qGreen(p); + lastBlue = qBlue(p); + } + QVERIFY(lastRed <= j * 15); + QVERIFY(lastGreen <= j * 15); + QVERIFY(lastBlue <= j * 15); + lastRed = 0; + lastGreen = 0; + lastBlue = 0; + } + + testImage.convertToColorSpace(fromColorSpace); + QCOMPARE(testImage.colorSpace(), QColorSpace(fromColorSpace)); + for (int j = 0; j < 16; ++j) { + for (int i = 0; i < 256; ++i) { + QRgb p = testImage.pixel(i, j); + QCOMPARE(qRed(p), qGreen(p)); + QCOMPARE(qRed(p), qBlue(p)); + QCOMPARE(qAlpha(p), j * 15); + QVERIFY((lastRed - qRed(p)) <= 0); + QVERIFY((lastGreen - qGreen(p)) <= 0); + QVERIFY((lastBlue - qBlue(p)) <= 0); + lastRed = qRed(p); + lastGreen = qGreen(p); + lastBlue = qBlue(p); + } + QVERIFY(lastRed <= j * 15); + QVERIFY(lastGreen <= j * 15); + QVERIFY(lastBlue <= j * 15); + lastRed = 0; + lastGreen = 0; + lastBlue = 0; + } +} + void tst_QColorSpace::imageConversionOverLargerGamut_data() { QTest::addColumn<QColorSpace::NamedColorSpace>("fromColorSpace"); |