/* ColorConverter you can use it to convert color from RGB space to HSL space and back. HSL2RGB copied from GLPaint Apple sample: http://developer.apple.com/library/ios/#samplecode/GLPaint/Introduction/Intro.html RGB2HSL translated from http://www.geekymonkey.com/Programming/CSharp/RGB2HSL_HSL2RGB.htm From: https://github.com/alessani/ColorConverter */ void HSL2RGB(float h, float s, float l, float *outR, float *outG, float *outB) { float temp1, temp2; float temp[3]; int i; // Check for saturation. If there isn't any just return the luminance value for each, which results in gray. if (s == 0.0) { if (outR) *outR = l; if (outG) *outG = l; if (outB) *outB = l; return; } // Test for luminance and compute temporary values based on luminance and saturation if (l < 0.5) temp2 = l * (1.0 + s); else temp2 = l + s - l * s; temp1 = 2.0 * l - temp2; // Compute intermediate values based on hue temp[0] = h + 1.0 / 3.0; temp[1] = h; temp[2] = h - 1.0 / 3.0; for (i = 0; i < 3; ++i) { // Adjust the range if (temp[i] < 0.0) temp[i] += 1.0; if (temp[i] > 1.0) temp[i] -= 1.0; if (6.0 * temp[i] < 1.0) temp[i] = temp1 + (temp2 - temp1) * 6.0 * temp[i]; else { if (2.0 * temp[i] < 1.0) temp[i] = temp2; else { if (3.0 * temp[i] < 2.0) temp[i] = temp1 + (temp2 - temp1) * ((2.0 / 3.0) - temp[i]) * 6.0; else temp[i] = temp1; } } } // Assign temporary values to R, G, B if (outR) *outR = temp[0]; if (outG) *outG = temp[1]; if (outB) *outB = temp[2]; } void RGB2HSL(float r, float g, float b, float *outH, float *outS, float *outL) { /*r = r/255.0f; g = g/255.0f; b = b/255.0f;*/ float h, s, l, v, m, vm, r2, g2, b2; h = 0; s = 0; v = MAX(r, g); v = MAX(v, b); m = MIN(r, g); m = MIN(m, b); l = (m + v) / 2.0f; if (l <= 0.0) { if (outH) *outH = h; if (outS) *outS = s; if (outL) *outL = l; return; } vm = v - m; s = vm; if (s > 0.0f) { s /= (l <= 0.5f) ? (v + m) : (2.0 - v - m); } else { if (outH) *outH = h; if (outS) *outS = s; if (outL) *outL = l; return; } r2 = (v - r) / vm; g2 = (v - g) / vm; b2 = (v - b) / vm; if (r == v) { h = (g == m ? 5.0f + b2 : 1.0f - g2); } else if (g == v) { h = (b == m ? 1.0f + r2 : 3.0 - b2); } else { h = (r == m ? 3.0f + g2 : 5.0f - r2); } h /= 6.0f; if (outH) *outH = h; if (outS) *outS = s; if (outL) *outL = l; }