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