#include "color.h" #include <iostream> #include "warning.h" namespace blop { color red(1,0,0); color green(0,0.7,0); color blue(0,0,1); color black(0,0,0); color magenta(0.5,0,0.5); color yellow(1,1,0); color white(1,1,1); color cyan(0.0, 0.7, 1.0); color sienna(0.6, 0.3, 0.2); color orange(1.0, 0.5, 0.0); color pink(1.0, 0.2, 1.0); color gray(0.55,0.55,0.55); color purple(160.0/256, 92.0/256, 240.0/256); color transparent(-1,-1,-1); color autocolor(-2,-2,-2); const color &color::operator+=(const color &c) { red_ += c.red_; green_ += c.green_; blue_ += c.blue_; return *this; } const color &color::operator-=(const color &c) { red_ -= c.red_; green_ -= c.green_; blue_ -= c.blue_; return *this; } const color &color::operator*=(double f) { red_ *= f; green_ *= f; blue_ *= f; return *this; } const color &color::operator/=(double f) { red_ /= f; green_ /= f; blue_ /= f; return *this; } color color::get(const var &name) { if(name.str() == "red") return blop::red; if(name.str() == "green") return blop::green; if(name.str() == "blue") return blop::blue; if(name.str() == "black") return blop::black; if(name.str() == "magenta") return blop::magenta; if(name.str() == "yellow") return blop::yellow; if(name.str() == "white") return blop::white; if(name.str() == "cyan") return blop::cyan; if(name.str() == "sienna") return blop::sienna; if(name.str() == "orange") return blop::orange; if(name.str() == "pink") return blop::pink; warning::print("Can not interpret color name: " &name, "color:;get(const var &)"); return blop::black; } std::vector<color> &color::default_sequence() { static std::vector<blop::color> s; if(s.empty()) { s.push_back(blop::black); s.push_back(blop::red); s.push_back(blop::green); s.push_back(blop::blue); s.push_back(blop::magenta); s.push_back(blop::cyan); s.push_back(blop::orange); s.push_back(blop::sienna); s.push_back(blop::pink); s.push_back(blop::purple); } return s; } int color::sequence_index(const color &c) { for(unsigned int i=0; i<default_sequence().size(); ++i) { if(default_sequence()[i] == c) return (int)i; } return -1; } color::global_initializer::global_initializer() { new(&blop::red) color(1,0,0); new(&blop::green) color(0,0.7,0); new(&blop::blue) color(0,0,1); new(&black) color(0,0,0); new(&magenta) color(0.5,0,0.5); new(&yellow) color(1,1,0); new(&white) color(1,1,1); new(&cyan) color(0.0, 0.7, 1.0); new(&sienna) color(0.6, 0.3, 0.2); new(&orange) color(1.0, 0.5, 0.0); new(&pink) color(1.0, 0.2, 1.0); new(&transparent) color(-1,-1,-1); } color operator+ (const color &c1, const color &c2) { return color(c1.red() +c2.red(), c1.green()+c2.green(), c1.blue() +c2.blue()); } color operator- (const color &c1, const color &c2) { return color(c1.red() -c2.red(), c1.green()-c2.green(), c1.blue() -c2.blue()); } color operator* (const color &c1, double f) { return color(c1.red() *f, c1.green()*f, c1.blue() *f); } color operator* (double f,const color &c1) { return color(c1.red() *f, c1.green()*f, c1.blue() *f); } color operator/ (const color &c1, double f) { return color(c1.red() /f, c1.green()/f, c1.blue() /f); } ostream &operator<<(ostream &out, const color &c) { out<<c.red()<<","<<c.green()<<","<<c.blue(); return out; } }