Back to index

radiance  4R0+20100331
cvrgb.c
Go to the documentation of this file.
00001 #ifndef lint
00002 static const char    RCSid[] = "$Id: cvrgb.c,v 1.3 2003/11/15 17:54:06 schorsch Exp $";
00003 #endif
00004 /*
00005  * Convert MGF color to RGB representation defined below.
00006  */
00007 
00008 #include <stdio.h>
00009 #include <stdlib.h>
00010 
00011 #include "parser.h"
00012 
00013                      /* Change the following to suit your standard */
00014 #define  CIE_x_r            0.640         /* nominal CRT primaries */
00015 #define  CIE_y_r            0.330
00016 #define  CIE_x_g            0.290
00017 #define  CIE_y_g            0.600
00018 #define  CIE_x_b            0.150
00019 #define  CIE_y_b            0.060
00020 #define  CIE_x_w            0.3333        /* use true white */
00021 #define  CIE_y_w            0.3333
00022 
00023 #define CIE_C_rD     ( (1./CIE_y_w) * \
00024                             ( CIE_x_w*(CIE_y_g - CIE_y_b) - \
00025                               CIE_y_w*(CIE_x_g - CIE_x_b) + \
00026                               CIE_x_g*CIE_y_b - CIE_x_b*CIE_y_g       ) )
00027 #define CIE_C_gD     ( (1./CIE_y_w) * \
00028                             ( CIE_x_w*(CIE_y_b - CIE_y_r) - \
00029                               CIE_y_w*(CIE_x_b - CIE_x_r) - \
00030                               CIE_x_r*CIE_y_b + CIE_x_b*CIE_y_r       ) )
00031 #define CIE_C_bD     ( (1./CIE_y_w) * \
00032                             ( CIE_x_w*(CIE_y_r - CIE_y_g) - \
00033                               CIE_y_w*(CIE_x_r - CIE_x_g) + \
00034                               CIE_x_r*CIE_y_g - CIE_x_g*CIE_y_r       ) )
00035 
00036 
00037 float  xyz2rgbmat[3][3] = {        /* XYZ to RGB conversion matrix */
00038        {(CIE_y_g - CIE_y_b - CIE_x_b*CIE_y_g + CIE_y_b*CIE_x_g)/CIE_C_rD,
00039         (CIE_x_b - CIE_x_g - CIE_x_b*CIE_y_g + CIE_x_g*CIE_y_b)/CIE_C_rD,
00040         (CIE_x_g*CIE_y_b - CIE_x_b*CIE_y_g)/CIE_C_rD},
00041        {(CIE_y_b - CIE_y_r - CIE_y_b*CIE_x_r + CIE_y_r*CIE_x_b)/CIE_C_gD,
00042         (CIE_x_r - CIE_x_b - CIE_x_r*CIE_y_b + CIE_x_b*CIE_y_r)/CIE_C_gD,
00043         (CIE_x_b*CIE_y_r - CIE_x_r*CIE_y_b)/CIE_C_gD},
00044        {(CIE_y_r - CIE_y_g - CIE_y_r*CIE_x_g + CIE_y_g*CIE_x_r)/CIE_C_bD,
00045         (CIE_x_g - CIE_x_r - CIE_x_g*CIE_y_r + CIE_x_r*CIE_y_g)/CIE_C_bD,
00046         (CIE_x_r*CIE_y_g - CIE_x_g*CIE_y_r)/CIE_C_bD}
00047 };
00048 
00049 
00050 void
00051 mgf2rgb(             /* convert MGF color to RGB */
00052        register C_COLOR     *cin,  /* input MGF chrominance */
00053        double intensity,           /* input luminance or reflectance */
00054        register float       cout[3]       /* output RGB color */
00055 )
00056 {
00057        static double cie[3];
00058                                    /* get CIE XYZ representation */
00059        c_ccvt(cin, C_CSXY);
00060        cie[0] = intensity*cin->cx/cin->cy;
00061        cie[1] = intensity;
00062        cie[2] = intensity*(1./cin->cy - 1.) - cie[0];
00063                                    /* convert to RGB */
00064        cout[0] = xyz2rgbmat[0][0]*cie[0] + xyz2rgbmat[0][1]*cie[1]
00065                      + xyz2rgbmat[0][2]*cie[2];
00066        if(cout[0] < 0.) cout[0] = 0.;
00067        cout[1] = xyz2rgbmat[1][0]*cie[0] + xyz2rgbmat[1][1]*cie[1]
00068                      + xyz2rgbmat[1][2]*cie[2];
00069        if(cout[1] < 0.) cout[1] = 0.;
00070        cout[2] = xyz2rgbmat[2][0]*cie[0] + xyz2rgbmat[2][1]*cie[1]
00071                      + xyz2rgbmat[2][2]*cie[2];
00072        if(cout[2] < 0.) cout[2] = 0.;
00073 }