|
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;
|
}
|
}
|