00001
00005 #ifndef Color_h
00006 #define Color_h
00007
00008 #include "Math.h"
00009 #include <iosfwd>
00010
00011 class Color {
00012 public:
00013 Color() {
00014 }
00015
00016 Color(const Color& copy) {
00017 for(int i=0;i<3;i++)
00018 data[i] = copy.data[i];
00019 }
00020
00021 Color& operator=(const Color& copy) {
00022 for(int i=0;i<3;i++)
00023 data[i] = copy.data[i];
00024 return *this;
00025 }
00026
00027 ~Color() {
00028 }
00029
00030 double r() const {
00031 return data[0];
00032 }
00033 double g() const {
00034 return data[1];
00035 }
00036 double b() const {
00037 return data[2];
00038 }
00039
00040 Color(float r, float g, float b) {
00041 data[0] = r;
00042 data[1] = g;
00043 data[2] = b;
00044 }
00045 Color operator+(const Color& c) const {
00046 return Color(data[0] + c.data[0], data[1]+c.data[1], data[2]+c.data[2]);
00047 }
00048 Color& operator+=(const Color& c) {
00049 data[0] += c.data[0]; data[1] += c.data[1]; data[2] += c.data[2];
00050 return *this;
00051 }
00052 Color operator-(const Color& c) const {
00053 return Color(data[0] - c.data[0], data[1]-c.data[1], data[2]-c.data[2]);
00054 }
00055 Color& operator-=(const Color& c) {
00056 data[0] -= c.data[0]; data[1] -= c.data[1]; data[2] -= c.data[2];
00057 return *this;
00058 }
00059 Color operator*(const Color& c) const {
00060 return Color(data[0] * c.data[0], data[1]*c.data[1], data[2]*c.data[2]);
00061 }
00062 Color& operator*=(const Color& c) {
00063 data[0] *= c.data[0]; data[1] *= c.data[1]; data[2] *= c.data[2];
00064 return *this;
00065 }
00066 Color operator*(double s) const {
00067 return Color(data[0]*s, data[1]*s, data[2]*s);
00068 }
00069 Color& operator*=(double s) {
00070 data[0] *= s; data[1] *= s; data[2] *= s;
00071 return *this;
00072 }
00073 Color operator*(float s) const {
00074 return Color(data[0]*s, data[1]*s, data[2]*s);
00075 }
00076 Color& operator*=(float s) {
00077 data[0] *= s; data[1] *= s; data[2] *= s;
00078 return *this;
00079 }
00080 Color operator/(double s) const {
00081 return Color(data[0]/s, data[1]/s, data[2]/s);
00082 }
00083 Color& operator/=(double s) {
00084 data[0] /= s; data[1] /= s; data[2] /= s;
00085 return *this;
00086 }
00087 Color operator/(float s) const {
00088 return Color(data[0]/s, data[1]/s, data[2]/s);
00089 }
00090 Color& operator/=(float s) {
00091 data[0] /= s; data[1] /= s; data[2] /= s;
00092 return *this;
00093 }
00094
00095 float maxComponent() const {
00096 return Max(data[0], data[1], data[2]);
00097 }
00098
00099 private:
00100 float data[3];
00101 };
00102
00103 std::ostream& operator<<(std::ostream&, const Color& c);
00104
00105 #endif