@@ -103,6 +103,31 @@ public: | |||||
return vec4(RGBToHSV(src.rgb), src.a); | return vec4(RGBToHSV(src.rgb), src.a); | ||||
} | } | ||||
/* | |||||
* Convert RGB to HSL | |||||
*/ | |||||
static vec3 RGBToHSL(vec3 src) | |||||
{ | |||||
float K = 0.f; | |||||
if (src.g < src.b) | |||||
src = src.rbg, K = -1.f; | |||||
if (src.r < src.g) | |||||
src = src.grb, K = -2.f / 6.f - K; | |||||
float chroma = src.r - min(src.g, src.b); | |||||
float luma = src.r + min(src.g, src.b); | |||||
return vec3(abs(K + (src.g - src.b) / (6.f * chroma + 1e-20f)), | |||||
chroma / (min(luma, 2.f - luma) + 1e-20f), | |||||
0.5f * luma); | |||||
} | |||||
static vec4 RGBToHSL(vec4 src) | |||||
{ | |||||
return vec4(RGBToHSL(src.rgb), src.a); | |||||
} | |||||
/* | /* | ||||
* Convert linear HSV to linear HSL | * Convert linear HSV to linear HSL | ||||
*/ | */ | ||||
@@ -101,6 +101,22 @@ LOLUNIT_FIXTURE(ColorTest) | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(v1.b, v2.b, 0.0001); | LOLUNIT_ASSERT_DOUBLES_EQUAL(v1.b, v2.b, 0.0001); | ||||
} | } | ||||
} | } | ||||
LOLUNIT_TEST(RGBToHSL) | |||||
{ | |||||
for (int r = 0; r < 20; r++) | |||||
for (int g = 0; g < 20; g++) | |||||
for (int b = 0; b < 20; b++) | |||||
{ | |||||
vec3 v1 = vec3(r / 20.f, g / 20.f, b / 20.f); | |||||
vec3 v2 = Color::RGBToHSL(v1); | |||||
vec3 v3 = Color::HSVToHSL(Color::RGBToHSV(v1)); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(v2.x, v3.x, 0.0001); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(v2.y, v3.y, 0.0001); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(v2.z, v3.z, 0.0001); | |||||
} | |||||
} | |||||
}; | }; | ||||
} /* namespace lol */ | } /* namespace lol */ | ||||