ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/ccyrgb.c
Revision: 3.5
Committed: Wed Nov 15 18:02:52 2023 UTC (6 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Changes since 3.4: +45 -2 lines
Log Message:
feat(rpict,rtrace,rcontrib,rtpict): Hyperspectral rendering (except photon map)

File Contents

# User Rev Content
1 greg 3.1 #ifndef lint
2 greg 3.5 static const char RCSid[] = "$Id: ccyrgb.c,v 3.4 2012/05/17 17:11:33 greg Exp $";
3 greg 3.1 #endif
4     /*
5 greg 3.5 * Convert MGF color to Radiance RGB and spectral representations
6 greg 3.1 */
7    
8     #include <stdio.h>
9     #include "color.h"
10     #include "ccolor.h"
11    
12     void
13     ccy2rgb( /* convert MGF color to RGB */
14     C_COLOR *cin, /* input MGF chrominance */
15     double cieY, /* input luminance or reflectance */
16     COLOR cout /* output RGB color */
17     )
18     {
19     double d;
20     COLOR xyz;
21     /* get CIE XYZ representation */
22     c_ccvt(cin, C_CSXY);
23     d = cin->cx/cin->cy;
24     xyz[CIEX] = d * cieY;
25     xyz[CIEY] = cieY;
26     xyz[CIEZ] = (1./cin->cy - d - 1.) * cieY;
27     cie_rgb(cout, xyz);
28     }
29    
30     /* Convert RGB to MGF color and value */
31     double
32     rgb2ccy(COLOR cin, C_COLOR *cout)
33     {
34     COLOR xyz;
35     double df;
36    
37     rgb_cie(xyz, cin);
38     *cout = c_dfcolor;
39     df = xyz[CIEX] + xyz[CIEY] + xyz[CIEZ];
40     if (df <= .0)
41 greg 3.2 return(.0);
42 greg 3.1 df = 1./df;
43     cout->cx = xyz[CIEX]*df;
44     cout->cy = xyz[CIEZ]*df;
45     cout->flags = (C_CSXY|C_CDXY);
46    
47     return(xyz[CIEY]);
48     }
49 greg 3.5
50     void
51     ccy2scolor( /* convert MGF color, Y to spectral color */
52     C_COLOR *cin, /* input MGF color or spectrum */
53     double cieY, /* input luminance or reflectance */
54     SCOLOR sco /* output spectral color */
55     )
56     {
57     COLORV nf, sorig[C_CNSS];
58     int i;
59    
60     if (cin->flags & C_CDXY || NCSAMP <= 3) {
61     COLOR col; /* tristimulus in or out, so... */
62     ccy2rgb(cin, cieY, col);
63     setscolor(sco, colval(col,RED), colval(col,GRN), colval(col,BLU));
64     return;
65     }
66     c_ccvt(cin, C_CSXY);
67     nf = cieY*C_CNSS/(cin->ssum*3*cin->cy);
68     for (i = C_CNSS; i--; ) /* may as well reverse order */
69     sorig[C_CNSS-1-i] = nf*(COLORV)cin->ssamp[i];
70    
71     convertscolor(sco, NCSAMP, WLPART[0], WLPART[3],
72     sorig, C_CNSS, C_CMAXWL+.5*C_CWLI, C_CMINWL-.5*C_CWLI);
73     }
74    
75     /* Convert spectral color to MGF color and Y value */
76     double
77     scolor2ccy(SCOLOR sci, C_COLOR *cout)
78     {
79     float hinc, cspec[MAXCSAMP];
80     int i = NCSAMP;
81    
82     if (i <= 3) /* defined as RGB, so... */
83     return(rgb2ccy(sci, cout));
84    
85     while (i-- > 0) /* need to reverse array */
86     cspec[i] = sci[NCSAMP-1-i];
87    
88     hinc = (WLPART[0]-WLPART[3])/(float)(2*NCSAMP);
89    
90     return(c_sset(cout, WLPART[3]+hinc, WLPART[0]-hinc, cspec, NCSAMP));
91     }