#ifndef __BLOP_COLOR_H__
#define __BLOP_COLOR_H__

#include "var.h"

namespace blop
{

class color
{
 private:
    double red_,green_,blue_;
    friend bool operator== (const color &c1, const color &c2);
    friend bool operator!= (const color &c1, const color &c2);
 public:
    color(double r,double g,double b) : red_(r), green_(g), blue_(b) {}
    color() : red_(0), green_(0), blue_(0) {}
    color(const color &o) : red_(o.red_), green_(o.green_), blue_(o.blue_) {}

    double red() const {return red_;}
    double green() const {return green_;}
    double blue() const {return blue_;}

    color &red(double d) {red_ = d; return *this;}
    color &green(double d) {green_ = d; return *this;}
    color &blue(double d) {blue_ = d; return *this;}

    void set(double r,double g,double b)
	{red_ = r; green_ = g; blue_ = b;}

    static color get(const var &);

    class global_initializer
	{
	public:
	    global_initializer();
	};

    const color &operator+=(const color &);
    const color &operator-=(const color &);
    const color &operator*=(double f);
    const color &operator/=(double f);

    static std::vector<blop::color> &default_sequence();
    static int sequence_index(const color &);
};

ostream &operator<<(ostream &out, const color &c);

inline bool operator== (const color &c1, const color &c2)
{
    return
    c1.red_ == c2.red_ &&
    c1.green_ == c2.green_ &&
    c1.blue_ == c2.blue_;
}

inline bool operator!= (const color &c1, const color &c2)
{
    return !(c1==c2);
}

inline bool operator< (const color &c1, const color &c2)
{
    if(c1.red() < c2.red()) return true;
    if(c1.red() > c2.red()) return false;
    if(c1.green() < c2.green()) return true;
    if(c1.green() > c2.green()) return false;
    if(c1.blue() < c2.blue()) return true;
    if(c1.blue() > c2.blue()) return false;
    return false;
}

color operator+ (const color &c1, const color &c2);
color operator- (const color &c1, const color &c2);
color operator* (const color &c1, double f);
color operator* (double f, const color &c2);
color operator/ (const color &c1, double f);


extern color black;
extern color red;
extern color green;
extern color blue;
extern color magenta;
extern color white;
extern color yellow;
extern color cyan;
extern color sienna;
extern color orange;
extern color pink;
extern color gray;
extern color purple;
extern color transparent;
extern color autocolor;

}


#ifndef __MAKECINT__
namespace {
    blop::color::global_initializer blop_color_global_initializer;
}
#endif

#endif