home *** CD-ROM | disk | FTP | other *** search
/ Game.EXE 2002 May / Game.EXE_05_2002.iso / Alawar / Lib / Color.h < prev    next >
Encoding:
C/C++ Source or Header  |  2002-03-31  |  2.2 KB  |  108 lines

  1. #ifndef __COLOR_H__
  2. #define __COLOR_H__
  3.  
  4. class Color 
  5. {
  6.     class Table
  7.     {
  8.         unsigned char data[256][256];
  9.     public:
  10.         Table();
  11.         unsigned const char * row(unsigned char alpha)const
  12.         {
  13.             return data[alpha];
  14.         }
  15.     };
  16.     static const Table alpha_table;
  17. public:
  18.     Color()
  19.     {}
  20.     Color(unsigned char r, unsigned char g, unsigned char b, unsigned char a=255)
  21.     :    r(r), g(g), b(b), a(a) 
  22.     {}
  23.  
  24.     union
  25.     {
  26.         struct
  27.         {
  28.             unsigned char b,g,r,a;
  29.         };
  30.         unsigned pack;
  31.     };
  32.  
  33.     bool operator==(const Color & v)const
  34.     {
  35.         return pack == v.pack;
  36. //        return r == v.r && g == v.g && b == v.b; 
  37.     }
  38.  
  39.     bool operator!=(const Color & v)const
  40.     {
  41.         return pack != v.pack;
  42. //        return r != v.r || g != v.g || b != v.b; 
  43.     }
  44.  
  45.     const Color & operator+= (const Color & v)
  46.     {
  47.         int rr = r + v.r;
  48.         int gg = g + v.g;
  49.         int bb = b + v.b;
  50.         int aa = a + v.a;
  51.         r = (rr < 255) ? rr : 255;
  52.         g = (gg < 255) ? gg : 255;
  53.         b = (bb < 255) ? bb : 255;
  54.         a = (aa < 255) ? aa : 255;
  55.         return *this;
  56.     }
  57.  
  58.     Color operator* (double v)
  59.     {
  60.         int rr = int( r*v );
  61.         int gg = int( g*v );
  62.         int bb = int( b*v );
  63.         int aa = int( a*v );
  64.         rr = (rr < 255) ? rr : 255;
  65.         gg = (gg < 255) ? gg : 255;
  66.         bb = (bb < 255) ? bb : 255;
  67.         aa = (aa < 255) ? aa : 255;
  68.         return Color( rr, gg, bb, aa );
  69.     }
  70.  
  71.     Color operator/ (double v)
  72.     {
  73.         return operator* (1.0/v);
  74.     }
  75.  
  76.     Color bilinear(Color dst,float koef)
  77.     {
  78.         Color res;
  79.         res.r = unsigned char( (1-koef) * r + koef * dst.r );
  80.         res.g = unsigned char( (1-koef) * g + koef * dst.g );
  81.         res.b = unsigned char( (1-koef) * b + koef * dst.b );
  82.         res.a = unsigned char( (1-koef) * a + koef * dst.a );
  83.         return res;
  84.     }
  85.     void table_bilinear(const Color & src,unsigned char alpha)
  86.     {
  87.         const unsigned char * row_src = alpha_table.row( alpha );
  88.         const unsigned char * row = alpha_table.row( 255 - alpha );
  89.  
  90.         r = row_src[src.r] + row[r];
  91.         g = row_src[src.g] + row[g];
  92.         b = row_src[src.b] + row[b];
  93. //        a = row_src[src.a] + row[a]; ┬√ΩΦφ≤≥ε ≡αΣΦ ±Ωε≡ε±≥Φ
  94.     }
  95. };
  96.  
  97. namespace Converter
  98. {
  99.     const char * convert( const Color & val );
  100.     bool convert( const char * stt, Color * val );
  101. }
  102.  
  103. inline Color operator+ (const Color & v1,const Color & v2)
  104. {
  105.     return Color( v1 ) += v2;
  106. }
  107.  
  108. #endif //__COLOR_H__