diff --git a/src/base/color.h b/src/base/color.h index 38603c7db..e767a0637 100644 --- a/src/base/color.h +++ b/src/base/color.h @@ -228,14 +228,14 @@ template<> inline ColorHSLA color_cast(const ColorHSVA &hsv) { float l = hsv.v * (1 - hsv.s * 0.5f); - return ColorHSLA(hsv.h, (l == 0.0f || l == 1.0f) ? 0 : (hsv.v - l) / minimum(l, 1 - l), l); + return ColorHSLA(hsv.h, (l == 0.0f || l == 1.0f) ? 0 : (hsv.v - l) / minimum(l, 1 - l), l, hsv.a); } template<> inline ColorHSVA color_cast(const ColorHSLA &hsl) { float v = hsl.l + hsl.s * minimum(hsl.l, 1 - hsl.l); - return ColorHSVA(hsl.h, v == 0.0f ? 0 : 2 - (2 * hsl.l / v), v); + return ColorHSVA(hsl.h, v == 0.0f ? 0 : 2 - (2 * hsl.l / v), v, hsl.a); } template<> diff --git a/src/test/color.cpp b/src/test/color.cpp index d042231f2..144906523 100644 --- a/src/test/color.cpp +++ b/src/test/color.cpp @@ -23,3 +23,19 @@ TEST(Color, HRHConv) } } } + +// Any color_cast should keep the same alpha value +TEST(Color, ConvKeepsAlpha) +{ + const int Max = 10; + for(int i = 0; i <= Max; i++) + { + const float Alpha = i / (float)Max; + EXPECT_FLOAT_EQ(color_cast(ColorHSLA(0.1f, 0.2f, 0.3f, Alpha)).a, Alpha); + EXPECT_FLOAT_EQ(color_cast(ColorHSVA(0.1f, 0.2f, 0.3f, Alpha)).a, Alpha); + EXPECT_FLOAT_EQ(color_cast(ColorRGBA(0.1f, 0.2f, 0.3f, Alpha)).a, Alpha); + EXPECT_FLOAT_EQ(color_cast(ColorHSVA(0.1f, 0.2f, 0.3f, Alpha)).a, Alpha); + EXPECT_FLOAT_EQ(color_cast(ColorRGBA(0.1f, 0.2f, 0.3f, Alpha)).a, Alpha); + EXPECT_FLOAT_EQ(color_cast(ColorHSLA(0.1f, 0.2f, 0.3f, Alpha)).a, Alpha); + } +}