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