--- ray/src/common/spec_rgb.c 1993/03/05 15:14:04 2.2 +++ ray/src/common/spec_rgb.c 1994/07/07 15:21:25 2.4 @@ -39,19 +39,25 @@ static BYTE chroma[3][NINC] = { } }; -#ifdef NTSC -static float xyz2rgbmat[3][3] = { /* XYZ to RGB (NTSC) */ - {1.73, -.48, -.26}, - {-.81, 1.65, -.02}, - {.08, -.17, 1.28} +static float xyz2rgbmat[3][3] = { /* XYZ to RGB */ + {(CIE_y_g - CIE_y_b - CIE_x_b*CIE_y_g + CIE_y_b*CIE_x_g)/CIE_C_rD, + (CIE_x_b - CIE_x_g - CIE_x_b*CIE_y_g + CIE_x_g*CIE_y_b)/CIE_C_rD, + (CIE_x_g*CIE_y_b - CIE_x_b*CIE_y_g)/CIE_C_rD}, + {(CIE_y_b - CIE_y_r - CIE_y_b*CIE_x_r + CIE_y_r*CIE_x_b)/CIE_C_gD, + (CIE_x_r - CIE_x_b - CIE_x_r*CIE_y_b + CIE_x_b*CIE_y_r)/CIE_C_gD, + (CIE_x_b*CIE_y_r - CIE_x_r*CIE_y_b)/CIE_C_gD}, + {(CIE_y_r - CIE_y_g - CIE_y_r*CIE_x_g + CIE_y_g*CIE_x_r)/CIE_C_bD, + (CIE_x_g - CIE_x_r - CIE_x_g*CIE_y_r + CIE_x_r*CIE_y_g)/CIE_C_bD, + (CIE_x_r*CIE_y_g - CIE_x_g*CIE_y_r)/CIE_C_bD} }; -#else -static float xyz2rgbmat[3][3] = { /* XYZ to RGB (color monitor) */ - {2.739, -1.145, -.424}, - {-1.119, 2.029, .033}, - {.138, -.333, 1.105} + +static float rgb2xyzmat[3][3] = { /* RGB to XYZ */ + {CIE_x_r*CIE_C_rD/CIE_D,CIE_x_g*CIE_C_gD/CIE_D,CIE_x_b*CIE_C_bD/CIE_D}, + {CIE_y_r*CIE_C_rD/CIE_D,CIE_y_g*CIE_C_gD/CIE_D,CIE_y_b*CIE_C_bD/CIE_D}, + {(1.-CIE_x_r-CIE_y_r)*CIE_C_rD/CIE_D, + (1.-CIE_x_g-CIE_y_g)*CIE_C_gD/CIE_D, + (1.-CIE_x_b-CIE_y_b)*CIE_C_bD/CIE_D} }; -#endif @@ -112,4 +118,16 @@ register COLOR rgbcolor, ciecolor; if (rgbcolor[i] < 0.0) rgbcolor[i] = 0.0; } +} + + +rgb_cie(ciecolor, rgbcolor) /* convert RGB to CIE */ +register COLOR ciecolor, rgbcolor; +{ + register int i; + + for (i = 0; i < 3; i++) + ciecolor[i] = rgb2xyzmat[i][0]*rgbcolor[0] + + rgb2xyzmat[i][1]*rgbcolor[1] + + rgb2xyzmat[i][2]*rgbcolor[2] ; }