00001 #ifndef COLOR_H
00002 #define COLOR_H
00003
00004
00005
00006
00007 #include "def.h"
00008 #include "ssVector.hpp"
00009
00010
00011
00012
00013 #pragma pack( push, 1 )
00014 class Color
00015 {
00016 public:
00017 inline Color( ) { r=0; g=0; b=0; a=255; }
00018 inline Color( UINT32 argb ) { set(argb); }
00019 inline Color( UINT8 ri, UINT8 gi, UINT8 bi, UINT8 ai=255 ) { r=ri; g=gi; b=bi; a=ai; }
00020 inline Color( const Vector3 &v ) { set( v ); }
00021 inline Color( const Vector4 &v ) { set( v ); }
00022 inline void set( UINT8 ri, UINT8 gi, UINT8 bi, UINT8 ai ) { r=ri; g=gi; b=bi; a=ai; }
00023 inline void set( UINT8 ri, UINT8 gi, UINT8 bi ) { r=ri; g=gi; b=bi; }
00024 inline void setAlpha( UINT8 ai ) { a=ai; }
00025 inline void set( const Vector3 &v )
00026 {
00027 int t;
00028 t = intFloor(v.x*255.0f);
00029 if( t > 255 ) t = 255; else if( t < 0 ) t = 0;
00030 r = t;
00031 t = intFloor(v.y*255.0f);
00032 if( t > 255 ) t = 255; else if( t < 0 ) t = 0;
00033 g = t;
00034 t = intFloor(v.z*255.0f);
00035 if( t > 255 ) t = 255; else if( t < 0 ) t = 0;
00036 b = t;
00037 }
00038 inline void set( const Vector4 &v )
00039 {
00040 int t;
00041 t = intFloor(v.x*255.0f);
00042 if( t > 255 ) t = 255; else if( t < 0 ) t = 0;
00043 r = t;
00044 t = intFloor(v.y*255.0f);
00045 if( t > 255 ) t = 255; else if( t < 0 ) t = 0;
00046 g = t;
00047 t = intFloor(v.z*255.0f);
00048 if( t > 255 ) t = 255; else if( t < 0 ) t = 0;
00049 b = t;
00050 t = intFloor(v.w*255.0f);
00051 if( t > 255 ) t = 255; else if( t < 0 ) t = 0;
00052 a = t;
00053 }
00054 inline void set( UINT32 argb ) { a=(char)((argb&0xff000000)>>24); r=(char)((argb&0xff0000)>>16);g=(char)((argb&0xff00)>>8);b=(char)(argb&0xff); }
00055 inline UINT32 getUINT32() const { return (a<<24)|(r<<16)|(g<<8)|b; }
00056
00057 inline void operator=( const Vector3 &v ) { set(v); }
00058 inline void operator=( const Vector4 &v ) { set(v); }
00059
00060 inline Color &operator+=(const Color &c) { int k;
00061 k = a + c.a; if( k > 255 ) k = 255; a = k;
00062 k = r + c.r; if( k > 255 ) k = 255; r = k;
00063 k = g + c.g; if( k > 255 ) k = 255; g = k;
00064 k = b + c.b; if( k > 255 ) k = 255; b = k;
00065 return *this; }
00066 inline Color &operator-=(const Color &c) { int k;
00067 k = a - c.a; if( k < 0 ) k = 0; a = k;
00068 k = r - c.r; if( k < 0 ) k = 0; r = k;
00069 k = g - c.g; if( k < 0 ) k = 0; g = k;
00070 k = b - c.b; if( k < 0 ) k = 0; b = k;
00071 return *this; }
00072 inline Color &operator*=(const Color &c) { int k;
00073 k = a * c.a; k = k >> 8; if( k > 255 ) k = 255; a = k;
00074 k = r * c.r; k = k >> 8; if( k > 255 ) k = 255; r = k;
00075 k = g * c.g; k = k >> 8; if( k > 255 ) k = 255; g = k;
00076 k = b * c.b; k = k >> 8; if( k > 255 ) k = 255; b = k;
00077 return *this; }
00078 inline Color &operator+=(float f) { float k; f *= 255.0f;
00079 k = a + f; if( k > 255 ) k = 255; else if( k < 0 ) k = 0; a = intFloor(k);
00080 k = r + f; if( k > 255 ) k = 255; else if( k < 0 ) k = 0; r = intFloor(k);
00081 k = g + f; if( k > 255 ) k = 255; else if( k < 0 ) k = 0; g = intFloor(k);
00082 k = b + f; if( k > 255 ) k = 255; else if( k < 0 ) k = 0; b = intFloor(k);
00083 return *this; }
00084 inline Color &operator*=(float f) { float k;
00085 k = a * f; if( k > 255 ) k = 255; else if( k < 0 ) k = 0; a = intFloor(k);
00086 k = r * f; if( k > 255 ) k = 255; else if( k < 0 ) k = 0; r = intFloor(k);
00087 k = g * f; if( k > 255 ) k = 255; else if( k < 0 ) k = 0; g = intFloor(k);
00088 k = b * f; if( k > 255 ) k = 255; else if( k < 0 ) k = 0; b = intFloor(k);
00089 return *this; }
00090 inline Color &operator+=(const Vector3 &v) { float k;
00091 k = r + v.x * 255.0f; if( k > 255 ) k = 255; else if( k < 0 ) k = 0; r = intFloor(k);
00092 k = g + v.y * 255.0f; if( k > 255 ) k = 255; else if( k < 0 ) k = 0; g = intFloor(k);
00093 k = b + v.z * 255.0f; if( k > 255 ) k = 255; else if( k < 0 ) k = 0; b = intFloor(k);
00094 return *this; }
00095 inline Color &operator*=(const Vector3 &v) { float k;
00096 k = r * v.x; if( k > 255 ) k = 255; else if( k < 0 ) k = 0; r = intFloor(k);
00097 k = g * v.y; if( k > 255 ) k = 255; else if( k < 0 ) k = 0; g = intFloor(k);
00098 k = b * v.z; if( k > 255 ) k = 255; else if( k < 0 ) k = 0; b = intFloor(k);
00099 return *this; }
00100 inline Color &operator+=(const Vector4 &v) { float k;
00101 k = r + v.x * 255.0f; if( k > 255 ) k = 255; else if( k < 0 ) k = 0; r = intFloor(k);
00102 k = g + v.y * 255.0f; if( k > 255 ) k = 255; else if( k < 0 ) k = 0; g = intFloor(k);
00103 k = b + v.z * 255.0f; if( k > 255 ) k = 255; else if( k < 0 ) k = 0; b = intFloor(k);
00104 k = a + v.w * 255.0f; if( k > 255 ) k = 255; else if( k < 0 ) k = 0; a = intFloor(k);
00105 return *this; }
00106 inline Color &operator*=(const Vector4 &v) { float k;
00107 k = r * v.x; if( k > 255 ) k = 255; else if( k < 0 ) k = 0; r = intFloor(k);
00108 k = g * v.y; if( k > 255 ) k = 255; else if( k < 0 ) k = 0; g = intFloor(k);
00109 k = b * v.z; if( k > 255 ) k = 255; else if( k < 0 ) k = 0; b = intFloor(k);
00110 k = a * v.w; if( k > 255 ) k = 255; else if( k < 0 ) k = 0; a = intFloor(k);
00111 return *this; }
00112
00113 inline void toVector3( Vector3 &v ) const { v.x = float(r)*(1.0f/255.0f); v.y = float(g)*(1.0f/255.0f); v.z = float(b)*(1.0f/255.0f); }
00114 inline void toVector4( Vector4 &v ) const { v.x = float(r)*(1.0f/255.0f); v.y = float(g)*(1.0f/255.0f); v.z = float(b)*(1.0f/255.0f); v.w = float(a)*(1.0f/255.0f); }
00115 inline Vector3 toVector3( ) const { return Vector3(float(r)*(1.0f/255.0f), float(g)*(1.0f/255.0f), float(b)*(1.0f/255.0f)); }
00116 inline Vector4 toVector4( ) const { return Vector4(float(r)*(1.0f/255.0f), float(g)*(1.0f/255.0f), float(b)*(1.0f/255.0f), float(a)*(1.0f/255.0f)); }
00117
00118 UINT8 b,g,r,a;
00119 };
00120 #pragma pack( pop )
00121
00122
00123
00124
00125 #endif