43 explicit Color(SDL_Color
const& sdlColor) noexcept :
49 explicit Color(VkClearColorValue
const& clearColorValue) noexcept :
50 _r(
static_cast<uint8_t
>(clearColorValue.float32[0] * 255.0f)),
51 _g(
static_cast<uint8_t
>(clearColorValue.float32[1] * 255.0f)),
52 _b(
static_cast<uint8_t
>(clearColorValue.float32[2] * 255.0f)),
53 _a(
static_cast<uint8_t
>(clearColorValue.float32[3] * 255.0f))
55 explicit Color(glm::vec4
const& vec4) noexcept :
56 _r(
static_cast<uint8_t
>(vec4.r * 255.0f)),
57 _g(
static_cast<uint8_t
>(vec4.g * 255.0f)),
58 _b(
static_cast<uint8_t
>(vec4.b * 255.0f)),
59 _a(
static_cast<uint8_t
>(vec4.a * 255.0f))
61 Color(uint8_t red, uint8_t green, uint8_t blue, uint8_t alpha = 255) noexcept :
67 explicit Color(uint32_t color) noexcept :
68 _r(
static_cast<uint8_t
>((color & 0xFF000000) >> 24)),
69 _g(
static_cast<uint8_t
>((color & 0x00FF0000) >> 16)),
70 _b(
static_cast<uint8_t
>((color & 0x0000FF00) >> 8)),
71 _a(
static_cast<uint8_t
>(color & 0x000000FF))
74 operator SDL_Color()
const {
return SDL_Color{.r = this->_r, .g = this->_g, .b = this->_b, .a = this->_a}; }
75 operator VkClearColorValue()
const
77 return {{
static_cast<float>(this->_r) / 255.0f,
static_cast<float>(this->_g) / 255.0f,
78 static_cast<float>(this->_b) / 255.0f,
static_cast<float>(this->_a) / 255.0f}};
80 operator glm::vec4()
const
82 return {
static_cast<float>(this->_r) / 255.0f,
static_cast<float>(this->_g) / 255.0f,
83 static_cast<float>(this->_b) / 255.0f,
static_cast<float>(this->_a) / 255.0f};
85 operator glm::uvec4()
const {
return {this->_r, this->_g, this->_b, this->_a}; }
86 operator uint32_t()
const {
return this->toInteger(); }
88 [[nodiscard]] uint32_t toInteger()
const
90 return (
static_cast<uint32_t
>(this->_r) << 24) | (
static_cast<uint32_t
>(this->_g) << 16) |
91 (
static_cast<uint32_t
>(this->_b) << 8) |
static_cast<uint32_t
>(this->_a);
94 bool operator==(
Color const& right)
const
96 return this->_r == right._r && this->_g == right._g && this->_b == right._b && this->_a == right._a;
98 bool operator!=(
Color const& right)
const {
return !this->operator==(right); }
102 uint16_t
const red =
static_cast<uint16_t
>(this->_r) + right._r;
103 uint16_t
const green =
static_cast<uint16_t
>(this->_g) + right._g;
104 uint16_t
const blue =
static_cast<uint16_t
>(this->_b) + right._b;
105 uint16_t
const alpha =
static_cast<uint16_t
>(this->_a) + right._a;
106 return {red > 255 ? uint8_t(255) :
static_cast<uint8_t
>(red),
107 green > 255 ? uint8_t(255) :
static_cast<uint8_t
>(green),
108 blue > 255 ? uint8_t(255) :
static_cast<uint8_t
>(blue),
109 alpha > 255 ? uint8_t(255) :
static_cast<uint8_t
>(alpha)};
113 auto const red =
static_cast<int16_t
>(this->_r - right._r);
114 auto const green =
static_cast<int16_t
>(this->_g - right._g);
115 auto const blue =
static_cast<int16_t
>(this->_b - right._b);
116 auto const alpha =
static_cast<int16_t
>(this->_a - right._a);
117 return {red < 0 ? uint8_t(0) : static_cast<uint8_t>(red), green < 0 ? uint8_t(0) : static_cast<uint8_t>(green),
118 blue < 0 ? uint8_t(0) : static_cast<uint8_t>(blue),
119 alpha < 0 ? uint8_t(0) : static_cast<uint8_t>(alpha)};
123 uint16_t
const red =
static_cast<uint16_t
>(this->_r) * right._r;
124 uint16_t
const green =
static_cast<uint16_t
>(this->_g) * right._g;
125 uint16_t
const blue =
static_cast<uint16_t
>(this->_b) * right._b;
126 uint16_t
const alpha =
static_cast<uint16_t
>(this->_a) * right._a;
127 return {
static_cast<uint8_t
>(red / 255),
static_cast<uint8_t
>(green / 255),
static_cast<uint8_t
>(blue / 255),
128 static_cast<uint8_t
>(alpha / 255)};
131 Color& operator+=(
Color const& right) {
return this->operator=(this->
operator+(right)); }
132 Color& operator-=(
Color const& right) {
return this->operator=(this->
operator-(right)); }
133 Color& operator*=(
Color const& right) {
return this->operator=(this->
operator*(right)); }