Try to fix static initialisation order problems.
authorCarl Hetherington <cth@carlh.net>
Sun, 4 Jan 2015 13:54:15 +0000 (13:54 +0000)
committerCarl Hetherington <cth@carlh.net>
Sun, 4 Jan 2015 13:54:15 +0000 (13:54 +0000)
src/colour_conversion.cc
src/colour_conversion.h
src/mono_picture_frame.cc
src/stereo_picture_frame.cc
test/colour_conversion_test.cc
test/rgb_xyz_test.cc

index f2e85e7603154ad497fe13c09bb88ec847894144..5a2b1fd5b8e74da446a3aa6b4eee71aee2f779d9 100644 (file)
 using boost::shared_ptr;
 using namespace dcp;
 
-ColourConversion ColourConversion::srgb_to_xyz (
-       shared_ptr<const TransferFunction> (new ModifiedGammaTransferFunction (false, 2.4, 0.04045, 0.055, 12.92)),
-       dcp::colour_matrix::srgb_to_xyz,
-       shared_ptr<const TransferFunction> (new GammaTransferFunction (true, 2.6))
-       );
+ColourConversion const &
+ColourConversion::srgb_to_xyz ()
+{
+       static ColourConversion* c = new ColourConversion (
+               shared_ptr<const TransferFunction> (new ModifiedGammaTransferFunction (false, 2.4, 0.04045, 0.055, 12.92)),
+               dcp::colour_matrix::srgb_to_xyz,
+               shared_ptr<const TransferFunction> (new GammaTransferFunction (true, 2.6))
+               );
+       return *c;
+}
 
-ColourConversion ColourConversion::xyz_to_srgb (
-       shared_ptr<const TransferFunction> (new GammaTransferFunction (false, 2.6)),
-       dcp::colour_matrix::xyz_to_rgb,
-       shared_ptr<const TransferFunction> (new ModifiedGammaTransferFunction (true, 2.4, 0.04045, 0.055, 12.92))
-       );
+ColourConversion const &
+ColourConversion::xyz_to_srgb ()
+{
+       static ColourConversion* c = new ColourConversion (
+               shared_ptr<const TransferFunction> (new GammaTransferFunction (false, 2.6)),
+               dcp::colour_matrix::xyz_to_rgb,
+               shared_ptr<const TransferFunction> (new ModifiedGammaTransferFunction (true, 2.4, 0.04045, 0.055, 12.92))
+               );
+       return *c;
+}
 
-ColourConversion ColourConversion::rec709_to_xyz (
-       shared_ptr<const TransferFunction> (new ModifiedGammaTransferFunction (false, 2.4, 0.081, 0.099, 4.5)),
-       dcp::colour_matrix::srgb_to_xyz,
-       shared_ptr<const TransferFunction> (new GammaTransferFunction (true, 2.6))
-       );
+ColourConversion const &
+ColourConversion::rec709_to_xyz ()
+{
+       static ColourConversion* c = new ColourConversion (
+               shared_ptr<const TransferFunction> (new ModifiedGammaTransferFunction (false, 2.4, 0.081, 0.099, 4.5)),
+               dcp::colour_matrix::srgb_to_xyz,
+               shared_ptr<const TransferFunction> (new GammaTransferFunction (true, 2.6))
+               );
+       return *c;
+}
 
 ColourConversion::ColourConversion (
        shared_ptr<const TransferFunction> in,
index e2a8c6bcf2d4d1c9a3363685ce78cca9a74c11e5..cf19d4471492c4f59678161a414d69c738bef9bb 100644 (file)
@@ -63,9 +63,9 @@ public:
 
        bool about_equal (ColourConversion const & other, float epsilon) const;
 
-       static ColourConversion srgb_to_xyz;
-       static ColourConversion xyz_to_srgb;
-       static ColourConversion rec709_to_xyz;
+       static ColourConversion const & srgb_to_xyz ();
+       static ColourConversion const & xyz_to_srgb ();
+       static ColourConversion const & rec709_to_xyz ();
 
 protected:
        boost::shared_ptr<const TransferFunction> _in;
index 4fe9356cfa6833af345346ffd24af178585c0640..e7dc04abe46d48fb1e6bdcf6c6606f7bfd90f3c9 100644 (file)
@@ -123,7 +123,7 @@ MonoPictureFrame::argb_frame (int reduce, float srgb_gamma) const
 {
        return xyz_to_rgba (
                decompress_j2k (const_cast<uint8_t*> (_buffer->RoData()), _buffer->Size(), reduce),
-               ColourConversion::xyz_to_srgb
+               ColourConversion::xyz_to_srgb ()
                );
 }
 
@@ -132,7 +132,7 @@ MonoPictureFrame::rgb_frame (uint16_t* buffer) const
 {
        xyz_to_rgb (
                decompress_j2k (const_cast<uint8_t*> (_buffer->RoData()), _buffer->Size(), 0),
-               ColourConversion::xyz_to_srgb,
+               ColourConversion::xyz_to_srgb (),
                buffer
                );
 }
index 3e872e2bf45812039027c209c3ce445554e80b68..c510641d6207466c91740c75d59fe565a8b87830 100644 (file)
@@ -89,7 +89,7 @@ StereoPictureFrame::argb_frame (Eye eye, int reduce, float srgb_gamma) const
                break;
        }
        
