From da30e402f38a434f856fa8670a8813c3cffe6440 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Tue, 4 May 2021 13:03:50 +0200 Subject: 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 Reviewed-by: Thiago Macieira Reviewed-by: Lars Knoll --- .../gui/painting/qcolorspace/tst_qcolorspace.cpp | 72 ++++++++++++++++++++++ 1 file changed, 72 insertions(+) (limited to 'tests/auto/gui') 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("fromColorSpace"); -- cgit v1.2.3