rgba.h

Go to the documentation of this file.
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     //inline functions to avoid overhead of the call,
00046     //especially used for convert_trait
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       //mixes the 2 colors according to the ammount of transparency
00095       void overlay(T r_,T g_,T b_,T a_)
00096   {
00097     //assumption that alpha take a value between 0 and 255
00098     //should be corrected according to the type T
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       //overload casting to double
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       //overload casting to unsigned char
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  

[GNU/Linux] [Qt] [Mesa] [STL] [Lapack] [Boost] [Magick++] [Xalan-C and Xerces-C] [doxygen] [graphviz] [FFTW] [popt] [xine] [Gnuplot] [gnu-arch] [gcc] [gstreamer] [autoconf/automake/make] [freshmeat.net] [opensource.org] [sourceforge.net] [MMVL]
mimas 2.1 - Copyright Mon Oct 30 11:31:17 2006, Bala Amavasai, Stuart Meikle, Arul Selvan, Fabio Caparrelli, Jan Wedekind, Manuel Boissenin, ...