ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/color.h
Revision: 2.38
Committed: Wed Nov 15 18:02:52 2023 UTC (5 months, 3 weeks ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.37: +156 -15 lines
Log Message:
feat(rpict,rtrace,rcontrib,rtpict): Hyperspectral rendering (except photon map)

File Contents

# User Rev Content
1 greg 2.38 /* RCSid $Id: color.h,v 2.X in progress $ */
2 greg 1.1 /*
3 greg 2.38 * color.h - header for routines using pixel color and spectral values
4 greg 1.1 *
5     * Two color representations are used, one for calculation and
6     * another for storage. Calculation is done with three floats
7     * for speed. Stored color values use 4 bytes which contain
8     * three single byte mantissas and a common exponent.
9 greg 2.38 *
10     * Spectral colors have between 3 and MAXCSAMP samples, and cover
11     * wavelengths from WLPART[0] to WLPART[3] (max to min nanometers).
12     * Wavelengths WLPART[1] and WLPART[2] mark the separation
13     * of red/green and green/blue intervals, respectively.
14     * The wavelength range may go well beyond visible in either
15     * direction, but some routines will average over each interval
16     * and designate the means as R, G, and B, regardless.
17     * The number of samples is set in CNDX[3], and CNDX[0,1,2]
18     * give peak wavelength indices corresponding to stdprims.
19     * For best accuracy, internal calculations are promoted to
20     * the current number of samples and final conversions
21     * to tristimulus should use scolor_rgb() or scolor_cie().
22     *
23     * A new Radiance format is provided for spectral pictures,
24     * and spectral colors must be converted by caller using
25     * convertscolor() if the sampling doesn't match.
26 greg 1.1 */
27 schorsch 2.21 #ifndef _RAD_COLOR_H_
28     #define _RAD_COLOR_H_
29 schorsch 2.25
30 greg 2.33 #include <stdio.h>
31 schorsch 2.25 #include <stdlib.h>
32 greg 2.38 #include <string.h>
33 schorsch 2.25
34 schorsch 2.21 #ifdef __cplusplus
35     extern "C" {
36     #endif
37 greg 2.18
38 greg 2.38 #ifndef MAXCSAMP
39     #define MAXCSAMP 24 /* maximum # spectral samples */
40     #endif
41    
42 greg 1.1 #define RED 0
43     #define GRN 1
44     #define BLU 2
45 greg 2.10 #define CIEX 0 /* or, if input is XYZ... */
46     #define CIEY 1
47     #define CIEZ 2
48     #define EXP 3 /* exponent same for either format */
49 greg 1.1 #define COLXS 128 /* excess used for exponent */
50 greg 2.10 #define WHT 3 /* used for RGBPRIMS type */
51 greg 1.1
52 greg 2.31 #undef uby8
53     #define uby8 unsigned char /* 8-bit unsigned integer */
54 greg 1.1
55 greg 2.31 typedef uby8 COLR[4]; /* red, green, blue (or X,Y,Z), exponent */
56 greg 2.38 typedef uby8 SCOLR[MAXCSAMP+1]; /* spectral color, common exponent */
57 greg 1.1
58 schorsch 2.28 typedef float COLORV;
59     typedef COLORV COLOR[3]; /* red, green, blue (or X,Y,Z) */
60 greg 2.38 typedef COLORV SCOLOR[MAXCSAMP]; /* spectral color */
61 greg 2.10
62     typedef float RGBPRIMS[4][2]; /* (x,y) chromaticities for RGBW */
63     typedef float (*RGBPRIMP)[2]; /* pointer to RGBPRIMS array */
64    
65     typedef float COLORMAT[3][3]; /* color coordinate conversion matrix */
66    
67 greg 1.1 #define copycolr(c1,c2) (c1[0]=c2[0],c1[1]=c2[1], \
68     c1[2]=c2[2],c1[3]=c2[3])
69    
70 greg 2.38 #define colval(col,pri) (col)[pri]
71 greg 1.1
72     #define setcolor(col,r,g,b) ((col)[RED]=(r),(col)[GRN]=(g),(col)[BLU]=(b))
73    
74 greg 2.38 #define scalecolor(col,sf) ((col)[0]*=(sf),(col)[1]*=(sf),(col)[2]*=(sf))
75    
76     #define opcolor(c1,op,c2) ((c1)[0]op(c2)[0],(c1)[1]op(c2)[1],(c1)[2]op(c2)[2])
77    
78     #define copycolor(c1,c2) opcolor(c1,=,c2)
79    
80     #define addcolor(c1,c2) opcolor(c1,+=,c2)
81    
82     #define multcolor(c1,c2) opcolor(c1,*=,c2)
83    
84     #define NCSAMP CNDX[EXP] /* current number of spectral samples */
85     #define LSCOLR (NCSAMP+1)
86    
87     #define copyscolr(sc1,sc2) memcpy(sc1,sc2,LSCOLR)
88    
89     #define scolval(sc,pri) (sc)[CNDX[pri]]
90    
91     #define copyscolor(sc1,sc2) memcpy(sc1,sc2,sizeof(COLORV)*NCSAMP)
92    
93     #define scalescolor(sc,sf) {const float _f=sf; int _i=NCSAMP; \
94     while (_i--) (sc)[_i] *= _f;}
95    
96     /* faster, use principal colors for RGB */
97     #define pcolor_color(col,scol) setcolor(col,scolval(scol,RED),\
98     scolval(scol,GRN),scolval(scol,BLU))
99     #define pcolor_colr(clr,scol) setcolr(clr,scolval(scol,RED),\
100     scolval(scol,GRN),scolval(scol,BLU))
101    
102     #define sopscolor(sc1,op,sc2) {int _i=NCSAMP; while (_i--) (sc1)[_i] op (sc2)[_i];}
103    
104     #define saddscolor(sc1,sc2) sopscolor(sc1,+=,sc2)
105    
106     #define smultscolor(sc1,sc2) sopscolor(sc1,*=,sc2)
107    
108     #define scolrblack(c) memset(c,0,LSCOLR)
109 greg 1.1
110 greg 2.38 #define scolorblack(c) memset(c,0,sizeof(COLORV)*MAXCSAMP)
111    
112     #define scolor_color(col,scol) scolor2color(col,scol,NCSAMP,WLPART)
113     #define scolor_colr(clr,scol) scolor2colr(clr,scol,NCSAMP,WLPART)
114     #define scolor_scolr(sclr,scol) scolor2scolr(sclr,scol,NCSAMP)
115     #define scolr_scolor(scol,sclr) scolr2scolor(scol,sclr,NCSAMP)
116     #define scolr_color(col,sclr) scolr2color(col,sclr,NCSAMP,WLPART)
117    
118     #define sopcolor(sc1,op,c2) {SCOLOR _sct;\
119     setscolor(_sct,c2[RED],c2[GRN],c2[BLU]);\
120     sopscolor(sc1,op,_sct);}
121    
122     #define saddcolor(sc1,c2) sopcolor(sc1,+=,c2)
123    
124     #define smultcolor(sc1,c2) sopcolor(sc1,*=,c2)
125    
126     #define opscolor(c1,op,sc2) {COLOR _ct; scolor_color(_ct,sc2);\
127     opcolor(c1,op,_ct);}
128 greg 1.1
129 greg 2.38 #define addscolor(c1,sc2) opscolor(c1,+=,sc2)
130 greg 1.1
131 greg 2.38 #define multscolor(c1,sc2) opscolor(c1,*=,sc2)
132 greg 1.1
133 greg 2.35 #if defined(NTSC_RGB)
134 greg 2.7 #define CIE_x_r 0.670 /* standard NTSC primaries */
135     #define CIE_y_r 0.330
136     #define CIE_x_g 0.210
137     #define CIE_y_g 0.710
138     #define CIE_x_b 0.140
139     #define CIE_y_b 0.080
140 greg 2.35 #define CIE_x_w (1./3.) /* use EE white */
141     #define CIE_y_w (1./3.)
142     #elif defined(SHARP_RGB)
143     #define CIE_x_r 0.6898 /* "sharp" RGB primaries */
144     #define CIE_y_r 0.3206
145     #define CIE_x_g 0.0736
146     #define CIE_y_g 0.9003
147     #define CIE_x_b 0.1166
148     #define CIE_y_b 0.0374
149     #define CIE_x_w (1./3.) /* use EE white */
150 greg 2.34 #define CIE_y_w (1./3.)
151 greg 1.7 #else
152 greg 2.7 #define CIE_x_r 0.640 /* nominal CRT primaries */
153     #define CIE_y_r 0.330
154     #define CIE_x_g 0.290
155     #define CIE_y_g 0.600
156     #define CIE_x_b 0.150
157     #define CIE_y_b 0.060
158 greg 2.35 #define CIE_x_w (1./3.) /* use EE white */
159 greg 2.34 #define CIE_y_w (1./3.)
160 greg 1.7 #endif
161 greg 2.7
162 greg 2.14 #define STDPRIMS {{CIE_x_r,CIE_y_r},{CIE_x_g,CIE_y_g}, \
163     {CIE_x_b,CIE_y_b},{CIE_x_w,CIE_y_w}}
164 greg 2.10
165 greg 2.7 #define CIE_D ( CIE_x_r*(CIE_y_g - CIE_y_b) + \
166     CIE_x_g*(CIE_y_b - CIE_y_r) + \
167     CIE_x_b*(CIE_y_r - CIE_y_g) )
168     #define CIE_C_rD ( (1./CIE_y_w) * \
169     ( CIE_x_w*(CIE_y_g - CIE_y_b) - \
170     CIE_y_w*(CIE_x_g - CIE_x_b) + \
171     CIE_x_g*CIE_y_b - CIE_x_b*CIE_y_g ) )
172     #define CIE_C_gD ( (1./CIE_y_w) * \
173     ( CIE_x_w*(CIE_y_b - CIE_y_r) - \
174     CIE_y_w*(CIE_x_b - CIE_x_r) - \
175     CIE_x_r*CIE_y_b + CIE_x_b*CIE_y_r ) )
176     #define CIE_C_bD ( (1./CIE_y_w) * \
177     ( CIE_x_w*(CIE_y_r - CIE_y_g) - \
178     CIE_y_w*(CIE_x_r - CIE_x_g) + \
179     CIE_x_r*CIE_y_g - CIE_x_g*CIE_y_r ) )
180    
181     #define CIE_rf (CIE_y_r*CIE_C_rD/CIE_D)
182     #define CIE_gf (CIE_y_g*CIE_C_gD/CIE_D)
183     #define CIE_bf (CIE_y_b*CIE_C_bD/CIE_D)
184    
185 greg 2.35 /* Default CIE_rf=.265074126, CIE_gf=.670114631 and CIE_bf=.064811243 */
186 greg 2.9
187 greg 2.38 /***** The following definitions are not for XYZ colors *****/
188 greg 2.10
189 greg 2.7 #define bright(col) (CIE_rf*(col)[RED]+CIE_gf*(col)[GRN]+CIE_bf*(col)[BLU])
190 greg 2.38 #define pbright(col) (CIE_rf*scolval(col,RED) + CIE_gf*scolval(col,GRN) + \
191     CIE_bf*scolval(col,BLU))
192 greg 2.7 #define normbright(c) ( ( (long)(CIE_rf*256.+.5)*(c)[RED] + \
193     (long)(CIE_gf*256.+.5)*(c)[GRN] + \
194     (long)(CIE_bf*256.+.5)*(c)[BLU] ) >> 8 )
195 greg 2.38 #define normpbright(c) ( ( (long)(CIE_rf*256.+.5)*(c)[CNDX[RED]] + \
196     (long)(CIE_gf*256.+.5)*(c)[CNDX[GRN]] + \
197     (long)(CIE_bf*256.+.5)*(c)[CNDX[BLU]] ) >> 8 )
198 greg 1.1
199 greg 1.14 /* luminous efficacies over visible spectrum */
200     #define MAXEFFICACY 683. /* defined maximum at 550 nm */
201 greg 2.38 #define WHTEFFICACY 179. /* equal energy white 380-780nm */
202 greg 1.14 #define D65EFFICACY 203. /* standard illuminant D65 */
203     #define INCEFFICACY 160. /* illuminant A (incand.) */
204     #define SUNEFFICACY 208. /* illuminant B (solar dir.) */
205 greg 2.27 #define SKYEFFICACY D65EFFICACY /* skylight (should be 110) */
206 greg 1.14 #define DAYEFFICACY D65EFFICACY /* combined sky and solar */
207 greg 2.38 #define WHTSCOTOPIC 412. /* scotopic EE white 380-780nm */
208     #define WHTMELANOPIC 179. /* melanopic EE white 380-780nm */
209 greg 1.14
210     #define luminance(col) (WHTEFFICACY * bright(col))
211 greg 2.38 #define pluminance(scol) (WHTEFFICACY * pbright(scol))
212    
213     #define scolor_rgb(col,scol) scolor2rgb(col,scol,NCSAMP,WLPART)
214 greg 1.9
215 greg 2.10 /***** ...end of stuff specific to RGB colors *****/
216    
217 greg 2.38 #define scolor_cie(col,scol) scolor2cie(col,scol,NCSAMP,WLPART)
218    
219     #define sluminance(scol) (WHTEFFICACY * scolor_photopic(scol))
220    
221 greg 1.1 #define intens(col) ( (col)[0] > (col)[1] \
222     ? (col)[0] > (col)[2] ? (col)[0] : (col)[2] \
223     : (col)[1] > (col)[2] ? (col)[1] : (col)[2] )
224    
225 greg 1.3 #define colrval(c,p) ( (c)[EXP] ? \
226     ldexp((c)[p]+.5,(int)(c)[EXP]-(COLXS+8)) : \
227     0. )
228    
229 greg 2.38 #define scolrval(c,p) ( (c)[CNDX[EXP]] ? \
230     ldexp((c)[CNDX[p]]+.5,(int)(c)[CNDX[EXP]]-(COLXS+8)) : \
231     0. )
232    
233 greg 1.1 #define WHTCOLOR {1.0,1.0,1.0}
234     #define BLKCOLOR {0.0,0.0,0.0}
235     #define WHTCOLR {128,128,128,COLXS+1}
236     #define BLKCOLR {0,0,0,0}
237 greg 1.3
238 greg 1.11 /* picture format identifier */
239     #define COLRFMT "32-bit_rle_rgbe"
240 greg 2.10 #define CIEFMT "32-bit_rle_xyze"
241     #define PICFMT "32-bit_rle_???e" /* matches either */
242 greg 2.38 #define SPECFMT "Radiance_rle_spectra" /* spectral data w/ exponent */
243     #define LPICFMT 21 /* max format id len */
244    
245     /* Number of spectral components */
246     #define NCOMPSTR "NCOMP="
247     #define LNCOMPSTR 6
248     #define isncomp(hl) (!strncmp(hl,NCOMPSTR,LNCOMPSTR))
249     #define ncompval(hl) atoi((hl)+LNCOMPSTR)
250     #define fputncomp(nc,fp) fprintf(fp,"%s%d\n",NCOMPSTR,nc)
251    
252     /* 4 wavelength partitions for (IR+)R,G,B(+UV) */
253     #define WLSPLTSTR "WAVELENGTH_SPLITS="
254     #define LWLSPLTSTR 18
255     #define iswlsplit(hl) (!strncmp(hl,WLSPLTSTR,LWLSPLTSTR))
256     #define wlsplitval(w,hl) (sscanf((hl)+LWLSPLTSTR,"%f %f %f %f",\
257     &(w)[0],&(w)[1],&(w)[2],&(w)[3]) == 4)
258     #define fputwlsplit(w,fp) fprintf(fp,"%s %f %f %f %f\n",WLSPLTSTR,\
259     (w)[0],(w)[1],(w)[2],(w)[3])
260 greg 1.11
261 greg 1.6 /* macros for exposures */
262 greg 1.5 #define EXPOSSTR "EXPOSURE="
263 greg 1.12 #define LEXPOSSTR 9
264     #define isexpos(hl) (!strncmp(hl,EXPOSSTR,LEXPOSSTR))
265     #define exposval(hl) atof((hl)+LEXPOSSTR)
266 greg 2.37 #define fputexpos(ex,fp) fprintf(fp,"%s%.4e\n",EXPOSSTR,ex)
267 greg 1.6
268     /* macros for pixel aspect ratios */
269     #define ASPECTSTR "PIXASPECT="
270 greg 1.12 #define LASPECTSTR 10
271     #define isaspect(hl) (!strncmp(hl,ASPECTSTR,LASPECTSTR))
272     #define aspectval(hl) atof((hl)+LASPECTSTR)
273 greg 1.6 #define fputaspect(pa,fp) fprintf(fp,"%s%f\n",ASPECTSTR,pa)
274 greg 1.5
275 greg 2.10 /* macros for primary specifications */
276     #define PRIMARYSTR "PRIMARIES="
277     #define LPRIMARYSTR 10
278     #define isprims(hl) (!strncmp(hl,PRIMARYSTR,LPRIMARYSTR))
279 greg 2.32 #define primsval(p,hl) (sscanf((hl)+LPRIMARYSTR, \
280 greg 2.10 "%f %f %f %f %f %f %f %f", \
281     &(p)[RED][CIEX],&(p)[RED][CIEY], \
282     &(p)[GRN][CIEX],&(p)[GRN][CIEY], \
283     &(p)[BLU][CIEX],&(p)[BLU][CIEY], \
284 greg 2.32 &(p)[WHT][CIEX],&(p)[WHT][CIEY]) == 8)
285 greg 2.10 #define fputprims(p,fp) fprintf(fp, \
286     "%s %.4f %.4f %.4f %.4f %.4f %.4f %.4f %.4f\n",\
287     PRIMARYSTR, \
288     (p)[RED][CIEX],(p)[RED][CIEY], \
289     (p)[GRN][CIEX],(p)[GRN][CIEY], \
290     (p)[BLU][CIEX],(p)[BLU][CIEY], \
291     (p)[WHT][CIEX],(p)[WHT][CIEY])
292    
293 greg 1.8 /* macros for color correction */
294     #define COLCORSTR "COLORCORR="
295 greg 1.12 #define LCOLCORSTR 10
296     #define iscolcor(hl) (!strncmp(hl,COLCORSTR,LCOLCORSTR))
297 greg 2.30 #define colcorval(cc,hl) sscanf((hl)+LCOLCORSTR,"%f %f %f", \
298 greg 1.8 &(cc)[RED],&(cc)[GRN],&(cc)[BLU])
299     #define fputcolcor(cc,fp) fprintf(fp,"%s %f %f %f\n",COLCORSTR, \
300     (cc)[RED],(cc)[GRN],(cc)[BLU])
301 greg 2.6
302 greg 2.10 /*
303     * Conversions to and from XYZ space generally don't apply WHTEFFICACY.
304     * If you need Y to be luminance (cd/m^2), this must be applied when
305     * converting from radiance (watts/sr/m^2).
306     */
307    
308 greg 2.38 extern int CNDX[4]; /* RGBE indices for SCOLOR, SCOLR */
309     extern float WLPART[4]; /* RGB wavelength limits+partitions (nm) */
310 greg 2.18 extern RGBPRIMS stdprims; /* standard primary chromaticities */
311 greg 2.38 extern RGBPRIMS xyzprims; /* to indicate XYZ input or output */
312 greg 2.18 extern COLORMAT rgb2xyzmat; /* RGB to XYZ conversion matrix */
313     extern COLORMAT xyz2rgbmat; /* XYZ to RGB conversion matrix */
314     extern COLOR cblack, cwhite; /* black (0,0,0) and white (1,1,1) */
315 greg 2.10
316 greg 2.13 #define CGAMUT_LOWER 01
317     #define CGAMUT_UPPER 02
318     #define CGAMUT (CGAMUT_LOWER|CGAMUT_UPPER)
319    
320     #define rgb_cie(xyz,rgb) colortrans(xyz,rgb2xyzmat,rgb)
321 greg 2.10
322 greg 2.20 #define cpcolormat(md,ms) memcpy((void *)md,(void *)ms,sizeof(COLORMAT))
323 greg 2.18
324     /* defined in color.c */
325 greg 2.38 extern void *tempbuffer(size_t len);
326     /* in cn[3]=nsamps, wlpt[0],wlpt[3]=extrema */
327     extern int setspectrsamp(int cn[4], float wlpt[4]);
328 greg 2.18 extern int fwritecolrs(COLR *scanline, int len, FILE *fp);
329 greg 2.38 extern int fwritescan(COLOR *scanline, int len, FILE *fp);
330     extern int fwritescolrs(uby8 *sscanline, int len, FILE *fp);
331     extern int fwritesscan(COLORV *sscanline, int len, FILE *fp);
332 greg 2.18 extern int freadcolrs(COLR *scanline, int len, FILE *fp);
333     extern int freadscan(COLOR *scanline, int len, FILE *fp);
334 greg 2.38 extern int freadscolrs(uby8 *scanline, int nc, int len, FILE *fp);
335     extern int freadsscan(COLORV *sscanline, int nc, int len, FILE *fp);
336     /* spectrum conversion, zero-fill past ends */
337     extern void convertscolor(SCOLOR dst, int dnc, double dwl0, double dwl1,
338     const COLORV src[], int snc, double swl0, double swl1);
339     /* the following use avg spectral ranges */
340     /* compare scolor_rgb() and scolor_cie() */
341     /* also, pcolor_color() and pcolor_colr() */
342     extern void setscolor(SCOLOR scol, double r, double g, double b);
343     extern void scolor2color(COLOR col, SCOLOR scol, int ncs, float wlpt[4]);
344     extern void scolor2colr(COLR clr, SCOLOR scol, int ncs, float wlpt[4]);
345     extern void scolor2scolr(SCOLR sclr, SCOLOR scol, int ncs);
346     extern void colr_color(COLOR col, COLR clr);
347     extern void scolr2scolor(SCOLOR scol, SCOLR sclr, int ncs);
348     extern void scolr2color(COLOR col, SCOLR sclr, int ncs, float wlpt[4]);
349     extern void colr_scolor(SCOLOR scol, COLR clr);
350 greg 2.18 extern void setcolr(COLR clr, double r, double g, double b);
351 greg 2.38 extern void setscolr(SCOLR sclr, double r, double g, double b);
352     extern double scolor_mean(SCOLOR scol);
353     extern double sintens(SCOLOR scol);
354 greg 2.18 extern int bigdiff(COLOR c1, COLOR c2, double md);
355 greg 2.38 extern int sbigsdiff(SCOLOR sc1, SCOLOR sc2, double md);
356 greg 2.18 /* defined in spec_rgb.c */
357 greg 2.38 extern void spec_cie(COLOR col, int s, int e);
358 greg 2.18 extern void spec_rgb(COLOR col, int s, int e);
359     extern void cie_rgb(COLOR rgb, COLOR xyz);
360     extern int clipgamut(COLOR col, double brt, int gamut,
361     COLOR lower, COLOR upper);
362     extern void colortrans(COLOR c2, COLORMAT mat, COLOR c1);
363     extern void multcolormat(COLORMAT m3, COLORMAT m2,
364     COLORMAT m1);
365 greg 2.29 extern int colorprimsOK(RGBPRIMS pr);
366     extern int compxyz2rgbmat(COLORMAT mat, RGBPRIMS pr);
367     extern int comprgb2xyzmat(COLORMAT mat, RGBPRIMS pr);
368     extern int comprgb2rgbmat(COLORMAT mat, RGBPRIMS pr1, RGBPRIMS pr2);
369     extern int compxyzWBmat(COLORMAT mat, float wht1[2],
370 greg 2.18 float wht2[2]);
371 greg 2.29 extern int compxyz2rgbWBmat(COLORMAT mat, RGBPRIMS pr);
372     extern int comprgb2xyzWBmat(COLORMAT mat, RGBPRIMS pr);
373     extern int comprgb2rgbWBmat(COLORMAT mat, RGBPRIMS pr1, RGBPRIMS pr2);
374 greg 2.38 /* most accurate spectral->tristim */
375     extern void scolor2cie(COLOR col, SCOLOR scol, int ncs, float wlpt[4]);
376     extern void scolor2rgb(COLOR col, SCOLOR scol, int ncs, float wlpt[4]);
377     extern double scolor_photopic(SCOLOR scol);
378     extern double scolor_scotopic(SCOLOR scol);
379     extern double scolor_melanopic(SCOLOR scol);
380 greg 2.18 /* defined in colrops.c */
381 schorsch 2.26 extern int setcolrcor(double (*f)(double, double), double a2);
382     extern int setcolrinv(double (*f)(double, double), double a2);
383 greg 2.18 extern int setcolrgam(double g);
384     extern int colrs_gambs(COLR *scan, int len);
385     extern int gambs_colrs(COLR *scan, int len);
386     extern void shiftcolrs(COLR *scan, int len, int adjust);
387     extern void normcolrs(COLR *scan, int len, int adjust);
388    
389     #ifdef __cplusplus
390     }
391 greg 2.6 #endif
392 schorsch 2.21 #endif /* _RAD_COLOR_H_ */
393