00001 #include "colmap.h" 00002 00015 #include <glt/rgb.h> 00016 00017 #include <cassert> 00018 using namespace std; 00019 00020 GltColorMap::GltColorMap() 00021 { 00022 } 00023 00024 GltColorMap::~GltColorMap() 00025 { 00026 } 00027 00028 void 00029 GltColorMap::addEntry(const real t,const GltColor &color) 00030 { 00031 if (_map.size()==0) 00032 { 00033 _map.push_back(make_pair(t,color)); 00034 return; 00035 } 00036 00037 if (t<start()) 00038 { 00039 _map.insert(_map.begin(),make_pair(t,color)); 00040 return; 00041 } 00042 00043 if (t>=end()) 00044 { 00045 _map.push_back(make_pair(t,color)); 00046 return; 00047 } 00048 00049 iterator i,j; 00050 i = _map.begin(); 00051 j = i; j++; 00052 00053 while (i!=_map.end() && j!=_map.end()) 00054 if (i->first<=t && j->first>t) 00055 { 00056 _map.insert(i,make_pair(t,color)); 00057 break; 00058 } 00059 else 00060 { 00061 i++; 00062 j++; 00063 } 00064 00065 assert(0); 00066 } 00067 00068 void 00069 GltColorMap::addEntry(const real t,const GltColor &color,const real alpha) 00070 { 00071 GltColor col(color); 00072 col.alpha() = alpha; 00073 addEntry(t,col); 00074 } 00075 00076 void 00077 GltColorMap::clear() 00078 { 00079 _map.clear(); 00080 } 00081 00082 GltColor 00083 GltColorMap::lookup(const real t) const 00084 { 00085 if (_map.size()==0) 00086 return black; 00087 00088 if (t<=start()) 00089 return _map.front().second; 00090 00091 if (t>=end()) 00092 return _map.back().second; 00093 00094 const_iterator i,j; 00095 i = _map.begin(); 00096 j = i; j++; 00097 00098 while (i!=_map.end() && j!=_map.end()) 00099 if (i->first<=t && j->first>=t) 00100 return LERP(i->second,j->second,(t-i->first)/(j->first-i->first)); 00101 else 00102 { 00103 i++; 00104 j++; 00105 } 00106 00107 assert(0); 00108 return black; 00109 } 00110 00111 real 00112 GltColorMap::lookup(const int i) const 00113 { 00114 assert(i>=0); 00115 assert(i<size()); 00116 00117 const_iterator j = _map.begin(); 00118 for (int k=0; k<i; k++) 00119 j++; 00120 00121 return j->first; 00122 } 00123 00124 const int GltColorMap::size() const { return _map.size(); } 00125 const real GltColorMap::start() const { return _map.front().first; } 00126 const real GltColorMap::end() const { return _map.back().first; } 00127 const real GltColorMap::duration() const { return end() - start(); } 00128 00129 GltColorMap &GltColorMap::operator+=(const real x) 00130 { 00131 iterator i = _map.begin(); 00132 for (; i!=_map.end(); i++) 00133 i->first += x; 00134 return *this; 00135 } 00136 00137 GltColorMap &GltColorMap::operator-=(const real x) 00138 { 00139 iterator i = _map.begin(); 00140 for (; i!=_map.end(); i++) 00141 i->first -= x; 00142 return *this; 00143 } 00144 00145 GltColorMap &GltColorMap::operator*=(const real x) 00146 { 00147 iterator i = _map.begin(); 00148 for (; i!=_map.end(); i++) 00149 i->first *= x; 00150 return *this; 00151 } 00152 00153 GltColorMap &GltColorMap::operator/=(const real x) 00154 { 00155 iterator i = _map.begin(); 00156 for (; i!=_map.end(); i++) 00157 i->first /= x; 00158 return *this; 00159 } 00160