ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/ccolor.h
Revision: 3.10
Committed: Thu Jan 4 01:55:42 2024 UTC (4 months, 1 week ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Changes since 3.9: +3 -1 lines
Log Message:
feat(mgf2rad): Now handles spectral color translation

File Contents

# User Rev Content
1 greg 3.10 /* RCSid $Id: ccolor.h,v 3.9 2023/11/15 18:02:52 greg Exp $ */
2 greg 3.1 /*
3     * Header file for spectral colors.
4     *
5     */
6    
7     #ifndef _MGF_COLOR_H_
8     #define _MGF_COLOR_H_
9     #ifdef __cplusplus
10     extern "C" {
11     #endif
12    
13     #define C_CMINWL 380 /* minimum wavelength */
14     #define C_CMAXWL 780 /* maximum wavelength */
15     #define C_CNSS 41 /* number of spectral samples */
16     #define C_CWLI ((C_CMAXWL-C_CMINWL)/(C_CNSS-1))
17     #define C_CMAXV 10000 /* nominal maximum sample value */
18     #define C_CLPWM (683./C_CMAXV) /* peak lumens/watt multiplier */
19    
20     #define C_CSSPEC 01 /* flag if spectrum is set */
21     #define C_CDSPEC 02 /* flag if defined w/ spectrum */
22     #define C_CSXY 04 /* flag if xy is set */
23     #define C_CDXY 010 /* flag if defined w/ xy */
24     #define C_CSEFF 020 /* flag if efficacy set */
25    
26     typedef struct {
27     int clock; /* incremented each change */
28     void *client_data; /* pointer to private client-owned data */
29     short flags; /* what's been set and how */
30     short ssamp[C_CNSS]; /* spectral samples, min wl to max */
31     long ssum; /* straight sum of spectral values */
32     float cx, cy; /* xy chromaticity value */
33     float eff; /* efficacy (lumens/watt) */
34     } C_COLOR;
35    
36 greg 3.7 typedef unsigned short C_CHROMA; /* encoded (x,y) chromaticity */
37    
38 greg 3.1 #define C_DEFCOLOR { 1, NULL, C_CDXY|C_CSXY|C_CSSPEC|C_CSEFF,\
39     {C_CMAXV,C_CMAXV,C_CMAXV,C_CMAXV,C_CMAXV,\
40     C_CMAXV,C_CMAXV,C_CMAXV,C_CMAXV,C_CMAXV,C_CMAXV,\
41     C_CMAXV,C_CMAXV,C_CMAXV,C_CMAXV,C_CMAXV,C_CMAXV,\
42     C_CMAXV,C_CMAXV,C_CMAXV,C_CMAXV,C_CMAXV,C_CMAXV,\
43     C_CMAXV,C_CMAXV,C_CMAXV,C_CMAXV,C_CMAXV,C_CMAXV,\
44     C_CMAXV,C_CMAXV,C_CMAXV,C_CMAXV,C_CMAXV,C_CMAXV,\
45     C_CMAXV,C_CMAXV,C_CMAXV,C_CMAXV,C_CMAXV,C_CMAXV},\
46     (long)C_CNSS*C_CMAXV, 1./3., 1./3., 178.006 }
47    
48 greg 3.9 #define c_cval(c,l) ((c)->ssamp[((l)+(.5*C_CWLI-C_MINWL))/C_CWLI] \
49 greg 3.4 / (double)(c)->ssum)
50 greg 3.1
51 greg 3.6 extern const C_COLOR c_dfcolor; /* default color */
52 greg 3.8 extern const C_CHROMA c_dfchroma; /* c_encodeChroma(&c_dfcolor) */
53 greg 3.6
54     extern const C_COLOR c_x31, c_y31, c_z31; /* 1931 standard observer */
55 greg 3.1
56 greg 3.4 /* set CIE (x,y) chromaticity */
57     #define c_cset(c,x,y) ((c)->cx=(x),(c)->cy=(y),(c)->flags=C_CDXY|C_CSXY)
58    
59     /* set black body spectrum */
60     extern int c_bbtemp(C_COLOR *clr, double tk);
61 greg 3.3 /* assign arbitrary spectrum */
62     extern double c_sset(C_COLOR *clr, double wlmin, double wlmax,
63     const float spec[], int nwl);
64     extern void c_ccvt(C_COLOR *clr, int fl); /* fix color representation */
65 greg 3.10 /* are colors equivalent? */
66     extern int c_equiv(C_COLOR *c1, C_COLOR *c2);
67 greg 3.3 extern int c_isgrey(C_COLOR *clr); /* check if color is grey */
68 greg 3.1 /* mix two colors */
69     extern void c_cmix(C_COLOR *cres, double w1, C_COLOR *c1,
70     double w2, C_COLOR *c2);
71 greg 3.2 /* multiply two colors */
72     extern double c_cmult(C_COLOR *cres, C_COLOR *c1, double y1,
73     C_COLOR *c2, double y2);
74 greg 3.5 /* convert to sharpened RGB */
75     extern void c_toSharpRGB(C_COLOR *cin, double cieY, float cout[3]);
76     /* convert from sharpened RGB */
77     extern double c_fromSharpRGB(float cin[3], C_COLOR *cout);
78 greg 3.7 /* encode (x,y) chromaticity */
79     extern C_CHROMA c_encodeChroma(C_COLOR *clr);
80     /* decode (x,y) chromaticity */
81     extern void c_decodeChroma(C_COLOR *cres, C_CHROMA ccode);
82 greg 3.5
83 greg 3.9 #ifdef _RAD_COLOR_H_
84     /* The following four routines are defined in ccyrgb.c */
85 greg 3.1 /* convert to RGB color */
86 greg 3.9 extern void ccy2rgb(C_COLOR *cin, double cieY, COLOR cout);
87 greg 3.1 /* convert from RGB color */
88 greg 3.9 extern double rgb2ccy(COLOR cin, C_COLOR *cout);
89     /* convert to spectral color */
90     extern void ccy2scolor(C_COLOR *cin, double cieY, SCOLOR sco);
91     /* convert from spectral color */
92     extern double scolor2ccy(SCOLOR sci, C_COLOR *cout);
93    
94     #endif /* _RAD_COLOR_H_ */
95 greg 3.1
96     #ifdef __cplusplus
97     }
98     #endif
99     #endif /* _MGF_COLOR_H_ */