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

Comparing ray/src/common/color.c (file contents):
Revision 1.4 by greg, Thu May 11 22:15:57 1989 UTC vs.
Revision 1.13 by greg, Fri Oct 19 11:13:02 1990 UTC

# Line 14 | Line 14 | static char SCCSid[] = "$SunId$ LBL";
14  
15   #include  "color.h"
16  
17 #ifdef  SPEC_RGB
18 /*
19 *      The following table contains the CIE tristimulus integrals
20 *  for X, Y, and Z.  The table is cumulative, so that
21 *  each color coordinate integrates to 1.
22 */
17  
24 #define  STARTWL        380             /* starting wavelength (nanometers) */
25 #define  INCWL          10              /* wavelength increment */
26 #define  NINC           40              /* # of values */
27
28 static BYTE  chroma[3][NINC] = {
29        {                                                       /* X */
30                0,   0,   0,   2,   6,   13,  22,  30,  36,  41,
31                42,  43,  43,  44,  46,  52,  60,  71,  87,  106,
32                128, 153, 178, 200, 219, 233, 243, 249, 252, 254,
33                255, 255, 255, 255, 255, 255, 255, 255, 255, 255
34        }, {                                                    /* Y */
35                0,   0,   0,   0,   0,   1,   2,   4,   7,   11,
36                17,  24,  34,  48,  64,  84,  105, 127, 148, 169,
37                188, 205, 220, 232, 240, 246, 250, 253, 254, 255,
38                255, 255, 255, 255, 255, 255, 255, 255, 255, 255
39        }, {                                                    /* Z */
40                0,   0,   2,   10,  32,  66,  118, 153, 191, 220,
41                237, 246, 251, 253, 254, 255, 255, 255, 255, 255,
42                255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
43                255, 255, 255, 255, 255, 255, 255, 255, 255, 255
44        }
45 };
46
47
48 spec_rgb(col, s, e)             /* comput RGB color from spectral range */
49 COLOR  col;
50 int  s, e;
51 {
52        COLOR  ciecolor;
53
54        spec_cie(ciecolor, s, e);
55        cie_rgb(col, ciecolor);
56 }
57
58
59 spec_cie(col, s, e)             /* compute a color from a spectral range */
60 COLOR  col;             /* returned color */
61 int  s, e;              /* starting and ending wavelengths */
62 {
63        register int  i, d, r;
64        
65        s -= STARTWL;
66        if (s < 0)
67                s = 0;
68
69        e -= STARTWL;
70        if (e >= INCWL*(NINC - 1))
71                e = INCWL*(NINC - 1) - 1;
72
73        d = e / INCWL;                  /* interpolate values */
74        r = e % INCWL;
75        for (i = 0; i < 3; i++)
76                col[i] = chroma[i][d]*(INCWL - r) + chroma[i][d + 1]*r;
77
78        d = s / INCWL;
79        r = s % INCWL;
80        for (i = 0; i < 3; i++)
81                col[i] -= chroma[i][d]*(INCWL - r) - chroma[i][d + 1]*r;
82
83        col[RED] = (col[RED] + 0.5) / (256*INCWL);
84        col[GRN] = (col[GRN] + 0.5) / (256*INCWL);
85        col[BLU] = (col[BLU] + 0.5) / (256*INCWL);
86 }
87
88
89 cie_rgb(rgbcolor, ciecolor)             /* convert CIE to RGB (NTSC) */
90 register COLOR  rgbcolor, ciecolor;
91 {
92        static float  cmat[3][3] = {
93                1.73, -.48, -.26,
94                -.81, 1.65, -.02,
95                 .08, -.17, 1.28,
96        };
97        register int  i;
98
99        for (i = 0; i < 3; i++) {
100                rgbcolor[i] =   cmat[i][0]*ciecolor[0] +
101                                cmat[i][1]*ciecolor[1] +
102                                cmat[i][2]*ciecolor[2] ;
103                if (rgbcolor[i] < 0.0)
104                        rgbcolor[i] = 0.0;
105        }
106 }
107 #endif
108
109
18   fwritecolrs(scanline, len, fp)          /* write out a colr scanline */
19   register COLR  *scanline;
20   int  len;
# Line 308 | Line 216 | colr_color(col, clr)           /* convert short to float color
216   register COLOR  col;
217   register COLR  clr;
218   {
219 <        double  ldexp(), f;
219 >        double  f;
220          
221          if (clr[EXP] == 0)
222                  col[RED] = col[GRN] = col[BLU] = 0.0;
# Line 318 | Line 226 | register COLR  clr;
226                  col[GRN] = (clr[GRN] + 0.5)*f;
227                  col[BLU] = (clr[BLU] + 0.5)*f;
228          }
229 + }
230 +
231 +
232 + bigdiff(c1, c2, md)                     /* c1 delta c2 > md? */
233 + register COLOR  c1, c2;
234 + double  md;
235 + {
236 +        register int  i;
237 +
238 +        for (i = 0; i < 3; i++)
239 +                if (colval(c1,i)-colval(c2,i) > md*colval(c2,i) ||
240 +                        colval(c2,i)-colval(c1,i) > md*colval(c1,i))
241 +                        return(1);
242 +        return(0);
243   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines