Skip to content

Commit c3ed272

Browse files
committed
add Color::to_rgba32 and Color::to_hex
1 parent 5aa1a1d commit c3ed272

File tree

2 files changed

+104
-65
lines changed

2 files changed

+104
-65
lines changed

include/gf2/core/Color.h

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55

66
#include <cstdint>
77

8+
#include <array>
9+
810
#include "CoreApi.h"
911
#include "Math.h"
1012
#include "TypeTraits.h"
@@ -24,18 +26,29 @@ namespace gf {
2426

2527
constexpr Color(uint32_t rgb, uint8_t a = 255)
2628
// clang-format off
27-
: r(static_cast<float>((rgb >> 16) & 0xFF) / 255.0f)
28-
, g(static_cast<float>((rgb >> 8) & 0xFF) / 255.0f)
29-
, b(static_cast<float>((rgb >> 0) & 0xFF) / 255.0f)
29+
: r(float((rgb >> 16) & 0xFF) / 255.0f)
30+
, g(float((rgb >> 8) & 0xFF) / 255.0f)
31+
, b(float((rgb >> 0) & 0xFF) / 255.0f)
3032
// clang-format on
31-
, a(static_cast<float>(a) / 255.0f)
33+
, a(float(a) / 255.0f)
3234
{
3335
}
3436

3537
float r;
3638
float g;
3739
float b;
3840
float a;
41+
42+
constexpr std::array<uint8_t, 4> to_rgba32() const
43+
{
44+
return { uint8_t(r * 255), uint8_t(g * 255), uint8_t(b * 255), uint8_t(a * 255) };
45+
}
46+
47+
constexpr uint32_t to_hex() const
48+
{
49+
const auto rgba = to_rgba32();
50+
return (rgba[0] << 24) + (rgba[1] << 16) + (rgba[2] << 8) + (rgba[3] << 0);
51+
}
3952
};
4053

4154
constexpr bool operator==(Color lhs, Color rhs)

tests/tests_core_Color.cc

Lines changed: 87 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@ TEST(ColorTest, DefaultConstructor) {
1212
EXPECT_FLOAT_EQ(color0.b, 0.0f);
1313
EXPECT_FLOAT_EQ(color0.a, 0.0f);
1414

15-
constexpr gf::Color ccolor0;
16-
static_assert(ccolor0.r == 0.0f, "Check Color");
17-
static_assert(ccolor0.g == 0.0f, "Check Color");
18-
static_assert(ccolor0.b == 0.0f, "Check Color");
19-
static_assert(ccolor0.a == 0.0f, "Check Color");
15+
constexpr gf::Color Color0;
16+
static_assert(Color0.r == 0.0f);
17+
static_assert(Color0.g == 0.0f);
18+
static_assert(Color0.b == 0.0f);
19+
static_assert(Color0.a == 0.0f);
2020
}
2121

