00001 #ifndef RGBA_H
00002 #define RGBA_H
00003
00004 #include <cmath>
00005 #include "colour_sensitivity.h"
00006
00007 namespace mimas {
00008
00009 template <typename T>
00010 class rgba
00011 {
00012 protected:
00013 T b,g,r,a;
00014
00015 public:
00016
00017 rgba(void)
00018 {
00019 r=g=b=a=T();
00020 }
00021
00022 template< class U >
00023 rgba(const rgba< U > &rhs)
00024 {
00025 r = (T)rhs.getRed();
00026 g = (T)rhs.getGreen();
00027 b = (T)rhs.getBlue();
00028 a = (T)rhs.getAlpha();
00029 }
00030
00031 rgba( T _r, T _g, T _b, T _a = T() ):
00032 b(_b), g(_g), r(_r), a(_a)
00033 {
00034 }
00035
00036 template< typename U >
00037 explicit rgba(const U &val)
00038 {
00039 r=(T)val;
00040 g=(T)val;
00041 b=(T)val;
00042 a=T();
00043 }
00044
00045
00046
00047 inline T getRed(void) const
00048 {
00049 return r;
00050 }
00051
00052 inline T getGreen(void) const
00053 {
00054 return g;
00055 }
00056
00057 inline T getBlue(void) const
00058 {
00059 return b;
00060 }
00061
00062 inline T getAlpha(void) const
00063 {
00064 return a;
00065 }
00066
00067
00068 void setRed(T val)
00069 {
00070 r=val;
00071 }
00072
00073 void setGreen(T val)
00074 {
00075 g=val;
00076 }
00077
00078 void setBlue(T val)
00079 {
00080 b=val;
00081 }
00082
00083 void setAlpha(T val)
00084 {
00085 a=val;
00086 }
00087
00088 void set(T val)
00089 {
00090 r=g=b=a=val;
00091 }
00092
00093
00094
00095 void overlay(T r_,T g_,T b_,T a_)
00096 {
00097
00098
00099 r = ((255 - a_)* r + a_ * r_)/255;
00100 g = ((255 - a_)* g + a_ * g_)/255;
00101 b = ((255 - a_)* b + a_ * b_)/255;
00102 }
00103
00104
00105 operator double(void) const
00106 {
00107 return
00108 SENSITIVITY_RED * r + SENSITIVITY_GREEN * g + SENSITIVITY_BLUE * b;
00109 }
00110
00111 operator float(void) const
00112 {
00113 return
00114 SENSITIVITY_RED * r + SENSITIVITY_GREEN * g + SENSITIVITY_BLUE * b;
00115 }
00116
00117 operator short int(void) const
00118 {
00119 const int
00120 rwgt = (int)( SENSITIVITY_RED * 65536 ),
00121 gwgt = (int)( SENSITIVITY_GREEN * 65536 ),
00122 bwgt = (int)( SENSITIVITY_BLUE * 65536 );
00123 return (short int)( ( rwgt * r + gwgt * g + bwgt * b ) >> 16 );
00124 }
00125
00126 operator int(void) const
00127 {
00128 return (int)operator double();
00129 }
00130
00131
00132 operator unsigned char(void) const
00133 {
00134 const int
00135 rwgt = (int)( SENSITIVITY_RED * 65536 ),
00136 gwgt = (int)( SENSITIVITY_GREEN * 65536 ),
00137 bwgt = (int)( SENSITIVITY_BLUE * 65536 );
00138 return (unsigned char)( ( rwgt * r + gwgt * g + bwgt * b ) >> 16 );
00139 }
00140
00142 bool operator==(const rgba<T> &rhs)
00143 {
00144 return r == rhs.r && g == rhs.g && b == rhs.b && a == rhs.a;
00145 }
00146
00148 bool operator!=(const rgba<T> &rhs)
00149 {
00150 return !(r == rhs.r && g == rhs.g && b == rhs.b && a == rhs.a);
00151 }
00152
00153 rgba< T > operator+( const rgba< T > &o ) const
00154 {
00155 return rgba< T >( r + o.r, g + o.g, b + o.b );
00156 }
00157
00158 rgba< T > operator-( const rgba< T > &o ) const
00159 {
00160 return rgba< T >( r - o.r, g - o.g, b - o.b );
00161 }
00162
00163 rgba< T > &operator+=( const rgba< T > &o )
00164 {
00165 r += o.r; g += o.g; b += o.b;
00166 return *this;
00167 }
00168
00169 rgba< T > &operator-=( const rgba< T > &o )
00170 {
00171 r -= o.r; g -= o.g; b -= o.b;
00172 return *this;
00173 }
00174
00175 double getHue(void) const;
00176 double getSaturation(void) const;
00177
00178 };
00179
00180 }
00181
00182 #include "rgba.tcc"
00183
00184 #endif
00185