-       return xyz_to_rgba (xyz_frame, ColourConversion::xyz_to_srgb);
+       return xyz_to_rgba (xyz_frame, ColourConversion::xyz_to_srgb ());
 }
 
 void
@@ -105,7 +105,7 @@ StereoPictureFrame::rgb_frame (Eye eye, uint16_t* buffer) const
                break;
        }
        
-       return xyz_to_rgb (xyz_frame, ColourConversion::xyz_to_srgb, buffer);
+       return xyz_to_rgb (xyz_frame, ColourConversion::xyz_to_srgb (), buffer);
 }
 
 uint8_t const *
index aafd2cad77597b893749d29c56de4d38ed0d409e..4640b36c1e57688d6c7a053f087c8a4a0fae4dcb 100644 (file)
@@ -56,7 +56,7 @@ check_modified_gamma (shared_ptr<const TransferFunction> tf, int bit_depth, doub
 
 BOOST_AUTO_TEST_CASE (colour_conversion_test1)
 {
-       ColourConversion cc = ColourConversion::srgb_to_xyz;
+       ColourConversion cc = ColourConversion::srgb_to_xyz ();
 
        check_modified_gamma (cc.in(), 8, 2.4, 0.04045, 0.055, 12.92);
        check_modified_gamma (cc.in(), 12, 2.4, 0.04045, 0.055, 12.92);
@@ -69,7 +69,7 @@ BOOST_AUTO_TEST_CASE (colour_conversion_test1)
 
 BOOST_AUTO_TEST_CASE (colour_conversion_test2)
 {
-       ColourConversion cc = ColourConversion::rec709_to_xyz;
+       ColourConversion cc = ColourConversion::rec709_to_xyz ();
 
        check_modified_gamma (cc.in(), 8, 2.4, 0.081, 0.099, 4.5);
        check_modified_gamma (cc.in(), 12, 2.4, 0.081, 0.099, 4.5);
index 2927bd9afa50f205342c20a407e6df89af986f63..2c76bb332c448ca3e727846a789a78ea7929258a 100644 (file)
@@ -73,7 +73,7 @@ BOOST_AUTO_TEST_CASE (rgb_xyz_test)
                }
        }
 
-       shared_ptr<dcp::XYZFrame> xyz = dcp::rgb_to_xyz (rgb, dcp::ColourConversion::srgb_to_xyz);
+       shared_ptr<dcp::XYZFrame> xyz = dcp::rgb_to_xyz (rgb, dcp::ColourConversion::srgb_to_xyz ());
 
        for (int y = 0; y < size.height; ++y) {
                uint16_t* p = reinterpret_cast<uint16_t*> (rgb->data()[0] + y * rgb->stride()[0]);