2222
TEST(ColorTest, Constructor) {
@@ -34,17 +34,17 @@ TEST(ColorTest, Constructor) {
3434
EXPECT_FLOAT_EQ(color1.b, 1.0f);
3535
EXPECT_FLOAT_EQ(color1.a, 0.5f);
3636

37-
constexpr gf::Color ccolor0(0.0f, 0.5f, 1.0f);
38-
static_assert(ccolor0.r == 0.0f, "Check Color");
39-
static_assert(ccolor0.g == 0.5f, "Check Color");
40-
static_assert(ccolor0.b == 1.0f, "Check Color");
41-
static_assert(ccolor0.a == 1.0f, "Check Color");
42-
43-
constexpr gf::Color ccolor1(0.0f, 0.5f, 1.0f, 0.5f);
44-
static_assert(ccolor1.r == 0.0f, "Check Color");
45-
static_assert(ccolor1.g == 0.5f, "Check Color");
46-
static_assert(ccolor1.b == 1.0f, "Check Color");
47-
static_assert(ccolor1.a == 0.5f, "Check Color");
37+
constexpr gf::Color Color0(0.0f, 0.5f, 1.0f);
38+
static_assert(Color0.r == 0.0f);
39+
static_assert(Color0.g == 0.5f);
40+
static_assert(Color0.b == 1.0f);
41+
static_assert(Color0.a == 1.0f);
42+
43+
constexpr gf::Color Color1(0.0f, 0.5f, 1.0f, 0.5f);
44+
static_assert(Color1.r == 0.0f);
45+
static_assert(Color1.g == 0.5f);
46+
static_assert(Color1.b == 1.0f);
47+
static_assert(Color1.a == 0.5f);
4848
}
4949

5050
TEST(ColorTest, Rgba) {
@@ -62,32 +62,32 @@ TEST(ColorTest, Rgba) {
6262
EXPECT_FLOAT_EQ(color1.b, 0.0f);
6363
EXPECT_FLOAT_EQ(color1.a, 0.0f);
6464

65-
constexpr gf::Color ccolor0(0x00FF00);
66-
static_assert(ccolor0.r == 0.0f, "Check Color");
67-
static_assert(ccolor0.g == 1.0f, "Check Color");
68-
static_assert(ccolor0.b == 0.0f, "Check Color");
69-
static_assert(ccolor0.a == 1.0f, "Check Color");
70-
71-
constexpr gf::Color ccolor1(0x00FF00, 0x00);
72-
static_assert(ccolor1.r == 0.0f, "Check Color");
73-
static_assert(ccolor1.g == 1.0f, "Check Color");
74-
static_assert(ccolor1.b == 0.0f, "Check Color");
75-
static_assert(ccolor1.a == 0.0f, "Check Color");
65+
constexpr gf::Color Color0(0x00FF00);
66+
static_assert(Color0.r == 0.0f);
67+
static_assert(Color0.g == 1.0f);
68+
static_assert(Color0.b == 0.0f);
69+
static_assert(Color0.a == 1.0f);
70+
71+
constexpr gf::Color Color1(0x00FF00, 0x00);
72+
static_assert(Color1.r == 0.0f);
73+
static_assert(Color1.g == 1.0f);
74+
static_assert(Color1.b == 0.0f);
75+
static_assert(Color1.a == 0.0f);
7676
}
7777

7878
TEST(ColorTest, Equality) {
79-
gf::Color color0(0x12345678);
80-
gf::Color color1(0x12345678);
81-
gf::Color color2(0x87654321);
79+
gf::Color color0(0x123456, 0x78);
80+
gf::Color color1(0x123456, 0x78);
81+
gf::Color color2(0x876543, 0x21);
8282

8383
EXPECT_EQ(color0, color1);
8484
EXPECT_NE(color0, color2);
8585

86-
constexpr gf::Color ccolor0(0x12345678);
87-
constexpr gf::Color ccolor1(0x12345678);
88-
constexpr gf::Color ccolor2(0x87654321);
89-
static_assert(ccolor0 == ccolor1, "Check Color");
90-
static_assert(ccolor0 != ccolor2, "Check Color");
86+
constexpr gf::Color Color0(0x123456, 0x78);
87+
constexpr gf::Color Color1(0x123456, 0x78);
88+
constexpr gf::Color Color2(0x876543, 0x21);
89+
static_assert(Color0 == Color1);
90+
static_assert(Color0 != Color2);
9191
}
9292

9393
TEST(ColorTest, Addition) {
@@ -104,11 +104,11 @@ TEST(ColorTest, Addition) {
104104
color1 += 0.5f;
105105
EXPECT_EQ(color1, gf::Color(1.5f, 1.0f, 0.5f, 0.5f));
106106

107-
constexpr gf::Color ccolor0(0.0f, 0.5f, 1.0f, 1.0f);
108-
constexpr gf::Color ccolor1(1.0f, 0.5f, 0.0f, 0.0f);
109-
static_assert(ccolor0 + ccolor1 == gf::Color(1.0f, 1.0f, 1.0f, 1.0f), "Check Color");
110-
static_assert(ccolor0 + 0.5f == gf::Color(0.5f, 1.0f, 1.5f, 1.5f), "Check Color");
111-
static_assert(0.5f + ccolor1 == gf::Color(1.5f, 1.0f, 0.5f, 0.5f), "Check Color");
107+
constexpr gf::Color Color0(0.0f, 0.5f, 1.0f, 1.0f);
108+
constexpr gf::Color Color1(1.0f, 0.5f, 0.0f, 0.0f);
109+
static_assert(Color0 + Color1 == gf::Color(1.0f, 1.0f, 1.0f, 1.0f));
110+
static_assert(Color0 + 0.5f == gf::Color(0.5f, 1.0f, 1.5f, 1.5f));
111+
static_assert(0.5f + Color1 == gf::Color(1.5f, 1.0f, 0.5f, 0.5f));
112112
}
113113

114114
TEST(ColorTest, Substraction) {
@@ -125,18 +125,18 @@ TEST(ColorTest, Substraction) {
125125
color1 -= 0.5f;
126126
EXPECT_EQ(color1, gf::Color(0.0f, 0.0f, -0.5f, -0.5f));
127127

128-
constexpr gf::Color ccolor0(1.0f, 0.5f, 1.0f, 1.0f);
129-
constexpr gf::Color ccolor1(0.5f, 0.5f, 0.0f, 0.0f);
130-
static_assert(ccolor0 - ccolor1 == gf::Color(0.5f, 0.0f, 1.0f, 1.0f), "Check Color");
131-
static_assert(ccolor0 - 0.5f == gf::Color(0.5f, 0.0f, 0.5f, 0.5f), "Check Color");
132-
static_assert(0.5f - ccolor1 == gf::Color(0.0f, 0.0f, 0.5f, 0.5f), "Check Color");
128+
constexpr gf::Color Color0(1.0f, 0.5f, 1.0f, 1.0f);
129+
constexpr gf::Color Color1(0.5f, 0.5f, 0.0f, 0.0f);
130+
static_assert(Color0 - Color1 == gf::Color(0.5f, 0.0f, 1.0f, 1.0f));
131+
static_assert(Color0 - 0.5f == gf::Color(0.5f, 0.0f, 0.5f, 0.5f));
132+
static_assert(0.5f - Color1 == gf::Color(0.0f, 0.0f, 0.5f, 0.5f));
133133
}
134134

135135
TEST(ColorTest, Multiplication) {
136136
gf::Color color0(1.0f, 1.0f, 0.5f, 0.5f);
137137
gf::Color color1(1.0f, 0.5f, 0.5f, 1.0f);
138138

139-
EXPECT_EQ(color0* color1, gf::Color(1.0f, 0.5f, 0.25f, 0.5f));
139+
EXPECT_EQ(color0 * color1, gf::Color(1.0f, 0.5f, 0.25f, 0.5f));
140140
EXPECT_EQ(color0 * 0.5f, gf::Color(0.5f, 0.5f, 0.25f, 0.25f));
141141
EXPECT_EQ(0.5f * color1, gf::Color(0.5f, 0.25f, 0.25f, 0.5f));
142142

@@ -146,11 +146,11 @@ TEST(ColorTest, Multiplication) {
146146
color1 *= 0.5f;
147147
EXPECT_EQ(color1, gf::Color(0.5f, 0.25f, 0.25f, 0.5f));
148148

149-
constexpr gf::Color ccolor0(1.0f, 1.0f, 0.5f, 0.5f);
150-
constexpr gf::Color ccolor1(1.0f, 0.5f, 0.5f, 1.0f);
151-
static_assert(ccolor0 * ccolor1 == gf::Color(1.0f, 0.5f, 0.25f, 0.5f), "Check Color");
152-
static_assert(ccolor0 * 0.5f == gf::Color(0.5f, 0.5f, 0.25f, 0.25f), "Check Color");
153-
static_assert(0.5f * ccolor1 == gf::Color(0.5f, 0.25f, 0.25f, 0.5f), "Check Color");
149+
constexpr gf::Color Color0(1.0f, 1.0f, 0.5f, 0.5f);
150+
constexpr gf::Color Color1(1.0f, 0.5f, 0.5f, 1.0f);
151+
static_assert(Color0 * Color1 == gf::Color(1.0f, 0.5f, 0.25f, 0.5f));
152+
static_assert(Color0 * 0.5f == gf::Color(0.5f, 0.5f, 0.25f, 0.25f));
153+
static_assert(0.5f * Color1 == gf::Color(0.5f, 0.25f, 0.25f, 0.5f));
154154
}
155155

156156
TEST(ColorTest, Division) {
@@ -167,11 +167,11 @@ TEST(ColorTest, Division) {
167167
color1 /= 0.5f;
168168
EXPECT_EQ(color1, gf::Color(2.0f, 2.0f, 1.0f, 1.0f));
169169

170-
constexpr gf::Color ccolor0(1.0f, 0.5f, 0.5f, 1.0f);
171-
constexpr gf::Color ccolor1(1.0f, 1.0f, 0.5f, 0.5f);
172-
static_assert(ccolor0 / ccolor1 == gf::Color(1.0f, 0.5f, 1.0f, 2.0f), "Check Color");
173-
static_assert(ccolor0 / 0.5f == gf::Color(2.0f, 1.0f, 1.0f, 2.0f), "Check Color");
174-
static_assert(0.5f / ccolor1 == gf::Color(0.5f, 0.5f, 1.0f, 1.0f), "Check Color");
170+
constexpr gf::Color Color0(1.0f, 0.5f, 0.5f, 1.0f);
171+
constexpr gf::Color Color1(1.0f, 1.0f, 0.5f, 0.5f);
172+
static_assert(Color0 / Color1 == gf::Color(1.0f, 0.5f, 1.0f, 2.0f));
173+
static_assert(Color0 / 0.5f == gf::Color(2.0f, 1.0f, 1.0f, 2.0f));
174+
static_assert(0.5f / Color1 == gf::Color(0.5f, 0.5f, 1.0f, 1.0f));
175175
}
176176

177177
TEST(ColorTest, Opaque) {
@@ -186,9 +186,35 @@ TEST(ColorTest, Opaque) {
186186
gf::Color color = gf::opaque();
187187
EXPECT_EQ(color.a, 0.5f);
188188

189-
constexpr gf::Color ccolor = gf::opaque(0.3f);
190-
static_assert(ccolor.r == 1.0f, "Check Color");
191-
static_assert(ccolor.g == 1.0f, "Check Color");
192-
static_assert(ccolor.b == 1.0f, "Check Color");
193-
static_assert(ccolor.a == 0.3f, "Check Color");
189+
constexpr gf::Color Color = gf::opaque(0.3f);
190+
static_assert(Color.r == 1.0f);
191+
static_assert(Color.g == 1.0f);
192+
static_assert(Color.b == 1.0f);
193+
static_assert(Color.a == 0.3f);
194+
}
195+
196+
TEST(ColorTest, ToRgba32) {
197+
gf::Color color0(0x123456, 0x78);
198+
auto rgba = color0.to_rgba32();
199+
EXPECT_EQ(rgba[0], 0x12);
200+
EXPECT_EQ(rgba[1], 0x34);
201+
EXPECT_EQ(rgba[2], 0x56);
202+
EXPECT_EQ(rgba[3], 0x78);
203+
204+
constexpr gf::Color Color0(0x123456, 0x78);
205+
constexpr auto Rgba = Color0.to_rgba32();
206+
static_assert(Rgba[0] == 0x12);
207+
static_assert(Rgba[1] == 0x34);
208+
static_assert(Rgba[2] == 0x56);
209+
static_assert(Rgba[3] == 0x78);
210+
}
211+
212+
TEST(ColorTest, ToHex) {
213+
gf::Color color0(0x123456, 0x78);
214+
auto hex = color0.to_hex();
215+
EXPECT_EQ(hex, 0x12345678);
216+
217+
constexpr gf::Color Color0(0x123456, 0x78);
218+
constexpr auto Hex = Color0.to_hex();
219+
static_assert(Hex == 0x12345678);
194220
}

0 commit comments

Comments
 (0)