diff options
| author | Carl Hetherington <cth@carlh.net> | 2022-05-08 23:47:12 +0200 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2022-05-09 00:21:21 +0200 |
| commit | 6de2bb3751b449abf06d44e4dda5e41b66df3f62 (patch) | |
| tree | e163f6b83d3bbf2981e4e727ac067d9eeea47282 /src/piecewise_lut.h | |
| parent | ee48fc460c9dc03b89bd7c7ab17fd3ad4560657d (diff) | |
Extract, test and slightly adjust the piecewise LUT for inverse gamma.
Diffstat (limited to 'src/piecewise_lut.h')
| -rw-r--r-- | src/piecewise_lut.h | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/src/piecewise_lut.h b/src/piecewise_lut.h new file mode 100644 index 00000000..ba8f5c13 --- /dev/null +++ b/src/piecewise_lut.h @@ -0,0 +1,76 @@ +/* + Copyright (C) 2013-2021 Carl Hetherington <cth@carlh.net> + + This file is part of libdcp. + + libdcp is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + libdcp is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with libdcp. If not, see <http://www.gnu.org/licenses/>. + + In addition, as a special exception, the copyright holders give + permission to link the code of portions of this program with the + OpenSSL library under certain conditions as described in each + individual source file, and distribute linked combinations + including the two. + + You must obey the GNU General Public License in all respects + for all of the code used other than OpenSSL. If you modify + file(s) with this exception, you may extend this exception to your + version of the file(s), but you are not obligated to do so. If you + do not wish to do so, delete this exception statement from your + version. If you delete this exception statement from all source + files in the program, then also delete it here. +*/ + + +#ifndef LIBDCP_PIECEWISE_LUT_H +#define LIBDCP_PIECEWISE_LUT_H + + +#include "transfer_function.h" +#include <memory> +#include <vector> + + +namespace dcp { + + +class PiecewiseLUT2 +{ +public: + PiecewiseLUT2(std::shared_ptr<const TransferFunction> fn, double boundary, int low_bits, int high_bits, bool inverse) + : _boundary(boundary) + , _low(fn->lut(0, boundary, low_bits, inverse)) + , _high(fn->lut(boundary, 1, high_bits, inverse)) + , _low_scale(static_cast<int>(std::pow(2.0f, low_bits)) - 1) + , _high_scale(static_cast<int>(std::pow(2.0f, high_bits)) - 1) + { + + } + + inline double lookup(double x) const { + return x < _boundary ? _low[lrint((x / _boundary) * _low_scale)] : _high[lrint(((x - _boundary) / (1 - _boundary)) * _high_scale)]; + } + +private: + double _boundary; + std::vector<double> _low; + std::vector<double> _high; + int _low_scale; + int _high_scale; +}; + + +} + +#endif + |
