diff options
| author | Carl Hetherington <cth@carlh.net> | 2020-06-02 02:20:28 +0200 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2020-06-02 02:20:28 +0200 |
| commit | 9895449dc9656507305940f387beb1e3998b0fe3 (patch) | |
| tree | d0e97720d0046feb357ad1aae7fd1201010a3feb /test | |
| parent | 5b8a4b35162020c9d48c3055d132e8d8df3d290f (diff) | |
Re-add non-AVX2 versions.
Diffstat (limited to 'test')
| -rw-r--r-- | test/rgb_xyz_test.cc | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/test/rgb_xyz_test.cc b/test/rgb_xyz_test.cc index 92c48e62..d9c27ae2 100644 --- a/test/rgb_xyz_test.cc +++ b/test/rgb_xyz_test.cc @@ -46,6 +46,81 @@ using boost::shared_ptr; using boost::optional; using boost::scoped_array; + +/** Convert a test image from sRGB to XYZ and check that the transforms are right */ +BOOST_AUTO_TEST_CASE (rgb_xyz_test) +{ + srand (0); + dcp::Size const size (640, 480); + + scoped_array<uint8_t> rgb (new uint8_t[size.width * size.height * 6]); + for (int y = 0; y < size.height; ++y) { + uint16_t* p = reinterpret_cast<uint16_t*> (rgb.get() + y * size.width * 6); + for (int x = 0; x < size.width; ++x) { + /* Write a 12-bit random number for each component */ + for (int c = 0; c < 3; ++c) { + *p = (rand () & 0xfff) << 4; + ++p; + } + } + } + + shared_ptr<dcp::OpenJPEGImage> xyz = dcp::rgb_to_xyz (rgb.get(), size, size.width * 6, dcp::ColourConversion::srgb_to_xyz ()); + + for (int y = 0; y < size.height; ++y) { + uint16_t* p = reinterpret_cast<uint16_t*> (rgb.get() + y * size.width * 6); + for (int x = 0; x < size.width; ++x) { + + double cr = *p++ / 65535.0; + double cg = *p++ / 65535.0; + double cb = *p++ / 65535.0; + + /* Input gamma */ + + if (cr < 0.04045) { + cr /= 12.92; + } else { + cr = pow ((cr + 0.055) / 1.055, 2.4); + } + + if (cg < 0.04045) { + cg /= 12.92; + } else { + cg = pow ((cg + 0.055) / 1.055, 2.4); + } + + if (cb < 0.04045) { + cb /= 12.92; + } else { + cb = pow ((cb + 0.055) / 1.055, 2.4); + } + + /* Matrix */ + + double cx = cr * 0.4124564 + cg * 0.3575761 + cb * 0.1804375; + double cy = cr * 0.2126729 + cg * 0.7151522 + cb * 0.0721750; + double cz = cr * 0.0193339 + cg * 0.1191920 + cb * 0.9503041; + + /* Compand */ + + cx *= 48 / 52.37; + cy *= 48 / 52.37; + cz *= 48 / 52.37; + + /* Output gamma */ + + cx = pow (cx, 1 / 2.6); + cy = pow (cy, 1 / 2.6); + cz = pow (cz, 1 / 2.6); + + BOOST_REQUIRE_CLOSE (cx * 4095, xyz->data(0)[y * size.width + x], 1); + BOOST_REQUIRE_CLOSE (cy * 4095, xyz->data(1)[y * size.width + x], 1); + BOOST_REQUIRE_CLOSE (cz * 4095, xyz->data(2)[y * size.width + x], 1); + } + } +} + + /** Convert a test image from sRGB to XYZ using the AVX2 code and check that the transforms are right */ BOOST_AUTO_TEST_CASE (rgb_xyz_test_avx2) { |
