X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=test%2Frgb_xyz_test.cc;h=cf42957b2597868cf07db129822af742bb79a2d3;hb=refs%2Fheads%2Fvideocon-1;hp=22baab268f31c0d8f3ac196b8b6d9d383812f5e9;hpb=41ab9a3ad26bb2fd17eca4d99780c46e315c393a;p=libdcp.git diff --git a/test/rgb_xyz_test.cc b/test/rgb_xyz_test.cc index 22baab26..cf42957b 100644 --- a/test/rgb_xyz_test.cc +++ b/test/rgb_xyz_test.cc @@ -1,20 +1,20 @@ /* Copyright (C) 2014-2015 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 . */ #include "rgb_xyz.h" @@ -27,6 +27,7 @@ using std::max; using std::list; using std::string; +using std::cout; using boost::shared_ptr; using boost::optional; using boost::scoped_array; @@ -34,7 +35,7 @@ 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,7 +44,7 @@ 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; } } @@ -117,7 +118,7 @@ note_handler (dcp::NoteType n, string s) BOOST_AUTO_TEST_CASE (xyz_rgb_range_test) { shared_ptr xyz (new dcp::OpenJPEGImage (dcp::Size (2, 2))); - + xyz->data(0)[0] = -4; xyz->data(0)[1] = 6901; xyz->data(0)[2] = 0; @@ -161,3 +162,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 +}