/* * Copyright (C) 2023 Christopher J. Howard * * This file is part of Antkeeper source code. * * Antkeeper source code 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 3 of the License, or * (at your option) any later version. * * Antkeeper source code 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 Antkeeper source code. If not, see . */ #ifndef ANTKEEPER_COLOR_SRGB_HPP #define ANTKEEPER_COLOR_SRGB_HPP #include "color/rgb.hpp" #include "color/illuminant.hpp" #include "math/vector.hpp" #include namespace color { /** * sRGB electro-optical transfer function (EOTF), also known as the sRGB decoding function. * * @param v sRGB electrical signal (gamma-encoded sRGB). * * @return Corresponding luminance of the signal (linear sRGB). */ template math::vector3 srgb_eotf(const math::vector3& v) { auto f = [](T x) -> T { return x < T{0.04045} ? x / T{12.92} : std::pow((x + T{0.055}) / T{1.055}, T{2.4}); }; return math::vector3 { f(v[0]), f(v[1]), f(v[2]) }; } /** * sRGB inverse electro-optical transfer function (EOTF), also known as the sRGB encoding function. * * @param l sRGB luminance (linear sRGB). * * @return Corresponding electrical signal (gamma-encoded sRGB). */ template math::vector3 srgb_inverse_eotf(const math::vector3& l) { auto f = [](T x) -> T { return x <= T{0.0031308} ? x * T{12.92} : std::pow(x, T{1} / T{2.4}) * T{1.055} - T{0.055}; }; return math::vector3 { f(l[0]), f(l[1]), f(l[2]) }; } /// sRGB color space. template constexpr rgb::color_space srgb ( {T{0.64}, T{0.33}}, {T{0.30}, T{0.60}}, {T{0.15}, T{0.06}}, color::illuminant::deg2::d65, &srgb_eotf, &srgb_inverse_eotf ); } // namespace color #endif // ANTKEEPER_COLOR_SRGB_HPP