/*
- Copyright (C) 2012-2014 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2012-2021 Carl Hetherington <cth@carlh.net>
This file is part of libdcp.
files in the program, then also delete it here.
*/
+
/** @file src/transfer_function.h
- * @brief TransferFunction class.
+ * @brief TransferFunction class
*/
+
#ifndef LIBDCP_TRANSFER_FUNCTION_H
#define LIBDCP_TRANSFER_FUNCTION_H
-#include <boost/noncopyable.hpp>
-#include <boost/shared_ptr.hpp>
+
#include <boost/thread/mutex.hpp>
-#include <map>
+#include <unordered_map>
+#include <memory>
+#include <vector>
+
namespace dcp {
+
/** @class TransferFunction
* @brief A transfer function represented by a lookup table.
*/
-class TransferFunction : public boost::noncopyable
+class TransferFunction
{
public:
- virtual ~TransferFunction ();
+ TransferFunction () {}
+
+ virtual ~TransferFunction () {}
- /** @return A look-up table (of size 2^bit_depth) whose values range from 0 to 1 */
- double const * lut (int bit_depth, bool inverse) const;
+ /** @return A look-up table (of size 2^bit_depth) */
+ std::vector<double> const& lut (double from, double to, int bit_depth, bool inverse) const;
- virtual bool about_equal (boost::shared_ptr<const TransferFunction> other, double epsilon) const = 0;
+ virtual bool about_equal (std::shared_ptr<const TransferFunction> other, double epsilon) const = 0;
protected:
/** Make a LUT and return an array allocated by new */
- virtual double * make_lut (int bit_depth, bool inverse) const = 0;
+ virtual std::vector<double> make_lut (double from, double to, int bit_depth, bool inverse) const = 0;
private:
- mutable std::map<std::pair<int, bool>, double*> _luts;
+ struct LUTDescriptor {
+ double from;
+ double to;
+ int bit_depth;
+ bool inverse;
+
+ bool operator==(LUTDescriptor const& other) const;
+ };
+
+ struct LUTDescriptorHasher {
+ std::size_t operator()(LUTDescriptor const& desc) const;
+ };
+
+ mutable std::unordered_map<LUTDescriptor, std::vector<double>, LUTDescriptorHasher> _luts;
/** mutex to protect _luts */
mutable boost::mutex _mutex;
};
+
}
+
#endif