Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

vuColourXYZa.h

Go to the documentation of this file.
00001 #ifndef _VUCOLOURXYZA_H_
00002 #define  _VUCOLOURXYZA_H_
00003 
00004 #include "vuSimpleTypes.h"
00005 #include "vuColour.h"
00006 
00007 class vuColourRGBa;
00008 class vuColour31a;
00009 class vuColour7a;
00010 
00011 #define D65_NORMAL 1056.442   // D65 normalizing luminance
00012 
00013 static float CXF31toXYZ[3][31] = 
00014   {
00015     {0.014310000000,  0.043510000000, 0.134380000000,  0.283900000000,
00016      0.348280000000,  0.336200000000, 0.290800000000,  0.195360000000,
00017      0.095640000000,  0.032010000000, 0.004900000000,  0.009300000000,
00018      0.063270000000,  0.165500000000, 0.290400000000,  0.433449900000,
00019      0.594500000000,  0.762100000000, 0.916300000000,  1.026300000000,
00020      1.062200000000,  1.002600000000, 0.854449900000,  0.642400000000,
00021      0.447900000000,  0.283500000000, 0.164900000000,  0.087400000000,
00022      0.046770000000,  0.022700000000, 0.011359160000},
00023     {0.000396000000,  0.001210000000, 0.004000000000,  0.011600000000,
00024      0.023000000000,  0.038000000000, 0.060000000000,  0.090980000000,
00025      0.139020000000,  0.208020000000, 0.323000000000,  0.503000000000,
00026      0.710000000000,  0.862000000000, 0.954000000000,  0.994950100000,
00027      0.995000000000,  0.952000000000, 0.870000000000,  0.757000000000,
00028      0.631000000000,  0.503000000000, 0.381000000000,  0.265000000000,
00029      0.175000000000,  0.107000000000, 0.061000000000,  0.032000000000,
00030      0.017000000000,  0.008210000000, 0.004102000000},
00031     {0.067850010000,  0.207400000000, 0.645600000000,  1.385600000000,
00032      1.747060000000,  1.772110000000, 1.669200000000,  1.287640000000,
00033      0.812950100000,  0.465180000000, 0.272000000000,  0.158200000000,
00034      0.078249990000,  0.042160000000, 0.020300000000,  0.008749999000,
00035      0.003900000000,  0.002100000000, 0.001650001000,  0.001100000000,
00036      0.000800000000,  0.000340000000, 0.000190000000,  0.000049999990,
00037      0.000020000000,  0.000000000000, 0.000000000000,  0.000000000000,
00038      0.000000000000,  0.000000000000, 0.000000000000 }
00039 };
00040 
00041 static float CXF7toXYZ[3][7] = {
00042   {
00043      0.14419629,  3.15523510, -5.16978530,
00044      6.63245620,  1.82661430,  6.40688960, -2.32286750
00045   },{
00046     -1.16914350,  0.20485019, 1.78727750,
00047      7.35206600,  1.73786180, 2.36028410, -1.59273490
00048   },{
00049      2.87092470, 18.5172560, -17.5948330,
00050     17.9091440 ,-23.2460780,  15.3510810, -3.06667750
00051   }
00052 };
00053 
00054 static float CXFRGBtoXYZ[3][3] = {
00055   {  0.3935,   0.3653,   0.1916 },
00056   {  0.2124,   0.7011,   0.0866 },
00057   {  0.0187,   0.1119,   0.9582 }
00058 };
00059 
00064 class vuColourXYZa : public vuColour<4>
00065 {
00066  public:
00068   vuColourXYZa() : vuColour<4>(), m_Normal(D65_NORMAL) {};
00070   vuColourXYZa(const vuColourXYZa& inst) : vuColour<4>(inst), m_Normal(D65_NORMAL)  {};
00072   vuColourXYZa(const vuColour<4>& inst) : vuColour<4>(inst), m_Normal(D65_NORMAL)  {};
00074   vuColourXYZa(const float *f) : vuColour<4>(f), m_Normal(D65_NORMAL)  {};
00076   vuColourXYZa(const float f) : vuColour<4>(f), m_Normal(D65_NORMAL) {};
00078   vuColourXYZa(const float x, const float y, const float z, const float a) : m_Normal(D65_NORMAL)
00079     {
00080       m_Data[0] = x; m_Data[1] = y; m_Data[2] = z; m_Data[3] = a;
00081     }
00082 
00084   vuColourXYZa(const vuColourRGBa& inst) { from(inst); };
00086   vuColourXYZa(const vuColour7a& inst) { from(inst); };
00088   vuColourXYZa(const vuColour31a& inst) { from(inst); };
00089 
00091   void from(const vuColourRGBa& rgba)
00092     {
00093       fromColourN((vuColour<4>&)rgba, (float*)CXFRGBtoXYZ);
00094     };
00095 
00097   void from(const vuColour7a& c7a)
00098     {
00099       fromColourN((vuColour<8>&)c7a, (const float*)CXF7toXYZ);
00100     };
00101 
00103   void from(const vuColour31a& c31a)
00104     {
00105       fromColourN((vuColour<32>&)c31a, (float*)CXF31toXYZ);
00106     };
00107 
00113   float setNormalSpectrum(const vuColour31a& s)
00114     {
00115       m_Normal = 0;
00116       for(dword c=0;c<31;c++)
00117         m_Normal += m_Data[c]*CXF31toXYZ[1][c];
00118       if(m_Normal == 0) m_Normal = (float)D65_NORMAL;
00119       return m_Normal;
00120     };
00121 
00127   float setNormalSpectrum(const vuColour7a& s)
00128     {
00129       m_Normal = 0;
00130       for(dword c=0;c<7;c++)
00131         m_Normal += m_Data[c]*CXF7toXYZ[1][c];
00132       if(m_Normal == 0) m_Normal = (float)D65_NORMAL;
00133       return m_Normal;
00134     };
00135 
00138   void normalize(void)
00139     {
00140       m_Data[0] /= m_Normal;
00141       m_Data[1] /= m_Normal;
00142       m_Data[2] /= m_Normal;
00143     }
00144 
00145  protected:
00146   float m_Normal; 
00147 };
00148 
00149 #endif

Generated on Wed Dec 15 21:20:33 2004 for vuVolume by  doxygen 1.3.9.1