00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifdef _MSC_VER
00025 #include <windows_config.h>
00026 #else
00027 #include <config.h>
00028 #endif
00029
00030 #include <cmath>
00031 #include <string>
00032 #include <sstream>
00033 #include <utils/common/StringTokenizer.h>
00034 #include <utils/common/TplConvert.h>
00035 #include <utils/common/MsgHandler.h>
00036 #include "RGBColor.h"
00037
00038 #ifdef CHECK_MEMORY_LEAKS
00039 #include <foreign/nvwa/debug_new.h>
00040 #endif // CHECK_MEMORY_LEAKS
00041
00042
00043
00044
00045
00046 const std::string RGBColor::DEFAULT_COLOR_STRING = "1,1,0";
00047 const RGBColor RGBColor::DEFAULT_COLOR = RGBColor::parseColor(RGBColor::DEFAULT_COLOR_STRING);
00048
00049
00050
00051
00052
00053 RGBColor::RGBColor() throw()
00054 : myRed(-1), myGreen(-1), myBlue(-1) {}
00055
00056
00057 RGBColor::RGBColor(SUMOReal red, SUMOReal green, SUMOReal blue) throw()
00058 : myRed(red), myGreen(green), myBlue(blue) {}
00059
00060
00061 RGBColor::RGBColor(const RGBColor& col) throw()
00062 : myRed(col.myRed), myGreen(col.myGreen), myBlue(col.myBlue) {}
00063
00064
00065 RGBColor::~RGBColor() throw() {}
00066
00067
00068 void
00069 RGBColor::set(SUMOReal r, SUMOReal g, SUMOReal b) throw() {
00070 myRed = r;
00071 myGreen = g;
00072 myBlue = b;
00073 }
00074
00075
00076
00077 std::ostream &
00078 operator<<(std::ostream &os, const RGBColor &col) {
00079 os
00080 << col.myRed << ","
00081 << col.myGreen << ","
00082 << col.myBlue;
00083 return os;
00084 }
00085
00086
00087 bool
00088 RGBColor::operator==(const RGBColor &c) const {
00089 return fabs(myRed-c.myRed)<0.1 && fabs(myGreen-c.myGreen)<0.1 && fabs(myBlue-c.myBlue)<0.1;
00090
00091 }
00092
00093
00094 bool
00095 RGBColor::operator!=(const RGBColor &c) const {
00096 return fabs(myRed-c.myRed)>0.1 || fabs(myGreen-c.myGreen)>0.1 || fabs(myBlue-c.myBlue)>0.1;
00097
00098 }
00099
00100
00101 RGBColor
00102 RGBColor::parseColor(const std::string &coldef) throw(EmptyData, NumberFormatException) {
00103 StringTokenizer st(coldef, ",");
00104 if (st.size()<3) {
00105 throw EmptyData();
00106 }
00107 SUMOReal r = TplConvert<char>::_2SUMOReal(st.next().c_str());
00108 SUMOReal g = TplConvert<char>::_2SUMOReal(st.next().c_str());
00109 SUMOReal b = TplConvert<char>::_2SUMOReal(st.next().c_str());
00110 return RGBColor(r, g, b);
00111 }
00112
00113
00114 RGBColor
00115 RGBColor::parseColorReporting(const std::string &coldef, const char *objecttype, const char *objectid, bool report, bool &ok) throw() {
00116 try {
00117 return parseColor(coldef);
00118 } catch (NumberFormatException &) {
00119 } catch (EmptyData &) {
00120 }
00121 ok = false;
00122 std::ostringstream oss;
00123 oss << "Attribute 'color' in definition of ";
00124 if (objectid==0) {
00125 oss << "a ";
00126 }
00127 if (objecttype!=0) {
00128 oss << objecttype;
00129 } else {
00130 oss << "<unknown type>";
00131 }
00132 if (objectid!=0) {
00133 oss << " '" << objectid << "'";
00134 }
00135 oss << " is not a valid color.";
00136 MsgHandler::getErrorInstance()->inform(oss.str());
00137 return RGBColor();
00138 }
00139
00140
00141 RGBColor
00142 RGBColor::getDefaultColor() throw() {
00143 return parseColor(RGBColor::DEFAULT_COLOR_STRING);
00144 }
00145
00146
00147 RGBColor
00148 RGBColor::interpolate(const RGBColor &minColor, const RGBColor &maxColor, SUMOReal weight) throw() {
00149 if (weight < 0) weight = 0;
00150 if (weight > 1) weight = 1;
00151 SUMOReal r = minColor.myRed + (maxColor.myRed - minColor.myRed) * weight;
00152 SUMOReal g = minColor.myGreen + (maxColor.myGreen - minColor.myGreen) * weight;
00153 SUMOReal b = minColor.myBlue + (maxColor.myBlue - minColor.myBlue) * weight;
00154 return RGBColor(r, g, b);
00155 }
00156
00157
00158 RGBColor
00159 RGBColor::fromHSV(SUMOReal h, SUMOReal s, SUMOReal v) throw() {
00160
00161
00162
00163 float m, n, f;
00164 h /= 60.;
00165 int i;
00166
00167 i = floor(h);
00168 f = h - i;
00169 if (!(i&1)) f = 1 - f;
00170 m = v * (1 - s);
00171 n = v * (1 - s * f);
00172 switch (i) {
00173 case 6:
00174 case 0:
00175 return RGBColor(v, n, m);
00176 case 1:
00177 return RGBColor(n, v, m);
00178 case 2:
00179 return RGBColor(m, v, n);
00180 case 3:
00181 return RGBColor(m, n, v);
00182 case 4:
00183 return RGBColor(n, m, v);
00184 case 5:
00185 return RGBColor(v, m, n);
00186 }
00187 return RGBColor(1, 1, 1);
00188 }
00189
00190
00191
00192