Back to index

radiance  4R0+20100331
color.h
Go to the documentation of this file.
00001 /* RCSid $Id: color.h,v 2.30 2009/05/21 18:08:43 greg Exp $ */
00002 /*
00003  *  color.h - header for routines using pixel color values.
00004  *
00005  *  Must be included after X11 headers, since they declare a BYTE type.
00006  *
00007  *  Two color representations are used, one for calculation and
00008  *  another for storage.  Calculation is done with three floats
00009  *  for speed.  Stored color values use 4 bytes which contain
00010  *  three single byte mantissas and a common exponent.
00011  */
00012 #ifndef _RAD_COLOR_H_
00013 #define _RAD_COLOR_H_
00014 
00015 #include <stdlib.h>
00016 
00017 #ifdef __cplusplus
00018 extern "C" {
00019 #endif
00020 
00021 #define  RED         0
00022 #define  GRN         1
00023 #define  BLU         2
00024 #define  CIEX        0      /* or, if input is XYZ... */
00025 #define  CIEY        1
00026 #define  CIEZ        2
00027 #define  EXP         3      /* exponent same for either format */
00028 #define  COLXS              128    /* excess used for exponent */
00029 #define  WHT         3      /* used for RGBPRIMS type */
00030 
00031 #undef  BYTE
00032 #define  BYTE        unsigned char /* 8-bit unsigned integer */
00033 
00034 typedef BYTE  COLR[4];             /* red, green, blue (or X,Y,Z), exponent */
00035 
00036 typedef float COLORV;
00037 typedef COLORV  COLOR[3];   /* red, green, blue (or X,Y,Z) */
00038 
00039 typedef float  RGBPRIMS[4][2];     /* (x,y) chromaticities for RGBW */
00040 typedef float  (*RGBPRIMP)[2];     /* pointer to RGBPRIMS array */
00041 
00042 typedef float  COLORMAT[3][3];     /* color coordinate conversion matrix */
00043 
00044 #define  copycolr(c1,c2)    (c1[0]=c2[0],c1[1]=c2[1], \
00045                             c1[2]=c2[2],c1[3]=c2[3])
00046 
00047 #define  colval(col,pri)    ((col)[pri])
00048 
00049 #define  setcolor(col,r,g,b)       ((col)[RED]=(r),(col)[GRN]=(g),(col)[BLU]=(b))
00050 
00051 #define  copycolor(c1,c2)   ((c1)[0]=(c2)[0],(c1)[1]=(c2)[1],(c1)[2]=(c2)[2])
00052 
00053 #define  scalecolor(col,sf) ((col)[0]*=(sf),(col)[1]*=(sf),(col)[2]*=(sf))
00054 
00055 #define  addcolor(c1,c2)    ((c1)[0]+=(c2)[0],(c1)[1]+=(c2)[1],(c1)[2]+=(c2)[2])
00056 
00057 #define  multcolor(c1,c2)   ((c1)[0]*=(c2)[0],(c1)[1]*=(c2)[1],(c1)[2]*=(c2)[2])
00058 
00059 #ifdef  NTSC
00060 #define  CIE_x_r            0.670         /* standard NTSC primaries */
00061 #define  CIE_y_r            0.330
00062 #define  CIE_x_g            0.210
00063 #define  CIE_y_g            0.710
00064 #define  CIE_x_b            0.140
00065 #define  CIE_y_b            0.080
00066 #define  CIE_x_w            0.3333        /* use true white */
00067 #define  CIE_y_w            0.3333
00068 #else
00069 #define  CIE_x_r            0.640         /* nominal CRT primaries */
00070 #define  CIE_y_r            0.330
00071 #define  CIE_x_g            0.290
00072 #define  CIE_y_g            0.600
00073 #define  CIE_x_b            0.150
00074 #define  CIE_y_b            0.060
00075 #define  CIE_x_w            0.3333        /* use true white */
00076 #define  CIE_y_w            0.3333
00077 #endif
00078 
00079 #define  STDPRIMS    {{CIE_x_r,CIE_y_r},{CIE_x_g,CIE_y_g}, \
00080                             {CIE_x_b,CIE_y_b},{CIE_x_w,CIE_y_w}}
00081 
00082 #define CIE_D        (      CIE_x_r*(CIE_y_g - CIE_y_b) + \
00083                             CIE_x_g*(CIE_y_b - CIE_y_r) + \
00084                             CIE_x_b*(CIE_y_r - CIE_y_g) )
00085 #define CIE_C_rD     ( (1./CIE_y_w) * \
00086                             ( CIE_x_w*(CIE_y_g - CIE_y_b) - \
00087                               CIE_y_w*(CIE_x_g - CIE_x_b) + \
00088                               CIE_x_g*CIE_y_b - CIE_x_b*CIE_y_g       ) )
00089 #define CIE_C_gD     ( (1./CIE_y_w) * \
00090                             ( CIE_x_w*(CIE_y_b - CIE_y_r) - \
00091                               CIE_y_w*(CIE_x_b - CIE_x_r) - \
00092                               CIE_x_r*CIE_y_b + CIE_x_b*CIE_y_r       ) )
00093 #define CIE_C_bD     ( (1./CIE_y_w) * \
00094                             ( CIE_x_w*(CIE_y_r - CIE_y_g) - \
00095                               CIE_y_w*(CIE_x_r - CIE_x_g) + \
00096                               CIE_x_r*CIE_y_g - CIE_x_g*CIE_y_r       ) )
00097 
00098 #define CIE_rf              (CIE_y_r*CIE_C_rD/CIE_D)
00099 #define CIE_gf              (CIE_y_g*CIE_C_gD/CIE_D)
00100 #define CIE_bf              (CIE_y_b*CIE_C_bD/CIE_D)
00101 
00102 /* As of 9-94, CIE_rf=.265074126, CIE_gf=.670114631 and CIE_bf=.064811243 */
00103 
00104 /***** The following definitions are valid for RGB colors only... *****/
00105 
00106 #define  bright(col) (CIE_rf*(col)[RED]+CIE_gf*(col)[GRN]+CIE_bf*(col)[BLU])
00107 #define  normbright(c)      ( ( (long)(CIE_rf*256.+.5)*(c)[RED] + \
00108                          (long)(CIE_gf*256.+.5)*(c)[GRN] + \
00109                          (long)(CIE_bf*256.+.5)*(c)[BLU] ) >> 8 )
00110 
00111                             /* luminous efficacies over visible spectrum */
00112 #define  MAXEFFICACY        683.          /* defined maximum at 550 nm */
00113 #define  WHTEFFICACY        179.          /* uniform white light */
00114 #define  D65EFFICACY        203.          /* standard illuminant D65 */
00115 #define  INCEFFICACY        160.          /* illuminant A (incand.) */
00116 #define  SUNEFFICACY        208.          /* illuminant B (solar dir.) */
00117 #define  SKYEFFICACY        D65EFFICACY   /* skylight (should be 110) */
00118 #define  DAYEFFICACY        D65EFFICACY   /* combined sky and solar */
00119 
00120 #define  luminance(col)            (WHTEFFICACY * bright(col))
00121 
00122 /***** ...end of stuff specific to RGB colors *****/
00123 
00124 #define  intens(col)        ( (col)[0] > (col)[1] \
00125                             ? (col)[0] > (col)[2] ? (col)[0] : (col)[2] \
00126                             : (col)[1] > (col)[2] ? (col)[1] : (col)[2] )
00127 
00128 #define  colrval(c,p)              ( (c)[EXP] ? \
00129                             ldexp((c)[p]+.5,(int)(c)[EXP]-(COLXS+8)) : \
00130                             0. )
00131 
00132 #define  WHTCOLOR           {1.0,1.0,1.0}
00133 #define  BLKCOLOR           {0.0,0.0,0.0}
00134 #define  WHTCOLR            {128,128,128,COLXS+1}
00135 #define  BLKCOLR            {0,0,0,0}
00136 
00137                             /* picture format identifier */
00138 #define  COLRFMT            "32-bit_rle_rgbe"
00139 #define  CIEFMT                    "32-bit_rle_xyze"
00140 #define  PICFMT                    "32-bit_rle_???e"    /* matches either */
00141 #define  LPICFMT            15                   /* max format id len */
00142 
00143                             /* macros for exposures */
00144 #define  EXPOSSTR           "EXPOSURE="
00145 #define  LEXPOSSTR          9
00146 #define  isexpos(hl)        (!strncmp(hl,EXPOSSTR,LEXPOSSTR))
00147 #define  exposval(hl)              atof((hl)+LEXPOSSTR)
00148 #define  fputexpos(ex,fp)   fprintf(fp,"%s%e\n",EXPOSSTR,ex)
00149 
00150                             /* macros for pixel aspect ratios */
00151 #define  ASPECTSTR          "PIXASPECT="
00152 #define  LASPECTSTR         10
00153 #define  isaspect(hl)              (!strncmp(hl,ASPECTSTR,LASPECTSTR))
00154 #define  aspectval(hl)             atof((hl)+LASPECTSTR)
00155 #define  fputaspect(pa,fp)  fprintf(fp,"%s%f\n",ASPECTSTR,pa)
00156 
00157                             /* macros for primary specifications */
00158 #define  PRIMARYSTR         "PRIMARIES="
00159 #define  LPRIMARYSTR        10
00160 #define  isprims(hl)        (!strncmp(hl,PRIMARYSTR,LPRIMARYSTR))
00161 #define  primsval(p,hl)            sscanf((hl)+LPRIMARYSTR, \
00162                                    "%f %f %f %f %f %f %f %f", \
00163                                    &(p)[RED][CIEX],&(p)[RED][CIEY], \
00164                                    &(p)[GRN][CIEX],&(p)[GRN][CIEY], \
00165                                    &(p)[BLU][CIEX],&(p)[BLU][CIEY], \
00166                                    &(p)[WHT][CIEX],&(p)[WHT][CIEY])
00167 #define  fputprims(p,fp)    fprintf(fp, \
00168                             "%s %.4f %.4f %.4f %.4f %.4f %.4f %.4f %.4f\n",\
00169                                    PRIMARYSTR, \
00170                                    (p)[RED][CIEX],(p)[RED][CIEY], \
00171                                    (p)[GRN][CIEX],(p)[GRN][CIEY], \
00172                                    (p)[BLU][CIEX],(p)[BLU][CIEY], \
00173                                    (p)[WHT][CIEX],(p)[WHT][CIEY])
00174 
00175                             /* macros for color correction */
00176 #define  COLCORSTR          "COLORCORR="
00177 #define  LCOLCORSTR         10
00178 #define  iscolcor(hl)              (!strncmp(hl,COLCORSTR,LCOLCORSTR))
00179 #define  colcorval(cc,hl)   sscanf((hl)+LCOLCORSTR,"%f %f %f", \
00180                                    &(cc)[RED],&(cc)[GRN],&(cc)[BLU])
00181 #define  fputcolcor(cc,fp)  fprintf(fp,"%s %f %f %f\n",COLCORSTR, \
00182                                    (cc)[RED],(cc)[GRN],(cc)[BLU])
00183 
00184 /*
00185  * Conversions to and from XYZ space generally don't apply WHTEFFICACY.
00186  * If you need Y to be luminance (cd/m^2), this must be applied when
00187  * converting from radiance (watts/sr/m^2).
00188  */
00189 
00190 extern RGBPRIMS  stdprims;  /* standard primary chromaticities */
00191 extern COLORMAT  rgb2xyzmat;       /* RGB to XYZ conversion matrix */
00192 extern COLORMAT  xyz2rgbmat;       /* XYZ to RGB conversion matrix */
00193 extern COLOR  cblack, cwhite;      /* black (0,0,0) and white (1,1,1) */
00194 
00195 #define  CGAMUT_LOWER              01
00196 #define  CGAMUT_UPPER              02
00197 #define  CGAMUT                    (CGAMUT_LOWER|CGAMUT_UPPER)
00198 
00199 #define  rgb_cie(xyz,rgb)   colortrans(xyz,rgb2xyzmat,rgb)
00200 
00201 #define  cpcolormat(md,ms)  memcpy((void *)md,(void *)ms,sizeof(COLORMAT))
00202 
00203                                    /* defined in color.c */
00204 extern char   *tempbuffer(unsigned int len);
00205 extern int    fwritecolrs(COLR *scanline, int len, FILE *fp);
00206 extern int    freadcolrs(COLR *scanline, int len, FILE *fp);
00207 extern int    fwritescan(COLOR *scanline, int len, FILE *fp);
00208 extern int    freadscan(COLOR *scanline, int len, FILE *fp);
00209 extern void   setcolr(COLR clr, double r, double g, double b);
00210 extern void   colr_color(COLOR col, COLR clr);
00211 extern int    bigdiff(COLOR c1, COLOR c2, double md);
00212                                    /* defined in spec_rgb.c */
00213 extern void   spec_rgb(COLOR col, int s, int e);
00214 extern void   spec_cie(COLOR col, int s, int e);
00215 extern void   cie_rgb(COLOR rgb, COLOR xyz);
00216 extern int    clipgamut(COLOR col, double brt, int gamut,
00217                             COLOR lower, COLOR upper);
00218 extern void   colortrans(COLOR c2, COLORMAT mat, COLOR c1);
00219 extern void   multcolormat(COLORMAT m3, COLORMAT m2,
00220                                    COLORMAT m1);
00221 extern int    colorprimsOK(RGBPRIMS pr);
00222 extern int    compxyz2rgbmat(COLORMAT mat, RGBPRIMS pr);
00223 extern int    comprgb2xyzmat(COLORMAT mat, RGBPRIMS pr);
00224 extern int    comprgb2rgbmat(COLORMAT mat, RGBPRIMS pr1, RGBPRIMS pr2);
00225 extern int    compxyzWBmat(COLORMAT mat, float wht1[2],
00226                             float wht2[2]);
00227 extern int    compxyz2rgbWBmat(COLORMAT mat, RGBPRIMS pr);
00228 extern int    comprgb2xyzWBmat(COLORMAT mat, RGBPRIMS pr);
00229 extern int    comprgb2rgbWBmat(COLORMAT mat, RGBPRIMS pr1, RGBPRIMS pr2);
00230                                    /* defined in colrops.c */
00231 extern int    setcolrcor(double (*f)(double, double), double a2);
00232 extern int    setcolrinv(double (*f)(double, double), double a2);
00233 extern int    setcolrgam(double g);
00234 extern int    colrs_gambs(COLR *scan, int len);
00235 extern int    gambs_colrs(COLR *scan, int len);
00236 extern void   shiftcolrs(COLR *scan, int len, int adjust);
00237 extern void   normcolrs(COLR *scan, int len, int adjust);
00238 
00239 
00240 #ifdef __cplusplus
00241 }
00242 #endif
00243 #endif /* _RAD_COLOR_H_ */
00244