00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef __CS_CSCOLOR_H__
00020 #define __CS_CSCOLOR_H__
00021
00026 #include "csextern.h"
00027
00033 class csColor
00034 {
00035 public:
00036 #if !defined(__STRICT_ANSI__) && !defined(SWIG)
00037 union
00038 {
00039 struct
00040 {
00041 #endif
00042
00043 float red;
00045 float green;
00047 float blue;
00048 #if !defined(__STRICT_ANSI__) && !defined(SWIG)
00049 };
00051 float m[3];
00052 };
00053 #endif
00054
00055 public:
00057 csColor () { }
00059 csColor (float r, float g, float b) : red (r), green (g), blue (b)
00060 {}
00062 csColor (float v) : red (v), green (v), blue (v)
00063 {}
00065 csColor (const csColor& c)
00066 { red = c.red; green = c.green; blue = c.blue; }
00068 void Set (float r, float g, float b)
00069 { red = r; green = g; blue = b; }
00071 void Set (const csColor& c)
00072 { red = c.red; green = c.green; blue = c.blue; }
00074 void Clamp (float r, float g, float b)
00075 {
00076 if (red > r) red = r;
00077 if (green > g) green = g;
00078 if (blue > b) blue = b;
00079 }
00081 void ClampDown ()
00082 {
00083 if (red < 0) red = 0;
00084 if (green < 0) green = 0;
00085 if (blue < 0) blue = 0;
00086 }
00088 bool IsBlack () const
00089 {
00090 return (red == 0 && green == 0 && blue == 0);
00091 }
00093 bool IsBlack (float threshold) const
00094 {
00095 return (red < threshold && green < threshold && blue < threshold);
00096 }
00098 csColor& operator= (const csColor& c)
00099 { red = c.red; green = c.green; blue = c.blue; return *this; }
00101 csColor& operator*= (float f)
00102 { red *= f; green *= f; blue *= f; return *this; }
00104 csColor& operator+= (const csColor& c)
00105 { red += c.red; green += c.green; blue += c.blue; return *this; }
00107 csColor& operator-= (const csColor& c)
00108 { red -= c.red; green -= c.green; blue -= c.blue; return *this; }
00110 csColor& operator*= (const csColor& c)
00111 { red *= c.red; green *= c.green; blue *= c.blue; return *this; }
00113 csColor operator * (const float f)
00114 {
00115 csColor ret;
00116 ret.red = red*f;
00117 ret.green = green*f;
00118 ret.blue = blue*f;
00119 return ret;
00120 }
00122 bool operator== (const csColor& c) const
00123 { return red == c.red && green == c.green && blue == c.blue; }
00125 bool operator!= (const csColor& c) const
00126 { return red != c.red || green != c.green || blue != c.blue; }
00128 void Add (float r, float g, float b)
00129 { red += r; green += g; blue += b; }
00131 void Subtract (float r, float g, float b)
00132 { red -= r; green -= g; blue -= b; }
00134 float Luminance() const
00135 { return red*0.2126f + green*0.7152f + blue*0.0722f; }
00136
00138 #ifdef __STRICT_ANSI__
00139 inline float operator[] (size_t n) const { return !n?red:n&1?green:blue; }
00140 #else
00141 inline float operator[] (size_t n) const { return m[n]; }
00142 #endif
00143
00145 #ifdef __STRICT_ANSI__
00146 inline float & operator[] (size_t n) { return !n?red:n&1?green:blue; }
00147 #else
00148 inline float & operator[] (size_t n) { return m[n]; }
00149 #endif
00150 };
00151
00153 inline csColor operator/ (const csColor& v, float f)
00154 { f = 1.0f/f; return csColor(v.red*f, v.green*f, v.blue*f); }
00156 inline csColor operator* (const csColor& v1, const csColor& v2)
00157 {
00158 return csColor (v1.red * v2.red,
00159 v1.green * v2.green,
00160 v1.blue * v2.blue);
00161 }
00162
00163
00165 inline csColor operator* (const csColor& s, float f)
00166 { csColor c (s); c *= f; return c; }
00167
00169 inline csColor operator* (float f, const csColor& s)
00170 { csColor c (s); c *= f; return c; }
00171
00173 inline csColor operator+ (const csColor& s1, const csColor& s2)
00174 { csColor c (s1); c += s2; return c; }
00176 inline csColor operator- (const csColor& s1, const csColor& s2)
00177 { csColor c (s1); c -= s2; return c; }
00178
00182 class csColor4 : public csColor
00183 {
00184 public:
00186 float alpha;
00187
00189 csColor4 () { }
00191 csColor4 (float r, float g, float b, float a = 1.0f) : csColor (r, g, b)
00192 { alpha = a; }
00193 csColor4 (const csColor& c) : csColor (c), alpha (1.0f) { }
00194 void Set (const csColor& c)
00195 {
00196 red = c.red;
00197 green = c.green;
00198 blue = c.blue;
00199 alpha = 1.0f;
00200 }
00201 void Set (const csColor4& c)
00202 {
00203 red = c.red;
00204 green = c.green;
00205 blue = c.blue;
00206 alpha = c.alpha;
00207 }
00208 void Set (float r, float g, float b)
00209 {
00210 red = r;
00211 green = g;
00212 blue = b;
00213 alpha = 1.0f;
00214 }
00215 void Set (float r, float g, float b, float a)
00216 {
00217 red = r;
00218 green = g;
00219 blue = b;
00220 alpha = a;
00221 }
00223 csColor4& operator= (const csColor4& c)
00224 {
00225 red = c.red;
00226 green = c.green;
00227 blue = c.blue;
00228 alpha = c.alpha;
00229 return *this;
00230 }
00232 csColor4& operator= (const csColor& c)
00233 { red = c.red; green = c.green; blue = c.blue; alpha = 1.0f; return *this; }
00235 csColor4& operator*= (float f)
00236 { red *= f; green *= f; blue *= f; alpha *= f; return *this; }
00238 csColor4& operator+= (const csColor4& c)
00239 {
00240 red += c.red;
00241 green += c.green;
00242 blue += c.blue;
00243 alpha += c.alpha;
00244 return *this;
00245 }
00247 csColor4& operator+= (const csColor& c)
00248 { red += c.red; green += c.green; blue += c.blue; return *this; }
00250 csColor4& operator-= (const csColor4& c)
00251 {
00252 red -= c.red;
00253 green -= c.green;
00254 blue -= c.blue;
00255 alpha -= c.alpha;
00256 return *this;
00257 }
00259 csColor& operator-= (const csColor& c)
00260 { red -= c.red; green -= c.green; blue -= c.blue; return *this; }
00262 bool operator== (const csColor4& c) const
00263 {
00264 return red == c.red &&
00265 green == c.green &&
00266 blue == c.blue &&
00267 alpha == c.alpha;
00268 }
00270 bool operator!= (const csColor4& c) const
00271 {
00272 return red != c.red ||
00273 green != c.green ||
00274 blue != c.blue ||
00275 alpha != c.alpha;
00276 }
00277
00279 inline float operator[] (size_t n) const
00280 { return (n == 3) ? alpha : csColor::operator[] (n); }
00281
00283 inline float & operator[] (size_t n)
00284 { return (n == 3) ? alpha : csColor::operator[] (n); }
00285 };
00286
00287
00289 inline csColor4 operator/ (const csColor4& v, float f)
00290 { f = 1.0f/f; return csColor4(v.red*f, v.green*f, v.blue*f, v.alpha*f); }
00292 inline csColor4 operator* (const csColor4& v1, const csColor4& v2)
00293 {
00294 return csColor4 (v1.red * v2.red,
00295 v1.green * v2.green,
00296 v1.blue * v2.blue,
00297 v1.alpha * v2.alpha);
00298 }
00299
00300
00302 inline csColor4 operator* (const csColor4& s, float f)
00303 { csColor4 c (s); c *= f; return c; }
00304
00306 inline csColor4 operator* (float f, const csColor4& s)
00307 { csColor4 c (s); c *= f; return c; }
00308
00310 inline csColor4 operator+ (const csColor4& s1, const csColor4& s2)
00311 { csColor4 c (s1); c += s2; return c; }
00313 inline csColor4 operator- (const csColor4& s1, const csColor4& s2)
00314 { csColor4 c (s1); c -= s2; return c; }
00315
00316 #endif // __CS_CSCOLOR_H__