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.3 by greg, Thu May 11 21:22:38 1989 UTC vs.
Revision 1.12 by greg, Sat Sep 22 10:45:42 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 289 | Line 197 | double  r, g, b;
197          d = r > g ? r : g;
198          if (b > d) d = b;
199  
200 <        if (d <= 0.0) {
200 >        if (d <= 1e-32) {
201                  clr[RED] = clr[GRN] = clr[BLU] = 0;
202                  clr[EXP] = 0;
203                  return;
# 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 + normcolrs(scan, len, adjust)    /* normalize a scanline of colrs */
233 + register COLR  *scan;
234 + int  len;
235 + int  adjust;
236 + {
237 +        register int  c;
238 +        register int  shift;
239 +
240 +        while (len-- > 0) {
241 +                shift = scan[0][EXP] + adjust - COLXS;
242 +                if (shift > 0) {
243 +                        if (shift > 8) {
244 +                                scan[0][RED] =
245 +                                scan[0][GRN] =
246 +                                scan[0][BLU] = 255;
247 +                        } else {
248 +                                shift--;
249 +                                c = (scan[0][RED]<<1 | 1) << shift;
250 +                                scan[0][RED] = c > 255 ? 255 : c;
251 +                                c = (scan[0][GRN]<<1 | 1) << shift;
252 +                                scan[0][GRN] = c > 255 ? 255 : c;
253 +                                c = (scan[0][BLU]<<1 | 1) << shift;
254 +                                scan[0][BLU] = c > 255 ? 255 : c;
255 +                        }
256 +                } else if (shift < 0) {
257 +                        if (shift < -8) {
258 +                                scan[0][RED] =
259 +                                scan[0][GRN] =
260 +                                scan[0][BLU] = 0;
261 +                        } else {
262 +                                shift = -1-shift;
263 +                                scan[0][RED] = ((scan[0][RED]>>shift)+1)>>1;
264 +                                scan[0][GRN] = ((scan[0][GRN]>>shift)+1)>>1;
265 +                                scan[0][BLU] = ((scan[0][BLU]>>shift)+1)>>1;
266 +                        }
267 +                }
268 +                scan[0][EXP] = COLXS - adjust;
269 +                scan++;
270 +        }
271 + }
272 +
273 +
274 + bigdiff(c1, c2, md)                     /* c1 delta c2 > md? */
275 + register COLOR  c1, c2;
276 + double  md;
277 + {
278 +        register int  i;
279 +
280 +        for (i = 0; i < 3; i++)
281 +                if (colval(c1,i)-colval(c2,i) > md*colval(c2,i) ||
282 +                        colval(c2,i)-colval(c1,i) > md*colval(c1,i))
283 +                        return(1);
284 +        return(0);
285   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines