home *** CD-ROM | disk | FTP | other *** search
- #ifndef __COLOR_H__
- #define __COLOR_H__
-
- class Color
- {
- class Table
- {
- unsigned char data[256][256];
- public:
- Table();
- unsigned const char * row(unsigned char alpha)const
- {
- return data[alpha];
- }
- };
- static const Table alpha_table;
- public:
- Color()
- {}
- Color(unsigned char r, unsigned char g, unsigned char b, unsigned char a=255)
- : r(r), g(g), b(b), a(a)
- {}
-
- union
- {
- struct
- {
- unsigned char b,g,r,a;
- };
- unsigned pack;
- };
-
- bool operator==(const Color & v)const
- {
- return pack == v.pack;
- // return r == v.r && g == v.g && b == v.b;
- }
-
- bool operator!=(const Color & v)const
- {
- return pack != v.pack;
- // return r != v.r || g != v.g || b != v.b;
- }
-
- const Color & operator+= (const Color & v)
- {
- int rr = r + v.r;
- int gg = g + v.g;
- int bb = b + v.b;
- int aa = a + v.a;
- r = (rr < 255) ? rr : 255;
- g = (gg < 255) ? gg : 255;
- b = (bb < 255) ? bb : 255;
- a = (aa < 255) ? aa : 255;
- return *this;
- }
-
- Color operator* (double v)
- {
- int rr = int( r*v );
- int gg = int( g*v );
- int bb = int( b*v );
- int aa = int( a*v );
- rr = (rr < 255) ? rr : 255;
- gg = (gg < 255) ? gg : 255;
- bb = (bb < 255) ? bb : 255;
- aa = (aa < 255) ? aa : 255;
- return Color( rr, gg, bb, aa );
- }
-
- Color operator/ (double v)
- {
- return operator* (1.0/v);
- }
-
- Color bilinear(Color dst,float koef)
- {
- Color res;
- res.r = unsigned char( (1-koef) * r + koef * dst.r );
- res.g = unsigned char( (1-koef) * g + koef * dst.g );
- res.b = unsigned char( (1-koef) * b + koef * dst.b );
- res.a = unsigned char( (1-koef) * a + koef * dst.a );
- return res;
- }
- void table_bilinear(const Color & src,unsigned char alpha)
- {
- const unsigned char * row_src = alpha_table.row( alpha );
- const unsigned char * row = alpha_table.row( 255 - alpha );
-
- r = row_src[src.r] + row[r];
- g = row_src[src.g] + row[g];
- b = row_src[src.b] + row[b];
- // a = row_src[src.a] + row[a]; ┬√ΩΦφ≤≥ε ≡αΣΦ ±Ωε≡ε±≥Φ
- }
- };
-
- namespace Converter
- {
- const char * convert( const Color & val );
- bool convert( const char * stt, Color * val );
- }
-
- inline Color operator+ (const Color & v1,const Color & v2)
- {
- return Color( v1 ) += v2;
- }
-
- #endif //__COLOR_H__