summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2015-01-04 13:54:15 +0000
committerCarl Hetherington <cth@carlh.net>2015-01-04 13:54:15 +0000
commitc2018e0dae9ed2503b6244a47524a7ce16eedb0b (patch)
tree267fc895ab639dbd59c460867a90efe9bbee7e40
parent3a546df5dacafb99958d53c9738e135d4f0deb2b (diff)
Try to fix static initialisation order problems.
-rw-r--r--src/colour_conversion.cc45
-rw-r--r--src/colour_conversion.h6
-rw-r--r--src/mono_picture_frame.cc4
-rw-r--r--src/stereo_picture_frame.cc4
-rw-r--r--test/colour_conversion_test.cc4
-rw-r--r--test/rgb_xyz_test.cc2
6 files changed, 40 insertions, 25 deletions
diff --git a/src/colour_conversion.cc b/src/colour_conversion.cc
index f2e85e76..5a2b1fd5 100644
--- a/src/colour_conversion.cc
+++ b/src/colour_conversion.cc
@@ -25,23 +25,38 @@
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,
diff --git a/src/colour_conversion.h b/src/colour_conversion.h
index e2a8c6bc..cf19d447 100644
--- a/src/colour_conversion.h
+++ b/src/colour_conversion.h
@@ -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;
diff --git a/src/mono_picture_frame.cc b/src/mono_picture_frame.cc
index 4fe9356c..e7dc04ab 100644
--- a/src/mono_picture_frame.cc
+++ b/src/mono_picture_frame.cc
@@ -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
);
}
diff --git a/src/stereo_picture_frame.cc b/src/stereo_picture_frame.cc
index 3e872e2b..c510641d 100644
--- a/src/stereo_picture_frame.cc
+++ b/src/stereo_picture_frame.cc
@@ -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 *
diff --git a/test/colour_conversion_test.cc b/test/colour_conversion_test.cc
index aafd2cad..4640b36c 100644
--- a/test/colour_conversion_test.cc
+++ b/test/colour_conversion_test.cc
@@ -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);
diff --git a/test/rgb_xyz_test.cc b/test/rgb_xyz_test.cc
index 2927bd9a..2c76bb33 100644
--- a/test/rgb_xyz_test.cc
+++ b/test/rgb_xyz_test.cc
@@ -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]);