6#include "TTauri/Foundation/float16.hpp"
7#include "TTauri/Foundation/mat.hpp"
13inline mat sRGB_to_XYZ = mat{
14 0.41239080f, 0.35758434f, 0.18048079f, 0.0f,
15 0.21263901f, 0.71516868f, 0.07219232f, 0.0f,
16 0.01933082f, 0.11919478f, 0.95053215f, 0.0f,
17 0.0f, 0.0f, 0.0f, 1.0f
20inline mat XYZ_to_sRGB = mat{
21 3.24096994f, -1.53738318f, -0.49861076f, 0.0f,
22 -0.96924364f, 1.87596750f, 0.04155506f, 0.0f,
23 0.05563008f, -0.20397696f, 1.05697151f, 0.0f,
24 0.0f, 0.0f, 0.0f, 1.0f
27[[nodiscard]]
inline float sRGB_linear_to_gamma(
float u)
noexcept
32 return 1.055f *
std::pow(u, 0.416f) - 0.055f;
36[[nodiscard]]
inline float sRGB_gamma_to_linear(
float u)
noexcept
41 return std::pow((u + 0.055f) / 1.055f, 2.4f);
45[[nodiscard]]
inline auto sRGB_linear16_to_gamma8_table_generator() noexcept
49 for (
int i = 0; i != 65536; ++i) {
50 r[i] =
static_cast<uint8_t
>(
51 std::clamp(sRGB_linear_to_gamma(float16{numeric_cast<uint16_t>(i),
true}), 0.0f, 1.0f) * 255.0f
58inline auto sRGB_linear16_to_gamma8_table = sRGB_linear16_to_gamma8_table_generator();
60[[nodiscard]]
inline uint8_t sRGB_linear16_to_gamma8(float16 u)
noexcept
62 return sRGB_linear16_to_gamma8_table[u.get()];
67[[nodiscard]]
inline auto sRGB_gamma8_to_linear16_table_generator() noexcept
71 for (
int i = 0; i != 256; ++i) {
72 r[i] =
static_cast<float16
>(sRGB_gamma_to_linear(i / 255.0f));
78inline auto sRGB_gamma8_to_linear16_table = sRGB_gamma8_to_linear16_table_generator();
80[[nodiscard]]
inline float16 sRGB_gamma8_to_linear16(uint8_t u)
noexcept
82 return sRGB_gamma8_to_linear16_table[u];