7#include "../float16.hpp"
9#include "../codec/base_n.hpp"
17hi_warning_ignore_msvc(26426);
19namespace hi::inline
v1 {
22 matrix3{0.41239080f, 0.35758434f, 0.18048079f, 0.21263901f, 0.71516868f, 0.07219232f, 0.01933082f, 0.11919478f, 0.95053215f};
35[[nodiscard]]
inline float sRGB_linear_to_gamma(
float u)
noexcept
40 return 1.055f *
std::pow(u, 0.416f) - 0.055f;
44[[nodiscard]]
inline float sRGB_gamma_to_linear(
float u)
noexcept
49 return std::pow((u + 0.055f) / 1.055f, 2.4f);
53[[nodiscard]]
inline auto sRGB_linear16_to_gamma8_table_generator() noexcept
57 for (
int i = 0; i != 65536; ++i) {
58 r[i] = truncate<uint8_t>(
59 std::clamp(sRGB_linear_to_gamma(float16::from_uint16_t(narrow_cast<uint16_t>(i))), 0.0f, 1.0f) * 255.0f);
65inline auto sRGB_linear16_to_gamma8_table = sRGB_linear16_to_gamma8_table_generator();
67[[nodiscard]]
inline uint8_t sRGB_linear16_to_gamma8(float16 u)
noexcept
69 return sRGB_linear16_to_gamma8_table[u.get()];
72[[nodiscard]]
inline auto sRGB_gamma8_to_linear16_table_generator() noexcept
76 for (
int i = 0; i != 256; ++i) {
77 r[i] =
static_cast<float16
>(sRGB_gamma_to_linear(i / 255.0f));
83inline auto sRGB_gamma8_to_linear16_table = sRGB_gamma8_to_linear16_table_generator();
85[[nodiscard]]
inline float16 sRGB_gamma8_to_linear16(uint8_t u)
noexcept
87 return sRGB_gamma8_to_linear16_table[u];
90[[nodiscard]]
inline color color_from_sRGB(
float r,
float g,
float b,
float a)
noexcept
93 sRGB_gamma_to_linear(narrow_cast<float>(r)),
94 sRGB_gamma_to_linear(narrow_cast<float>(g)),
95 sRGB_gamma_to_linear(narrow_cast<float>(b)),
99[[nodiscard]]
inline color color_from_sRGB(uint8_t r, uint8_t g, uint8_t b, uint8_t a)
noexcept
101 return color_from_sRGB(r / 255.0f, g / 255.0f, b / 255.0f, a / 255.0f);
104[[nodiscard]]
inline color color_from_sRGB(std::string_view str)
108 if (tmp.starts_with(
"#")) {
111 if (ssize(tmp) != 6 && ssize(tmp) != 8) {
112 throw parse_error(std::format(
"Expecting 6 or 8 hex-digit sRGB color string, got {}.", str));
114 if (ssize(tmp) == 6) {
118 uint8_t
const r = (base16::int_from_char<uint8_t>(tmp[0]) << 4) | base16::int_from_char<uint8_t>(tmp[1]);
119 uint8_t
const g = (base16::int_from_char<uint8_t>(tmp[2]) << 4) | base16::int_from_char<uint8_t>(tmp[3]);
120 uint8_t
const b = (base16::int_from_char<uint8_t>(tmp[4]) << 4) | base16::int_from_char<uint8_t>(tmp[5]);
121 uint8_t
const a = (base16::int_from_char<uint8_t>(tmp[6]) << 4) | base16::int_from_char<uint8_t>(tmp[7]);
122 return color_from_sRGB(r, g, b, a);
Defines geo::matrix, matrix2 and matrix3.
DOXYGEN BUG.
Definition algorithm.hpp:15
geo::matrix< 3 > matrix3
A 3D homogenious transformation matrix.
Definition matrix.hpp:619