More tests.
[libdcp.git] / src / gamma_lut.cc
index 1a954914616130e89df3486c90d2133bd9329c82..abe35b7cf24e13dc051d28a456c12db08adde13a 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2012-2013 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2012-2014 Carl Hetherington <cth@carlh.net>
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -25,11 +25,26 @@ using namespace dcp;
 
 LUTCache<GammaLUT> GammaLUT::cache;
 
-GammaLUT::GammaLUT (int bits, float gamma)
-       : LUT (bits, gamma)
+GammaLUT::GammaLUT (int bit_depth, float gamma, bool linearised)
+       : _bit_depth (bit_depth)
+       , _gamma (gamma)
+       , _linearised (linearised)
 {
-       int const bit_length = pow (2, bits);
-       for (int i = 0; i < bit_length; ++i) {
-               _lut[i] = pow(float(i) / (bit_length - 1), gamma);
+       _lut = new float[int(std::pow(2.0f, _bit_depth))];
+       int const bit_length = pow (2, _bit_depth);
+
+       if (_linearised) {
+               for (int i = 0; i < bit_length; ++i) {
+                       float const p = static_cast<float> (i) / (bit_length - 1);
+                       if (p > 0.04045) {
+                               _lut[i] = pow ((p + 0.055) / 1.055, gamma);
+                       } else {
+                               _lut[i] = p / 12.92;
+                       }
+               }
+       } else {
+               for (int i = 0; i < bit_length; ++i) {
+                       _lut[i] = pow(float(i) / (bit_length - 1), gamma);
+               }
        }
 }