| @@ -96,6 +96,35 @@ public: | |||||
| { | { | ||||
| return vec4(CIEXYZToLinearRGB(c.rgb), c.a); | return vec4(CIEXYZToLinearRGB(c.rgb), c.a); | ||||
| } | } | ||||
| /* | |||||
| * Convert CIE XYZ to CIE L*a*b* | |||||
| */ | |||||
| static vec3 CIEXYZToCIELab(vec3 col) | |||||
| { | |||||
| using std::pow; | |||||
| float const a = 8.85645167903563081e-3; /* (6/29)^3 */ | |||||
| float const b = 7.78703703703703703; /* 1/3 (29/6)^2 */ | |||||
| float const c = 1.37931034482758620e-1; /* 4/29 */ | |||||
| vec3 f = b * col + vec3(c); | |||||
| if (col.x > a) | |||||
| f.x = pow(col.x, 1.0 / 3.0); | |||||
| if (col.y > a) | |||||
| f.y = pow(col.y, 1.0 / 3.0); | |||||
| if (col.z > a) | |||||
| f.z = pow(col.z, 1.0 / 3.0); | |||||
| return vec3(116.0 * f.y - 16.0, | |||||
| 500.0 * (f.x - f.y), | |||||
| 200.0 * (f.y - f.z)); | |||||
| } | |||||
| static vec4 CIEXYZToCIELab(vec4 c) | |||||
| { | |||||
| return vec4(CIEXYZToLinearRGB(c.rgb), c.a); | |||||
| } | |||||
| }; | }; | ||||
| } /* namespace lol */ | } /* namespace lol */ | ||||