|
From: <de...@us...> - 2003-04-21 19:36:09
|
Update of /cvsroot/csp/APPLICATIONS/CSPSim/Source
In directory sc8-pr-cvs1:/tmp/cvs-serv13282
Modified Files:
Colorspace.cpp
Log Message:
no message
Index: Colorspace.cpp
===================================================================
RCS file: /cvsroot/csp/APPLICATIONS/CSPSim/Source/Colorspace.cpp,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -d -r1.6 -r1.7
*** Colorspace.cpp 12 Mar 2003 21:39:29 -0000 1.6
--- Colorspace.cpp 21 Apr 2003 19:36:03 -0000 1.7
***************
*** 20,25 ****
#include "Colorspace.h"
!
! #define PI 3.14159265358979323846264338327950288419716939937510
float Xn, Yn, Zn;
--- 20,24 ----
#include "Colorspace.h"
! float const PI = 3.14159265358979323846264338327950288419716939937510f;
float Xn, Yn, Zn;
***************
*** 109,115 ****
*/
static float cubert(float x) {
! if (x > 0.0) return pow(x, (1.0/3.0));
if (x == 0.0) return 0.0;
! return -pow(fabs(x), (1.0/3.0));
}
--- 108,114 ----
*/
static float cubert(float x) {
! if (x > 0.0) return powf(x, (1.0f/3.0f));
if (x == 0.0) return 0.0;
! return -powf(fabsf(x), (1.0f/3.0f));
}
***************
*** 200,204 ****
H = rmodp(H, 360.0);
if (H < 60.0) {
! return n1 + (n2 - n1) * H / 60.0;
}
if (H < 180.0) {
--- 199,203 ----
H = rmodp(H, 360.0);
if (H < 60.0) {
! return n1 + (n2 - n1) * H / 60.0f;
}
if (H < 180.0) {
***************
*** 206,210 ****
}
if (H < 240.0) {
! return n1 + (n2 - n1) * (240.0 - H) / 60.0;
}
return n1;
--- 205,209 ----
}
if (H < 240.0) {
! return n1 + (n2 - n1) * (240.0f - H) / 60.0f;
}
return n1;
***************
*** 236,242 ****
R = G = B = L;
} else {
! R = hls_value(m1, m2, H + 120.0);
G = hls_value(m1, m2, H);
! B = hls_value(m1, m2, H - 120.0);
}
}
--- 235,241 ----
R = G = B = L;
} else {
! R = hls_value(m1, m2, H + 120.0f);
G = hls_value(m1, m2, H);
! B = hls_value(m1, m2, H - 120.0f);
}
}
***************
*** 261,265 ****
float d = (rgbmax - rgbmin);
float rc, gc, bc;
! L = (rgbmax + rgbmin) * 0.5;
if (d == 0.0) {
S = 0.0;
--- 260,264 ----
float d = (rgbmax - rgbmin);
float rc, gc, bc;
! L = (rgbmax + rgbmin) * 0.5f;
if (d == 0.0) {
S = 0.0;
***************
*** 269,275 ****
S = d / (rgbmax + rgbmin);
} else {
! S = d / (2.0 - rgbmax - rgbmin);
}
! float s = 1.0 / d;
rc = (rgbmax - R) * s;
gc = (rgbmax - G) * s;
--- 268,274 ----
S = d / (rgbmax + rgbmin);
} else {
! S = d / (2.0f - rgbmax - rgbmin);
}
! float s = 1.0f / d;
rc = (rgbmax - R) * s;
gc = (rgbmax - G) * s;
***************
*** 279,287 ****
} else
if (G == rgbmax) {
! H = 2.0 + rc - bc;
} else {
! H = 4.0 + gc - rc;
}
! H = H * 60.0;
}
}
--- 278,286 ----
} else
if (G == rgbmax) {
! H = 2.0f + rc - bc;
} else {
! H = 4.0f + gc - rc;
}
! H = H * 60.0f;
}
}
***************
*** 317,326 ****
R = G = B = V;
} else {
! float hue = rmodp(H, 360.0) / 60.0;
int i = (int) hue;
float f = hue - (float) i;
! float p = V * (1.0 - S);
! float q = V * (1.0 - S * f);
! float t = V * (1.0 - S + S * f);
switch (i) {
case 0:
--- 316,325 ----
R = G = B = V;
} else {
! float hue = rmodp(H, 360.0) / 60.0f;
int i = (int) hue;
float f = hue - (float) i;
! float p = V * (1.0f - S);
! float q = V * (1.0f - S * f);
! float t = V * (1.0f - S + S * f);
switch (i) {
case 0:
***************
*** 391,395 ****
} else {
float rc, gc, bc;
! float s = 1.0 / d;
rc = (rgbmax - R) * s;
gc = (rgbmax - G) * s;
--- 390,394 ----
} else {
float rc, gc, bc;
! float s = 1.0f / d;
rc = (rgbmax - R) * s;
gc = (rgbmax - G) * s;
***************
*** 399,407 ****
} else
if (G == rgbmax) {
! H = 2.0 + rc - bc;
} else {
! H = 4.0 + gc - rc;
}
! H = rmodp(H * 60.0, 360.0);
}
}
--- 398,406 ----
} else
if (G == rgbmax) {
! H = 2.0f + rc - bc;
} else {
! H = 4.0f + gc - rc;
}
! H = rmodp(H * 60.0f, 360.0);
}
}
***************
*** 431,439 ****
} else
if (G == rgbmax) {
! H = 2.0 + R - B;
} else {
! H = 4.0 + G - R;
}
! H = H / 6.0;
LIMIT_ZERO_TO_ONE(H);
return H;
--- 430,438 ----
} else
if (G == rgbmax) {
! H = 2.0f + R - B;
} else {
! H = 4.0f + G - R;
}
! H = H / 6.0f;
LIMIT_ZERO_TO_ONE(H);
return H;
***************
*** 464,474 ****
*/
float T_to_spd(float T, float lambda) {
! static float c = 2.9979246E+08;
! static float h = 6.626176E-34;
! static float k = 1.38066E-23;
! static float nmtom = 1.0E-09;
float expon = h * c / ( nmtom * lambda * k * T );
! float denom = pow(nmtom,4.0) * pow(lambda, 5.0) * (exp(expon) - 1.0);
! float power = 8.0 * PI * h * c / denom;
return power;
}
--- 463,473 ----
*/
float T_to_spd(float T, float lambda) {
! static float c = 2.9979246E+08f;
! static float h = 6.626176E-34f;
! static float k = 1.38066E-23f;
! static float nmtom = 1.0E-09f;
float expon = h * c / ( nmtom * lambda * k * T );
! float denom = powf(nmtom,4.0f) * powf(lambda, 5.0f) * (expf(expon) - 1.0f);
! float power = 8.0f * PI * h * c / denom;
return power;
}
***************
*** 511,551 ****
static const int n = 53;
static const float Tdat[] = {
! 1000.0, 1200.0, 1400.0, 1500.0, 1600.0,
! 1700.0, 1800.0, 1900.0, 2000.0, 2100.0,
! 2200.0, 2300.0, 2400.0, 2500.0, 2600.0,
! 2700.0, 2800.0, 2900.0, 3000.0, 3100.0,
! 3200.0, 3300.0, 3400.0, 3500.0, 3600.0,
! 3700.0, 3800.0, 3900.0, 4000.0, 4100.0,
! 4200.0, 4300.0, 4400.0, 4500.0, 4600.0,
! 4700.0, 4800.0, 4900.0, 5000.0, 5200.0,
! 5400.0, 5600.0, 5800.0, 6000.0, 6500.0,
! 7000.0, 7500.0, 8000.0, 8500.0, 9000.0,
! 10000.0, 15000.0, 30000.0
};
static const float xdat[] = {
! 0.6526, 0.6249, 0.5984, 0.5856, 0.5731,
! 0.5610, 0.5491, 0.5377, 0.5266, 0.5158,
! 0.5055, 0.4956, 0.4860, 0.4769, 0.4681,
! 0.4597, 0.4517, 0.4441, 0.4368, 0.4299,
! 0.4233, 0.4170, 0.4109, 0.4052, 0.3997,
! 0.3945, 0.3896, 0.3848, 0.3804, 0.3760,
! 0.3719, 0.3680, 0.3643, 0.3607, 0.3573,
! 0.3540, 0.3509, 0.3479, 0.3450, 0.3397,
! 0.3347, 0.3301, 0.3259, 0.3220, 0.3135,
! 0.3063, 0.3003, 0.2952, 0.2908, 0.2869,
! 0.2806, 0.2637, 0.2501
};
static const float ydat[] = {
! 0.3446, 0.3676, 0.3859, 0.3932, 0.3993,
! 0.4043, 0.4083, 0.4112, 0.4133, 0.4146,
! 0.4152, 0.4152, 0.4147, 0.4137, 0.4123,
! 0.4106, 0.4086, 0.4064, 0.4041, 0.4015,
! 0.3989, 0.3962, 0.3935, 0.3907, 0.3879,
! 0.3851, 0.3822, 0.3795, 0.3767, 0.3740,
! 0.3713, 0.3687, 0.3660, 0.3635, 0.3610,
! 0.3586, 0.3562, 0.3539, 0.3516, 0.3472,
! 0.3430, 0.3391, 0.3353, 0.3318, 0.3236,
! 0.3165, 0.3103, 0.3048, 0.2999, 0.2956,
! 0.2883, 0.2673, 0.2489
};
if (T < Tdat[0]) {
--- 510,550 ----
static const int n = 53;
static const float Tdat[] = {
! 1000.0f, 1200.0f, 1400.0f, 1500.0f, 1600.0f,
! 1700.0f, 1800.0f, 1900.0f, 2000.0f, 2100.0f,
! 2200.0f, 2300.0f, 2400.0f, 2500.0f, 2600.0f,
! 2700.0f, 2800.0f, 2900.0f, 3000.0f, 3100.0f,
! 3200.0f, 3300.0f, 3400.0f, 3500.0f, 3600.0f,
! 3700.0f, 3800.0f, 3900.0f, 4000.0f, 4100.0f,
! 4200.0f, 4300.0f, 4400.0f, 4500.0f, 4600.0f,
! 4700.0f, 4800.0f, 4900.0f, 5000.0f, 5200.0f,
! 5400.0f, 5600.0f, 5800.0f, 6000.0f, 6500.0f,
! 7000.0f, 7500.0f, 8000.0f, 8500.0f, 9000.0f,
! 10000.0f, 15000.0f, 30000.0f
};
static const float xdat[] = {
! 0.6526f, 0.6249f, 0.5984f, 0.5856f, 0.5731f,
! 0.5610f, 0.5491f, 0.5377f, 0.5266f, 0.5158f,
! 0.5055f, 0.4956f, 0.4860f, 0.4769f, 0.4681f,
! 0.4597f, 0.4517f, 0.4441f, 0.4368f, 0.4299f,
! 0.4233f, 0.4170f, 0.4109f, 0.4052f, 0.3997f,
! 0.3945f, 0.3896f, 0.3848f, 0.3804f, 0.3760f,
! 0.3719f, 0.3680f, 0.3643f, 0.3607f, 0.3573f,
! 0.3540f, 0.3509f, 0.3479f, 0.3450f, 0.3397f,
! 0.3347f, 0.3301f, 0.3259f, 0.3220f, 0.3135f,
! 0.3063f, 0.3003f, 0.2952f, 0.2908f, 0.2869f,
! 0.2806f, 0.2637f, 0.2501f
};
static const float ydat[] = {
! 0.3446f, 0.3676f, 0.3859f, 0.3932f, 0.3993f,
! 0.4043f, 0.4083f, 0.4112f, 0.4133f, 0.4146f,
! 0.4152f, 0.4152f, 0.4147f, 0.4137f, 0.4123f,
! 0.4106f, 0.4086f, 0.4064f, 0.4041f, 0.4015f,
! 0.3989f, 0.3962f, 0.3935f, 0.3907f, 0.3879f,
! 0.3851f, 0.3822f, 0.3795f, 0.3767f, 0.3740f,
! 0.3713f, 0.3687f, 0.3660f, 0.3635f, 0.3610f,
! 0.3586f, 0.3562f, 0.3539f, 0.3516f, 0.3472f,
! 0.3430f, 0.3391f, 0.3353f, 0.3318f, 0.3236f,
! 0.3165f, 0.3103f, 0.3048f, 0.2999f, 0.2956f,
! 0.2883f, 0.2673f, 0.2489f
};
if (T < Tdat[0]) {
***************
*** 560,564 ****
y = interp(n, T, Tdat, ydat);
}
! z = 1.0 - x - y;
}
--- 559,563 ----
y = interp(n, T, Tdat, ydat);
}
! z = 1.0f - x - y;
}
***************
*** 571,577 ****
*/
void XYZ_to_RGB709(float X, float Y, float Z, float &R, float &G, float &B) {
! R = 3.240479*X-1.537150*Y-0.498535*Z;
! G = -0.969256*X+1.875992*Y+0.041556*Z;
! B = 0.055648*X-0.204043*Y+1.057311*Z;
}
--- 570,576 ----
*/
void XYZ_to_RGB709(float X, float Y, float Z, float &R, float &G, float &B) {
! R = 3.240479f*X-1.537150f*Y-0.498535f*Z;
! G = -0.969256f*X+1.875992f*Y+0.041556f*Z;
! B = 0.055648f*X-0.204043f*Y+1.057311f*Z;
}
***************
*** 584,590 ****
*/
void RGB709_to_XYZ(float R, float G, float B, float &X, float &Y, float &Z) {
! X = 0.412453*R+0.357580*G+0.180423*B;
! Y = 0.212671*R+0.715160*G+0.072169*B;
! Z = 0.019334*R+0.119193*G+0.950227*B;
}
--- 583,589 ----
*/
void RGB709_to_XYZ(float R, float G, float B, float &X, float &Y, float &Z) {
! X = 0.412453f*R+0.357580f*G+0.180423f*B;
! Y = 0.212671f*R+0.715160f*G+0.072169f*B;
! Z = 0.019334f*R+0.119193f*G+0.950227f*B;
}
***************
*** 593,597 ****
*/
float getY709(float R, float G, float B) {
! return 0.212671*R + 0.71516*G + 0.072169*B;
}
--- 592,596 ----
*/
float getY709(float R, float G, float B) {
! return 0.212671f*R + 0.71516f*G + 0.072169f*B;
}
***************
*** 615,619 ****
X = x * Y / y;
if (X < 0.0) X = 0.0;
! float z = 1.0 - x - y;
Z = z * Y / y;
if (Z < 0.0) Z = 0.0;
--- 614,618 ----
X = x * Y / y;
if (X < 0.0) X = 0.0;
! float z = 1.0f - x - y;
Z = z * Y / y;
if (Z < 0.0) Z = 0.0;
***************
*** 686,693 ****
} else
if (Y <= 0.008856 * Yn) {
! Lstar = 903.3 * Y / Yn;
} else
if (Y <= Yn) {
! Lstar = 116.0 * cubert(Y/Yn) - 16.0;
} else {
Lstar = 100.0;
--- 685,692 ----
} else
if (Y <= 0.008856 * Yn) {
! Lstar = 903.3f * Y / Yn;
} else
if (Y <= Yn) {
! Lstar = 116.0f * cubert(Y/Yn) - 16.0f;
} else {
Lstar = 100.0;
***************
*** 695,700 ****
float uprime, vprime, wprime;
XYZ_to_uvwp(X, Y, Z, uprime, vprime, wprime);
! ustar = 13.0 * Lstar * (uprime - unprime);
! vstar = 13.0 * Lstar * (vprime - vnprime);
}
}
--- 694,699 ----
float uprime, vprime, wprime;
XYZ_to_uvwp(X, Y, Z, uprime, vprime, wprime);
! ustar = 13.0f * Lstar * (uprime - unprime);
! vstar = 13.0f * Lstar * (vprime - vnprime);
}
}
***************
*** 717,729 ****
} else {
if (Lstar <= 903.3 * 0.008856) {
! Y = Lstar * Yn / 903.3;
} else
if (Lstar <= 100.0) {
! Y = Yn * pow((Lstar + 16.0) / 116.0, 3.0);
} else {
Y = Yn;
}
! float uprime = unprime + ustar / (13.0 * Lstar);
! float vprime = vnprime + vstar / (13.0 * Lstar);
uvpY_to_XYZ(uprime, vprime, Y, X, Y, Z);
}
--- 716,728 ----
} else {
if (Lstar <= 903.3 * 0.008856) {
! Y = Lstar * Yn / 903.3f;
} else
if (Lstar <= 100.0) {
! Y = Yn * powf((Lstar + 16.0f) / 116.0f, 3.0f);
} else {
Y = Yn;
}
! float uprime = unprime + ustar / (13.0f * Lstar);
! float vprime = vnprime + vstar / (13.0f * Lstar);
uvpY_to_XYZ(uprime, vprime, Y, X, Y, Z);
}
***************
*** 746,756 ****
*/
void XYZ_to_uvwp(float X, float Y, float Z, float &uprime, float &vprime, float &wprime) {
! float denom = X + 15.0 * Y + 3.0 * Z;
if (denom == 0.0) {
uprime = vprime = wprime = 0.0;
} else {
! uprime = 4.0 * X / denom;
! vprime = 9.0 * Y / denom;
! wprime = (-3.0 * X + 6.0 * Y + 3.0 * Z) / denom;
}
}
--- 745,755 ----
*/
void XYZ_to_uvwp(float X, float Y, float Z, float &uprime, float &vprime, float &wprime) {
! float denom = X + 15.0f * Y + 3.0f * Z;
if (denom == 0.0) {
uprime = vprime = wprime = 0.0;
} else {
! uprime = 4.0f * X / denom;
! vprime = 9.0f * Y / denom;
! wprime = (-3.0f * X + 6.0f * Y + 3.0f * Z) / denom;
}
}
***************
*** 765,770 ****
void uvpY_to_XYZ(float uprime, float vprime, float Y_, float &X, float &Y, float &Z) {
Y = Y_;
! X = 9.0 * Y * uprime / (4.0 * vprime);
! Z = - X / 3.0 - 5.0 * Y + 3.0 * Y / vprime;
}
--- 764,769 ----
void uvpY_to_XYZ(float uprime, float vprime, float Y_, float &X, float &Y, float &Z) {
Y = Y_;
! X = 9.0f * Y * uprime / (4.0f * vprime);
! Z = - X / 3.0f - 5.0f * Y + 3.0f * Y / vprime;
}
***************
*** 777,787 ****
*/
void uvp_to_xyz(float uprime, float vprime, float &x, float &y, float &z) {
! float denom = 6.0 * uprime - 16.0 * vprime + 12.0;
if (denom == 0.0) {
x = y = z = 0.0;
} else {
! x = 9.0 * uprime / denom;
! y = 4.0 * vprime / denom;
! z = (-3.0 * uprime - 20.0 * vprime + 12.0) / denom;
}
}
--- 776,786 ----
*/
void uvp_to_xyz(float uprime, float vprime, float &x, float &y, float &z) {
! float denom = 6.0f * uprime - 16.0f * vprime + 12.0f;
if (denom == 0.0) {
x = y = z = 0.0;
} else {
! x = 9.0f * uprime / denom;
! y = 4.0f * vprime / denom;
! z = (-3.0f * uprime - 20.0f * vprime + 12.0f) / denom;
}
}
***************
*** 795,805 ****
*/
void xy_to_uvwp(float x, float y, float &uprime, float &vprime, float &wprime) {
! float denom = -2.0 * x + 12.0 * y + 3.0;
if (denom == 0.0) {
uprime = vprime = wprime = 0.0;
} else {
! uprime = 4.0 * x / denom;
! vprime = 9.0 * y / denom;
! wprime = (-6.0 * x + 3.0 * y + 3.0) / denom;
}
}
--- 794,804 ----
*/
void xy_to_uvwp(float x, float y, float &uprime, float &vprime, float &wprime) {
! float denom = -2.0f * x + 12.0f * y + 3.0f;
if (denom == 0.0) {
uprime = vprime = wprime = 0.0;
} else {
! uprime = 4.0f * x / denom;
! vprime = 9.0f * y / denom;
! wprime = (-6.0f * x + 3.0f * y + 3.0f) / denom;
}
}
***************
*** 1031,1037 ****
return *this;
case CIELuv:
! H = atan2(c, b);
L = a;
! S = sqrt(b+c);
break;
case CIExyY:
--- 1030,1036 ----
return *this;
case CIELuv:
! H = atan2f(c, b);
L = a;
! S = sqrtf(b+c);
break;
case CIExyY:
***************
*** 1082,1086 ****
void Color::blend(Color const &color, float alpha) {
! composite(color, 1.0-alpha, alpha);
}
--- 1081,1085 ----
void Color::blend(Color const &color, float alpha) {
! composite(color, 1.0f-alpha, alpha);
}
|