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