From e69ebf93ca49d2c3de9fc723c744fbcb21709bb3 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Tue, 12 Apr 2022 11:04:12 +0200 Subject: Add floating point color space conversions This allows color space conversions that produces values outside the 0.0->1.0 range, which is one of the intended functions of the floating point image formats. Change-Id: I63b37b0f6934d4382edafb4709486c785a637c67 Reviewed-by: Laszlo Agocs Reviewed-by: Eirik Aavitsland --- .../gui/painting/qcolorspace/tst_qcolorspace.cpp | 51 ++++++++++++++++++++++ 1 file changed, 51 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 576885de34..16c2f41d6c 100644 --- a/tests/auto/gui/painting/qcolorspace/tst_qcolorspace.cpp +++ b/tests/auto/gui/painting/qcolorspace/tst_qcolorspace.cpp @@ -65,6 +65,8 @@ private slots: void imageConversion64PM(); void imageConversionOverLargerGamut_data(); void imageConversionOverLargerGamut(); + void imageConversionOverLargerGamut2_data(); + void imageConversionOverLargerGamut2(); void loadImage(); @@ -489,6 +491,55 @@ void tst_QColorSpace::imageConversionOverLargerGamut() } } +void tst_QColorSpace::imageConversionOverLargerGamut2_data() +{ + QTest::addColumn("format"); + + QTest::newRow("rgbx16x4") << QImage::Format_RGBX16FPx4; + QTest::newRow("rgba16x4") << QImage::Format_RGBA16FPx4; + QTest::newRow("rgba16x4PM") << QImage::Format_RGBA16FPx4_Premultiplied; + QTest::newRow("rgbx32x4") << QImage::Format_RGBX32FPx4; + QTest::newRow("rgba32x4") << QImage::Format_RGBA32FPx4; + QTest::newRow("rgba32x4PM") << QImage::Format_RGBA32FPx4_Premultiplied; +} + +void tst_QColorSpace::imageConversionOverLargerGamut2() +{ + QFETCH(QImage::Format, format); + + QColorSpace csfrom = QColorSpace::DisplayP3; + QColorSpace csto = QColorSpace::SRgb; + + QImage testImage(256, 256, format); + testImage.setColorSpace(csfrom); + for (int y = 0; y < 256; ++y) + for (int x = 0; x < 256; ++x) + testImage.setPixel(x, y, qRgba(x, y, 16, 255)); + + QImage resultImage = testImage.convertedToColorSpace(csto); + for (int y = 0; y < 256; ++y) { + float lastRed = -256.0f; + for (int x = 0; x < 256; ++x) { + float pr = resultImage.pixelColor(x, y).redF(); + QVERIFY(pr >= lastRed); + lastRed = pr; + } + } + for (int x = 0; x < 256; ++x) { + float lastGreen = -256.0f; + for (int y = 0; y < 256; ++y) { + float pg = resultImage.pixelColor(x, y).greenF(); + QVERIFY(pg >= lastGreen); + lastGreen = pg; + } + } + // Test colors outside of sRGB are converted to values outside of 0-1 range. + QVERIFY(resultImage.pixelColor(255, 0).redF() > 1.0f); + QVERIFY(resultImage.pixelColor(255, 0).greenF() < 0.0f); + QVERIFY(resultImage.pixelColor(0, 255).redF() < 0.0f); + QVERIFY(resultImage.pixelColor(0, 255).greenF() > 1.0f); +} + void tst_QColorSpace::loadImage() { QString prefix = QFINDTESTDATA("resources/"); -- cgit v1.2.3