| @@ -88,10 +88,10 @@ public: | |||||
| { | { | ||||
| float K = 0.f; | float K = 0.f; | ||||
| if (src.g < src.b) | |||||
| if (src.b - src.g > 1e-20f) | |||||
| src = src.rbg, K = -1.f; | src = src.rbg, K = -1.f; | ||||
| if (src.r < src.g) | |||||
| if (src.g - src.r > 1e-20f) | |||||
| src = src.grb, K = -2.f / 6.f - K; | src = src.grb, K = -2.f / 6.f - K; | ||||
| float chroma = src.r - min(src.g, src.b); | float chroma = src.r - min(src.g, src.b); | ||||
| @@ -112,10 +112,13 @@ public: | |||||
| { | { | ||||
| float K = 0.f; | float K = 0.f; | ||||
| if (src.g < src.b) | |||||
| /* FIXME: this appears to be needed for numerical stability on | |||||
| * i386 hardware using -ffast-math. Otherwise if (src.g < src.b) | |||||
| * would suffice. */ | |||||
| if (src.b - src.g > 1e-20f) | |||||
| src = src.rbg, K = -1.f; | src = src.rbg, K = -1.f; | ||||
| if (src.r < src.g) | |||||
| if (src.g - src.r > 1e-20f) | |||||
| src = src.grb, K = -2.f / 6.f - K; | src = src.grb, K = -2.f / 6.f - K; | ||||
| float chroma = src.r - min(src.g, src.b); | float chroma = src.r - min(src.g, src.b); | ||||
| @@ -136,7 +139,9 @@ public: | |||||
| static vec3 HSVToHSL(vec3 src) | static vec3 HSVToHSL(vec3 src) | ||||
| { | { | ||||
| float tmp = (2 - src.y) * src.z; | float tmp = (2 - src.y) * src.z; | ||||
| return vec3(src.x, src.y * src.z / (1.f - abs(1.f - tmp)), 0.5f * tmp); | |||||
| return vec3(src.x, | |||||
| src.y * src.z / (min(tmp, 2.f - tmp) + 1e-20f), | |||||
| 0.5f * tmp); | |||||
| } | } | ||||
| static vec4 HSVToHSL(vec4 src) | static vec4 HSVToHSL(vec4 src) | ||||
| @@ -150,7 +155,7 @@ public: | |||||
| static vec3 HSLToHSV(vec3 src) | static vec3 HSLToHSV(vec3 src) | ||||
| { | { | ||||
| float tmp = src.y * (0.5f - abs(0.5f - src.z)); | float tmp = src.y * (0.5f - abs(0.5f - src.z)); | ||||
| return vec3(src.x, 2.f * tmp / (src.z + tmp), src.z + tmp); | |||||
| return vec3(src.x, 2.f * tmp / (src.z + tmp + 1e-20f), src.z + tmp); | |||||
| } | } | ||||
| static vec4 HSLToHSV(vec4 src) | static vec4 HSLToHSV(vec4 src) | ||||