1 #include "Color_ramp.h"
2 #include <iostream>
3 
4 // -----------------------------------
5 // Color_component
6 // -----------------------------------
7 Color_component::
Color_component()8 Color_component()
9 {
10   add(0,0);
11   add(1,1);
12 }
13 
14 Color_component::
Color_component(const double c0,const double c1)15 Color_component(const double c0, const double c1)
16 {
17   add(0,c0);
18   add(1,c1);
19 }
20 
21 double
22 Color_component::
interpolate(const double v) const23 interpolate(const double v) const
24 {
25   Values::const_iterator next = next_it(v);
26 
27   // next is just after v
28   Values::const_iterator prev = --next;
29   ++next;
30 
31   if ( v>=1 && next != values_.end())
32     std::cerr << ".";
33 
34   if ( next == values_.end() )
35   {
36     return prev->second;
37   }
38 
39   const double& a = prev->first;
40   const double& b = next->first;
41   return (b-v)/(b-a) * prev->second + (v-a)/(b-a) * next->second;
42 
43 }
44 
45 void
46 Color_component::
add(const double v,double color)47 add(const double v, double color)
48 {
49   if ( color > 1 ) { color = 1; }
50   if ( color < 0 ) { color = 0; }
51 
52   Values::iterator next = next_it(v);
53   values_.insert(next, std::make_pair(v,color));
54 }
55 
56 
57 void
58 Color_component::
rebuild(const double c0,const double c1)59 rebuild(const double c0, const double c1)
60 {
61   values_.clear();
62   add(1,c1);
63   add(0,c0);
64 }
65 
66 void
67 Color_component::
print() const68 print() const
69 {
70   for ( Values::const_iterator it = values_.begin(),
71        end = values_.end() ; it != end ; ++it )
72   {
73     std::cout << "<" << it->first << "," << it->second << "> ";
74   }
75 
76   std::cout << std::endl;
77 }
78 
79 
80 // -----------------------------------
81 // Color_ramp
82 // -----------------------------------
Color_ramp()83 Color_ramp::Color_ramp()
84   : r_()
85   , g_()
86   , b_()
87 {
88 }
89 
Color_ramp(const double r0,const double r1,const double g0,const double g1,const double b0,const double b1)90 Color_ramp::Color_ramp(const double r0, const double r1,
91            const double g0, const double g1,
92            const double b0, const double b1)
93 {
94   r_.rebuild(r0,r1);
95   g_.rebuild(g0,g1);
96   b_.rebuild(b0,b1);
97 
98   r_.add(0.5,(std::max)(r0,r1));
99   g_.add(0.5,(std::max)(g0,g1));
100   b_.add(0.5,(std::max)(b0,b1));
101   }
102 
103 void
build_red()104 Color_ramp::build_red()
105 {
106   r_.rebuild(1,0.5);
107   g_.rebuild(1,0);
108   b_.rebuild(1,0);
109 
110   r_.add(0.3,1);
111   r_.add(0.05,1);
112   g_.add(0.05,0.95);
113   g_.add(0.3,0.5);
114   b_.add(0.05,0);
115 }
116 
117 void
build_blue()118 Color_ramp::build_blue()
119 {
120   r_.rebuild(1,0);
121   g_.rebuild(1,0);
122   b_.rebuild(1,0.5);
123 
124   b_.add(0.1,0.8);
125   g_.add(0.1,0.4);
126   r_.add(0.1,0.4);
127 }
128 
129 void
build_thermal()130 Color_ramp::build_thermal()
131 {
132   r_.rebuild(1,0.5);
133   g_.rebuild(1,0);
134   b_.rebuild(1,0);
135 
136   r_.add(0.0,0);
137   r_.add(1,1);
138   g_.add(0.05,0.8);
139   g_.add(0.3,0.5);
140   b_.add(0.0,1.0);
141   b_.add(1.0,0.0);
142 }
143 
144 void
build_rainbow()145 Color_ramp::build_rainbow()
146 {
147   r_.rebuild(1,0.5);
148   g_.rebuild(1,0);
149   b_.rebuild(1,0);
150 
151   r_.add(0,0.75);
152   g_.add(0,0.75);
153   b_.add(0,1);
154 
155   r_.add(0.2,0);
156   g_.add(0.2,0);
157   b_.add(0.2,1);
158 
159   r_.add(0.4,0);
160   g_.add(0.4,1);
161   b_.add(0.4,0);
162 
163   r_.add(0.6,1);
164   g_.add(0.6,1);
165   b_.add(0.6,0);
166 
167   r_.add(0.8,1);
168   g_.add(0.8,0);
169   b_.add(0.8,0);
170 }
171 
172 void
173 Color_ramp::
print() const174 print() const
175 {
176   std::cout << "r: ";
177   r_.print();
178   std::cout << "g: ";
179   g_.print();
180   std::cout << "b: ";
181   b_.print();
182 }
183 
184