23 auto linearToSrgbComponent = [](
float c) {
24 if (c <= 0.0031308f) {
27 return 1.055f * std::pow(c, 1.0f / 2.4f) - 0.055f;
32 static_cast<uint8_t
>(
Clamp(
static_cast<int>(linearToSrgbComponent(
static_cast<float>(r) / 255.0f) * 255.0f), 0, 255)),
33 static_cast<uint8_t
>(
Clamp(
static_cast<int>(linearToSrgbComponent(
static_cast<float>(g) / 255.0f) * 255.0f), 0, 255)),
34 static_cast<uint8_t
>(
Clamp(
static_cast<int>(linearToSrgbComponent(
static_cast<float>(b) / 255.0f) * 255.0f), 0, 255)),
40 auto srgbToLinearComponent = [](
float c) {
44 return std::pow((c + 0.055f) / 1.055f, 2.4f);
49 static_cast<uint8_t
>(
Clamp(
static_cast<int>(srgbToLinearComponent(
static_cast<float>(r) / 255.0f) * 255.0f), 0, 255)),
50 static_cast<uint8_t
>(
Clamp(
static_cast<int>(srgbToLinearComponent(
static_cast<float>(g) / 255.0f) * 255.0f), 0, 255)),
51 static_cast<uint8_t
>(
Clamp(
static_cast<int>(srgbToLinearComponent(
static_cast<float>(b) / 255.0f) * 255.0f), 0, 255)),
58 uint8_t value =
static_cast<uint8_t
>(
Clamp(
static_cast<int>(v * 255.0f), 0, 255));
59 return {value, value, value, a};
63 int i =
static_cast<int>(std::floor(h));
65 float p = v * (1.0f - s);
66 float q = v * (1.0f - s * f);
67 float t = v * (1.0f - s * (1.0f - f));
69 uint8_t value_v =
static_cast<uint8_t
>(
Clamp(
static_cast<int>(v * 255.0f), 0, 255));
70 uint8_t value_p =
static_cast<uint8_t
>(
Clamp(
static_cast<int>(p * 255.0f), 0, 255));
71 uint8_t value_q =
static_cast<uint8_t
>(
Clamp(
static_cast<int>(q * 255.0f), 0, 255));
72 uint8_t value_t =
static_cast<uint8_t
>(
Clamp(
static_cast<int>(t * 255.0f), 0, 255));
75 case 0:
return {value_v, value_t, value_p, a};
76 case 1:
return {value_q, value_v, value_p, a};
77 case 2:
return {value_p, value_v, value_t, a};
78 case 3:
return {value_p, value_q, value_v, a};
79 case 4:
return {value_t, value_p, value_v, a};
80 default:
return {value_v, value_p, value_q, a};
static Color fromHSV(float h, float s, float v, uint8_t a=255) noexcept
Builds a color from hue/saturation/value in [0,1].