From e4d623e3cf92ba2f35094841d2c6015a43c29e17 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Thu, 11 Jun 2015 13:45:58 +0100 Subject: Pass a note rather than failing an assert on clamping XYZ values after conversion. --- src/rgb_xyz.cc | 23 +++++++++++++++++++---- src/rgb_xyz.h | 9 ++++++++- 2 files changed, 27 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/rgb_xyz.cc b/src/rgb_xyz.cc index 9a062614..08a4e838 100644 --- a/src/rgb_xyz.cc +++ b/src/rgb_xyz.cc @@ -225,7 +225,8 @@ dcp::rgb_to_xyz ( uint8_t const * rgb, dcp::Size size, int stride, - ColourConversion const & conversion + ColourConversion const & conversion, + optional note ) { shared_ptr xyz (new OpenJPEGImage (size)); @@ -247,6 +248,7 @@ dcp::rgb_to_xyz ( boost::numeric::ublas::matrix const rgb_to_xyz = conversion.rgb_to_xyz (); boost::numeric::ublas::matrix const bradford = conversion.bradford (); + int clamped = 0; int jn = 0; for (int y = 0; y < size.height; ++y) { uint16_t const * p = reinterpret_cast (rgb + y * stride); @@ -271,10 +273,19 @@ dcp::rgb_to_xyz ( e.y = e.y * DCI_COEFFICIENT * 65535; e.z = e.z * DCI_COEFFICIENT * 65535; - DCP_ASSERT (e.x >= 0 && e.x < 65536); - DCP_ASSERT (e.y >= 0 && e.y < 65536); - DCP_ASSERT (e.z >= 0 && e.z < 65536); + /* Clamp */ + + if (e.x < 0 || e.y < 0 || e.z < 0 || e.x > 65535 || e.y > 65535 || e.z > 65535) { + ++clamped; + } + e.x = max (0.0d, e.x); + e.y = max (0.0d, e.y); + e.z = max (0.0d, e.z); + e.x = min (65535.0d, e.x); + e.y = min (65535.0d, e.y); + e.z = min (65535.0d, e.z); + /* Out gamma LUT */ xyz->data(0)[jn] = lut_out[int(rint(e.x))] * 4095; xyz->data(1)[jn] = lut_out[int(rint(e.y))] * 4095; @@ -284,6 +295,10 @@ dcp::rgb_to_xyz ( } } + if (clamped) { + note.get() (DCP_NOTE, String::compose ("%1 XYZ value(s) clamped", clamped)); + } + return xyz; } diff --git a/src/rgb_xyz.h b/src/rgb_xyz.h index 04529db0..40aaf762 100644 --- a/src/rgb_xyz.h +++ b/src/rgb_xyz.h @@ -43,7 +43,14 @@ extern void xyz_to_rgb ( boost::optional note = boost::optional () ); -extern boost::shared_ptr rgb_to_xyz (uint8_t const * rgb, dcp::Size size, int stride, ColourConversion const & conversion); +extern boost::shared_ptr rgb_to_xyz ( + uint8_t const * rgb, + dcp::Size size, + int stride, + ColourConversion const & conversion, + boost::optional note = boost::optional () + ); + extern boost::shared_ptr xyz_to_xyz (uint8_t const * xyz, dcp::Size size, int stride); } -- cgit v1.2.3