HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
sRGB.hpp
1// Copyright 2020 Pokitec
2// All rights reserved.
3
4#pragma once
5
6#include "TTauri/Foundation/float16.hpp"
7#include "TTauri/Foundation/mat.hpp"
8#include <cmath>
9#include <array>
10
11namespace tt {
12
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
18};
19
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
25};
26
27[[nodiscard]] inline float sRGB_linear_to_gamma(float u) noexcept
28{
29 if (u <= 0.0031308) {
30 return 12.92f * u;
31 } else {
32 return 1.055f * std::pow(u, 0.416f) - 0.055f;
33 }
34}
35
36[[nodiscard]] inline float sRGB_gamma_to_linear(float u) noexcept
37{
38 if (u <= 0.04045) {
39 return u / 12.92f;
40 } else {
41 return std::pow((u + 0.055f) / 1.055f, 2.4f);
42 }
43}
44
45[[nodiscard]] inline auto sRGB_linear16_to_gamma8_table_generator() noexcept
46{
48
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
52 );
53 }
54
55 return r;
56}
57
58inline auto sRGB_linear16_to_gamma8_table = sRGB_linear16_to_gamma8_table_generator();
59
60[[nodiscard]] inline uint8_t sRGB_linear16_to_gamma8(float16 u) noexcept
61{
62 return sRGB_linear16_to_gamma8_table[u.get()];
63}
64
65
66
67[[nodiscard]] inline auto sRGB_gamma8_to_linear16_table_generator() noexcept
68{
70
71 for (int i = 0; i != 256; ++i) {
72 r[i] = static_cast<float16>(sRGB_gamma_to_linear(i / 255.0f));
73 }
74
75 return r;
76}
77
78inline auto sRGB_gamma8_to_linear16_table = sRGB_gamma8_to_linear16_table_generator();
79
80[[nodiscard]] inline float16 sRGB_gamma8_to_linear16(uint8_t u) noexcept
81{
82 return sRGB_gamma8_to_linear16_table[u];
83}
84
85
86}
87
T pow(T... args)