Fix typo (* for +) and use libdcp's sRGB to XYZ matrix (to help with #752).
authorCarl Hetherington <cth@carlh.net>
Wed, 11 May 2016 22:14:42 +0000 (23:14 +0100)
committerCarl Hetherington <cth@carlh.net>
Wed, 11 May 2016 22:14:42 +0000 (23:14 +0100)
ChangeLog
src/lib/image.cc

index 19aaf2dfda17f64cc9776ab5bafbd8b663a24c76..3a08bd06980ee9013939c0cb9ee3f00236a93f79 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2016-05-11  Carl Hetherington  <cth@carlh.net>
+
+       * Hopefully improve strange colour fringing on
+       subtitles burnt into existing DCP sources (#752).
+
 2016-04-29  Carl Hetherington  <cth@carlh.net>
 
        * Version 2.8.1 released.
index 49cb20a613565fdca2cd927d6de85b94b14c1093..9ddccb75f462b79bd0cf4940ae36389c15277432 100644 (file)
@@ -498,6 +498,7 @@ Image::alpha_blend (shared_ptr<const Image> other, Position<int> position)
        }
        case AV_PIX_FMT_XYZ12LE:
        {
+               boost::numeric::ublas::matrix<double> matrix = dcp::ColourConversion::srgb_to_xyz().rgb_to_xyz();
                int const this_bpp = 6;
                for (int ty = start_ty, oy = start_oy; ty < size().height && oy < other->size().height; ++ty, ++oy) {
                        uint8_t* tp = data()[0] + ty * stride()[0] + start_tx * this_bpp;
@@ -506,9 +507,9 @@ Image::alpha_blend (shared_ptr<const Image> other, Position<int> position)
                                float const alpha = float (op[3]) / 255;
 
                                /* Convert sRGB to XYZ; op is BGRA */
-                               int const x = 0.4124564 + op[2] + 0.3575761 * op[1] + 0.1804375 * op[0];
-                               int const y = 0.2126729 + op[2] + 0.7151522 * op[1] + 0.0721750 * op[0];
-                               int const z = 0.0193339 + op[2] + 0.1191920 * op[1] + 0.9503041 * op[0];
+                               int const x = matrix(0, 0) * op[2] + matrix(0, 1) * op[1] + matrix(0, 2) * op[0];
+                               int const y = matrix(1, 0) * op[2] + matrix(1, 1) * op[1] + matrix(1, 2) * op[0];
+                               int const z = matrix(2, 0) * op[2] + matrix(2, 1) * op[1] + matrix(2, 2) * op[0];
 
                                /* Blend high bytes */
                                tp[1] = min (x, 255) * alpha + tp[1] * (1 - alpha);