X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=test%2Frgb_xyz_test.cc;h=69a4d612781c8ab75a3ed8b53e253a1e15772c00;hb=e61267217a8ca7e65ad42bf34b6488b92eca6389;hp=0b42789386abbc2cb62800d75e21224844277879;hpb=86bfdeb77f55b379302a65b22f57fc0583ec6b3c;p=libdcp.git diff --git a/test/rgb_xyz_test.cc b/test/rgb_xyz_test.cc index 0b427893..69a4d612 100644 --- a/test/rgb_xyz_test.cc +++ b/test/rgb_xyz_test.cc @@ -1,25 +1,40 @@ /* - Copyright (C) 2014-2015 Carl Hetherington + Copyright (C) 2014-2021 Carl Hetherington - This program is free software; you can redistribute it and/or modify + This file is part of libdcp. + + libdcp is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - This program is distributed in the hope that it will be useful, + libdcp is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - + along with libdcp. If not, see . + + In addition, as a special exception, the copyright holders give + permission to link the code of portions of this program with the + OpenSSL library under certain conditions as described in each + individual source file, and distribute linked combinations + including the two. + + You must obey the GNU General Public License in all respects + for all of the code used other than OpenSSL. If you modify + file(s) with this exception, you may extend this exception to your + version of the file(s), but you are not obligated to do so. If you + do not wish to do so, delete this exception statement from your + version. If you delete this exception statement from all source + files in the program, then also delete it here. */ #include "rgb_xyz.h" -#include "xyz_image.h" +#include "openjpeg_image.h" #include "colour_conversion.h" +#include "stream_operators.h" #include #include #include @@ -27,14 +42,16 @@ using std::max; using std::list; using std::string; -using boost::shared_ptr; +using std::cout; +using std::shared_ptr; +using std::make_shared; 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) { - unsigned int seed = 0; + srand (0); dcp::Size const size (640, 480); scoped_array rgb (new uint8_t[size.width * size.height * 6]); @@ -43,13 +60,13 @@ BOOST_AUTO_TEST_CASE (rgb_xyz_test) 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_r (&seed) & 0xfff) << 4; + *p = (rand () & 0xfff) << 4; ++p; } } } - shared_ptr xyz = dcp::rgb_to_xyz (rgb.get(), size, size.width * 6, dcp::ColourConversion::srgb_to_xyz ()); + auto 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 (rgb.get() + y * size.width * 6); @@ -109,15 +126,15 @@ static list notes; static void note_handler (dcp::NoteType n, string s) { - BOOST_REQUIRE_EQUAL (n, dcp::DCP_NOTE); + BOOST_REQUIRE_EQUAL (n, dcp::NoteType::NOTE); notes.push_back (s); } /** Check that xyz_to_rgb clamps XYZ values correctly */ BOOST_AUTO_TEST_CASE (xyz_rgb_range_test) { - shared_ptr xyz (new dcp::XYZImage (dcp::Size (2, 2))); - + auto xyz = make_shared(dcp::Size(2, 2)); + xyz->data(0)[0] = -4; xyz->data(0)[1] = 6901; xyz->data(0)[2] = 0; @@ -140,7 +157,7 @@ BOOST_AUTO_TEST_CASE (xyz_rgb_range_test) /* The 6 out-of-range samples should have been noted */ BOOST_REQUIRE_EQUAL (notes.size(), 6); - list::const_iterator i = notes.begin (); + auto i = notes.begin (); BOOST_REQUIRE_EQUAL (*i++, "XYZ value -4 out of range"); BOOST_REQUIRE_EQUAL (*i++, "XYZ value -4 out of range"); BOOST_REQUIRE_EQUAL (*i++, "XYZ value -4 out of range"); @@ -152,7 +169,7 @@ BOOST_AUTO_TEST_CASE (xyz_rgb_range_test) as inputs at the extremes (0 and 4095). */ - uint16_t* buffer = reinterpret_cast (rgb.get ()); + auto buffer = reinterpret_cast (rgb.get ()); BOOST_REQUIRE_EQUAL (buffer[0 * 3 + 0], buffer[2 * 3 + 1]); BOOST_REQUIRE_EQUAL (buffer[0 * 3 + 1], buffer[2 * 3 + 1]); BOOST_REQUIRE_EQUAL (buffer[0 * 3 + 2], buffer[2 * 3 + 2]); @@ -161,3 +178,35 @@ BOOST_AUTO_TEST_CASE (xyz_rgb_range_test) BOOST_REQUIRE_EQUAL (buffer[1 * 3 + 1], buffer[3 * 3 + 1]); BOOST_REQUIRE_EQUAL (buffer[1 * 3 + 2], buffer[3 * 3 + 2]); } + +/** Convert an image from RGB to XYZ and back again */ +BOOST_AUTO_TEST_CASE (rgb_xyz_round_trip_test) +{ + srand (0); + dcp::Size const size (640, 480); + + scoped_array rgb (new uint8_t[size.width * size.height * 6]); + for (int y = 0; y < size.height; ++y) { + uint16_t* p = reinterpret_cast (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 xyz = dcp::rgb_to_xyz (rgb.get(), size, size.width * 6, dcp::ColourConversion::srgb_to_xyz ()); + scoped_array back (new uint8_t[size.width * size.height * 6]); + dcp::xyz_to_rgb (xyz, dcp::ColourConversion::srgb_to_xyz (), back.get(), size.width * 6); + +#if 0 + uint16_t* p = reinterpret_cast (rgb.get ()); + uint16_t* q = reinterpret_cast (back.get ()); + for (int i = 0; i < (size.width * size.height); ++i) { + /* XXX: doesn't quite work */ + // BOOST_REQUIRE_EQUAL (*p++, *q++); + } +#endif +}