ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/spec_rgb.c
(Generate patch)

Comparing ray/src/common/spec_rgb.c (file contents):
Revision 2.10 by gwlarson, Wed Oct 7 17:11:40 1998 UTC vs.
Revision 2.12 by greg, Tue Feb 25 02:47:22 2003 UTC

# Line 1 | Line 1
1 /* Copyright (c) 1997 Regents of the University of California */
2
1   #ifndef lint
2 < static char SCCSid[] = "$SunId$ LBL";
2 > static const char       RCSid[] = "$Id$";
3   #endif
6
4   /*
5   * Convert colors and spectral ranges.
6 + * Added von Kries white-balance calculations 10/01 (GW).
7 + *
8 + * Externals declared in color.h
9   */
10  
11 + #include "copyright.h"
12 +
13   #include "color.h"
14 + #include <string.h>
15  
16 < #define CEPS    1e-7                    /* color epsilon */
16 > #define CEPS    1e-4                    /* color epsilon */
17  
18 + #define CEQ(v1,v2)      ((v1) <= (v2)+CEPS && (v2) <= (v1)+CEPS)
19  
20 < RGBPRIMS  stdprims = STDPRIMS;          /* standard primary chromaticities */
20 > #define XYEQ(c1,c2)     (CEQ((c1)[CIEX],(c2)[CIEX]) && CEQ((c1)[CIEY],(c2)[CIEY]))
21  
22 +
23 + RGBPRIMS  stdprims = STDPRIMS;  /* standard primary chromaticities */
24 +
25   COLOR  cblack = BLKCOLOR;               /* global black color */
26   COLOR  cwhite = WHTCOLOR;               /* global white color */
27  
28 + float  xyneu[2] = {1./3., 1./3.};       /* neutral xy chromaticities */
29 +
30   /*
31   *      The following table contains the CIE tristimulus integrals
32   *  for X, Y, and Z.  The table is cumulative, so that
# Line 47 | Line 56 | static BYTE  chroma[3][NINC] = {
56          }
57   };
58  
59 < COLORMAT  xyz2rgbmat = {                /* XYZ to RGB */
59 > COLORMAT  xyz2rgbmat = {                /* XYZ to RGB (no white balance) */
60          {(CIE_y_g - CIE_y_b - CIE_x_b*CIE_y_g + CIE_y_b*CIE_x_g)/CIE_C_rD,
61           (CIE_x_b - CIE_x_g - CIE_x_b*CIE_y_g + CIE_x_g*CIE_y_b)/CIE_C_rD,
62           (CIE_x_g*CIE_y_b - CIE_x_b*CIE_y_g)/CIE_C_rD},
# Line 59 | Line 68 | COLORMAT  xyz2rgbmat = {               /* XYZ to RGB */
68           (CIE_x_r*CIE_y_g - CIE_x_g*CIE_y_r)/CIE_C_bD}
69   };
70  
71 < COLORMAT  rgb2xyzmat = {                /* RGB to XYZ */
71 > COLORMAT  rgb2xyzmat = {                /* RGB to XYZ (no white balance) */
72          {CIE_x_r*CIE_C_rD/CIE_D,CIE_x_g*CIE_C_gD/CIE_D,CIE_x_b*CIE_C_bD/CIE_D},
73          {CIE_y_r*CIE_C_rD/CIE_D,CIE_y_g*CIE_C_gD/CIE_D,CIE_y_b*CIE_C_bD/CIE_D},
74          {(1.-CIE_x_r-CIE_y_r)*CIE_C_rD/CIE_D,
# Line 67 | Line 76 | COLORMAT  rgb2xyzmat = {               /* RGB to XYZ */
76           (1.-CIE_x_b-CIE_y_b)*CIE_C_bD/CIE_D}
77   };
78  
79 + COLORMAT  vkmat = {             /* Sharp primary matrix */
80 +        { 1.2694, -0.0988, -0.1706},
81 +        {-0.8364,  1.8006,  0.0357},
82 +        { 0.0297, -0.0315,  1.0018}
83 + };
84  
85 + COLORMAT  ivkmat = {            /* inverse Sharp primary matrix */
86 +        { 0.8156,  0.0472,  0.1372},
87 +        { 0.3791,  0.5769,  0.0440},
88 +        {-0.0123,  0.0167,  0.9955}
89 + };
90  
91 +
92 + void
93   spec_rgb(col, s, e)             /* compute RGB color from spectral range */
94   COLOR  col;
95   int  s, e;
# Line 80 | Line 101 | int  s, e;
101   }
102  
103  
104 + void
105   spec_cie(col, s, e)             /* compute a color from a spectral range */
106   COLOR  col;             /* returned color */
107   int  s, e;              /* starting and ending wavelengths */
# Line 114 | Line 136 | int  s, e;             /* starting and ending wavelengths */
136   }
137  
138  
139 + void
140   cie_rgb(rgb, xyz)               /* convert CIE color to standard RGB */
141 < COLOR   rgb, xyz;
141 > COLOR   rgb;
142 > COLOR  xyz;
143   {
144          colortrans(rgb, xyz2rgbmat, xyz);
145          clipgamut(rgb, xyz[CIEY], CGAMUT_LOWER, cblack, cwhite);
# Line 168 | Line 192 | COLOR  lower, upper;
192   }
193  
194  
195 + void
196   colortrans(c2, mat, c1)         /* convert c1 by mat and put into c2 */
197 + register COLOR  c2;
198   register COLORMAT  mat;
199 < register COLOR  c1, c2;
199 > register COLOR  c1;
200   {
201          COLOR   cout;
202  
# Line 182 | Line 208 | register COLOR  c1, c2;
208   }
209  
210  
211 + void
212   multcolormat(m3, m2, m1)        /* multiply m1 by m2 and put into m3 */
213 < COLORMAT  m1, m2, m3;           /* m3 can be either m1 or m2 w/o harm */
213 > COLORMAT  m3;                   /* m3 can be either m1 or m2 w/o harm */
214 > COLORMAT  m2, m1;
215   {
216          COLORMAT  mt;
217          register int  i, j;
# Line 197 | Line 225 | COLORMAT  m1, m2, m3;          /* m3 can be either m1 or m2 w/
225   }
226  
227  
228 + void
229   compxyz2rgbmat(mat, pr)         /* compute conversion from CIE to RGB space */
230   COLORMAT  mat;
231   register RGBPRIMS  pr;
# Line 247 | Line 276 | register RGBPRIMS  pr;
276   }
277  
278  
279 + void
280   comprgb2xyzmat(mat, pr)         /* compute conversion from RGB to CIE space */
281   COLORMAT  mat;
282   register RGBPRIMS  pr;
# Line 284 | Line 314 | register RGBPRIMS  pr;
314   }
315  
316  
317 + void
318   comprgb2rgbmat(mat, pr1, pr2)   /* compute conversion from RGB1 to RGB2 */
319   COLORMAT  mat;
320   RGBPRIMS  pr1, pr2;
# Line 300 | Line 331 | RGBPRIMS  pr1, pr2;
331          compxyz2rgbmat(xyztopr2, pr2);
332                                  /* combine transforms */
333          multcolormat(mat, pr1toxyz, xyztopr2);
334 + }
335 +
336 +
337 + void
338 + compxyzWBmat(mat, wht1, wht2)   /* CIE von Kries transform from wht1 to wht2 */
339 + COLORMAT  mat;
340 + float  wht1[2], wht2[2];
341 + {
342 +        COLOR   cw1, cw2;
343 +        if (XYEQ(wht1,wht2)) {
344 +                mat[0][0] = mat[1][1] = mat[2][2] = 1.0;
345 +                mat[0][1] = mat[0][2] = mat[1][0] =
346 +                mat[1][2] = mat[2][0] = mat[2][1] = 0.0;
347 +                return;
348 +        }
349 +        cw1[RED] = wht1[CIEX]/wht1[CIEY];
350 +        cw1[GRN] = 1.;
351 +        cw1[BLU] = (1. - wht1[CIEX] - wht1[CIEY])/wht1[CIEY];
352 +        colortrans(cw1, vkmat, cw1);
353 +        cw2[RED] = wht2[CIEX]/wht2[CIEY];
354 +        cw2[GRN] = 1.;
355 +        cw2[BLU] = (1. - wht2[CIEX] - wht2[CIEY])/wht2[CIEY];
356 +        colortrans(cw2, vkmat, cw2);
357 +        mat[0][0] = cw2[RED]/cw1[RED];
358 +        mat[1][1] = cw2[GRN]/cw1[GRN];
359 +        mat[2][2] = cw2[BLU]/cw1[BLU];
360 +        mat[0][1] = mat[0][2] = mat[1][0] =
361 +        mat[1][2] = mat[2][0] = mat[2][1] = 0.0;
362 +        multcolormat(mat, vkmat, mat);
363 +        multcolormat(mat, mat, ivkmat);
364 + }
365 +
366 +
367 + void
368 + compxyz2rgbWBmat(mat, pr)       /* von Kries conversion from CIE to RGB space */
369 + COLORMAT  mat;
370 + RGBPRIMS  pr;
371 + {
372 +        COLORMAT        wbmat;
373 +
374 +        compxyz2rgbmat(mat, pr);
375 +        if (XYEQ(pr[WHT],xyneu))
376 +                return;
377 +        compxyzWBmat(wbmat, xyneu, pr[WHT]);
378 +        multcolormat(mat, wbmat, mat);
379 + }
380 +
381 + void
382 + comprgb2xyzWBmat(mat, pr)       /* von Kries conversion from RGB to CIE space */
383 + COLORMAT  mat;
384 + RGBPRIMS  pr;
385 + {
386 +        COLORMAT        wbmat;
387 +        
388 +        comprgb2xyzmat(mat, pr);
389 +        if (XYEQ(pr[WHT],xyneu))
390 +                return;
391 +        compxyzWBmat(wbmat, pr[WHT], xyneu);
392 +        multcolormat(mat, mat, wbmat);
393 + }
394 +
395 + void
396 + comprgb2rgbWBmat(mat, pr1, pr2) /* von Kries conversion from RGB1 to RGB2 */
397 + COLORMAT  mat;
398 + RGBPRIMS  pr1, pr2;
399 + {
400 +        COLORMAT  pr1toxyz, xyztopr2, wbmat;
401 +
402 +        if (pr1 == pr2) {
403 +                mat[0][0] = mat[1][1] = mat[2][2] = 1.0;
404 +                mat[0][1] = mat[0][2] = mat[1][0] =
405 +                mat[1][2] = mat[2][0] = mat[2][1] = 0.0;
406 +                return;
407 +        }
408 +        comprgb2xyzmat(pr1toxyz, pr1);
409 +        compxyzWBmat(wbmat, pr1[WHT], pr2[WHT]);
410 +        compxyz2rgbmat(xyztopr2, pr2);
411 +                                /* combine transforms */
412 +        multcolormat(mat, pr1toxyz, wbmat);
413 +        multcolormat(mat, mat, xyztopr2);
414   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines