class cColor implements java.io.Serializable { float r, g, b, a; cColor() { } cColor(float ir, float ig, float ib) { Set(ir, ig, ib); } void Set(float ir, float ig, float ib) { r = ir; g = ig; b = ib; a = 1; } void Set(double ir, double ig, double ib) { r = (float) ir; g = (float) ig; b = (float) ib; a = 1; } public static void HSBtoRGB(float hue, float saturation, float brightness, float[] rgbvalues) { float r = 0, g = 0, b = 0; if (saturation == 0) { r = g = b = brightness; } else { //assert(Math.floor(hue) == 0); float h = (hue - (float) Math.floor(hue)) * 6; float hf = (float) java.lang.Math.floor(h); float f = h - hf; float p = brightness * (1 - saturation); float q = brightness * (1 - saturation * f); float t = brightness * (1 - (saturation * (1 - f))); switch ((int) hf) { case 0: r = brightness; g = t; b = p; break; case 1: r = q; g = brightness; b = p; break; case 2: r = p; g = brightness; b = t; break; case 3: r = p; g = q; b = brightness; break; case 4: r = t; g = p; b = brightness; break; case 5: default: r = brightness; g = p; b = q; break; case 6: // new Exception().printStackTrace(); r = g = b = 1; break; //assert false; } } rgbvalues[0] = r; rgbvalues[1] = g; rgbvalues[2] = b; } public static void RGBtoHSB(float r, float g, float b, float[] hsbvals) { float hue, saturation, brightness; float cmax = (r > g) ? r : g; if (b > cmax) { cmax = b; } float cmin = (r < g) ? r : g; if (b < cmin) { cmin = b; } brightness = cmax; if (cmax != 0) { saturation = (cmax - cmin) / cmax; } else { saturation = 0; } if (saturation == 0) { hue = 0; } else { float redc = (cmax - r) / (cmax - cmin); float greenc = (cmax - g) / (cmax - cmin); float bluec = (cmax - b) / (cmax - cmin); if (r == cmax) { hue = bluec - greenc; } else if (g == cmax) { hue = 2 + redc - bluec; } else { hue = 4 + greenc - redc; } hue /= 6; if (hue < 0) { hue += 1; } } hsbvals[0] = hue; hsbvals[1] = saturation; hsbvals[2] = brightness; } public static void IQYtoRGB(float i, float q, float y, float[] rgbvals) { i -= 0.5f; i *= 2; // if (i<0) // i = -(float)Math.pow(-i, 0.5); // else // i = (float)Math.pow(i, 0.5); i *= 0.595716f; q -= 0.5f; q *= 2; if (q<0) q = -(float)Math.pow(-q, 2); else q = (float)Math.pow(q, 2); q *= 0.522591f; rgbvals[0] = y + i*0.9563f + q*0.6210f; rgbvals[1] = y + i*-0.2721f + q*-0.6474f; rgbvals[2] = y + i*-1.1070f + q*1.7046f; if (rgbvals[0] < 0) rgbvals[0] = 0; if (rgbvals[0] > 1) rgbvals[0] = 1; if (rgbvals[1] < 0) rgbvals[1] = 0; if (rgbvals[1] > 1) rgbvals[1] = 1; if (rgbvals[2] < 0) rgbvals[2] = 0; if (rgbvals[2] > 1) rgbvals[2] = 1; } public static void RGBtoIQY(float r, float g, float b, float[] iqyvals) { iqyvals[0] = r*0.595716f - 0.274453f*g - 0.321263f*b; iqyvals[1] = r*0.211456f - 0.522591f*g + 0.311135f*b; iqyvals[2] = r*0.299f + 0.587f*g + 0.114f*b; iqyvals[0] /= 0.595716f; // if (iqyvals[0] < 0) // iqyvals[0] = -(float)Math.pow(-iqyvals[0], 2); // else // iqyvals[0] = (float)Math.pow(iqyvals[0], 2); iqyvals[0] /= 2; iqyvals[0] += 0.5f; iqyvals[1] /= 0.522591f; if (iqyvals[1] < 0) iqyvals[1] = -(float)Math.pow(-iqyvals[1], 0.5); else iqyvals[1] = (float)Math.pow(iqyvals[1], 0.5); iqyvals[1] /= 2; iqyvals[1] += 0.5f; if (iqyvals[0] < 0) iqyvals[0] = 0; if (iqyvals[0] > 1) iqyvals[0] = 1; if (iqyvals[1] < 0) iqyvals[1] = 0; if (iqyvals[1] > 1) iqyvals[1] = 1; if (iqyvals[2] < 0) iqyvals[2] = 0; if (iqyvals[2] > 1) iqyvals[2] = 1; } public static void UVYtoRGB(float u, float v, float y, float[] rgbvals) { u -= 0.5f; u *= 0.436f*2; v -= 0.5f; v *= 0.615f*2; rgbvals[0] = y + u*0.0f + v*1.13983f; rgbvals[1] = y + u*-0.39465f + v*-0.5806f; rgbvals[2] = y + u*2.03211f + v*0.0f; if (rgbvals[0] < 0) rgbvals[0] = 0; if (rgbvals[0] > 1) rgbvals[0] = 1; if (rgbvals[1] < 0) rgbvals[1] = 0; if (rgbvals[1] > 1) rgbvals[1] = 1; if (rgbvals[2] < 0) rgbvals[2] = 0; if (rgbvals[2] > 1) rgbvals[2] = 1; } public static void RGBtoUVY(float r, float g, float b, float[] uvyvals) { uvyvals[0] = r*-0.14713f - 0.28886f*g + 0.436f*b; uvyvals[1] = r*0.615f - 0.51499f*g - 0.10001f*b; uvyvals[2] = r*0.299f + 0.587f*g + 0.114f*b; uvyvals[0] /= 0.436f*2; uvyvals[0] += 0.5f; uvyvals[1] /= 0.615f*2; uvyvals[1] += 0.5f; if (uvyvals[0] < 0) uvyvals[0] = 0; if (uvyvals[0] > 1) uvyvals[0] = 1; if (uvyvals[1] < 0) uvyvals[1] = 0; if (uvyvals[1] > 1) uvyvals[1] = 1; if (uvyvals[2] < 0) uvyvals[2] = 0; if (uvyvals[2] > 1) uvyvals[2] = 1; } }