Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members | Related Pages

colorizer.cpp

Go to the documentation of this file.
00001 
00002 #include <cmath>
00003 
00004 #include "colorizer.h"
00005 
00006 // const int ColorSwitch::playerAngles[9] = { 0, 35, 67, 120, 170, 225, 270, 320, 0 };
00007 const int ColorSwitch::playerAngles[9] = { 0, 240, 55, 120, 298, 225, 240, 36, 0 };
00008 
00009 const bool ColorSwitch::sat[9] = { true, true, true, true, true, true, true, true, false };
00010    
00011 
00012 
00013 void ColorSwitch::generate() {
00014    delete cache;
00015    cache = new Cache();
00016 
00017    for ( int r = 0; r < 256; ++r )
00018       for ( int g = 0; g < 256; ++g )
00019          if ( g < r ) {
00020             HSV hsv = rgb2hsv(r,g);
00021             for ( int player = 0; player < 9; ++player ) {
00022                if ( sat[player] == true )
00023                   cache->col[player][r][g] = hsv2rgb( HSV(playerAngles[player], hsv.s, hsv.v) );
00024                else
00025                   cache->col[player][r][g] = hsv2rgb( HSV(playerAngles[player], 0, hsv.v) );
00026             }
00027          }
00028 }
00029                         
00030 ColorSwitch::HSV ColorSwitch::rgb2hsv( int r, int g)
00031 {
00032         float max = float(r) / 255.0;
00033         float min = float(g) / 255.0;
00034 
00035         float delta = max - min;
00036 
00037    HSV hsv;
00038    hsv.s = int(ceil((delta / max) * 255));
00039    hsv.v = r;
00040 
00041    return hsv;
00042 }
00043         
00044 DI_Color ColorSwitch::hsv2rgb( HSV hsv)
00045 {
00046    float h = float(hsv.h) / 360;
00047    float s = float(hsv.s) / 255;
00048    float v = float(hsv.v) / 255;
00049         
00050 
00051         if(hsv.s == 0) // grey
00052         {
00053       return DI_Color(hsv.v, hsv.v, hsv.v);
00054         }
00055         else
00056         {
00057       float h2 = h * 6;                         
00058                 if(h2 >= 6)
00059                         h2 = 0; //muss kleiner als 1 sein
00060 
00061                 float var_i = floor(h2);            
00062                 
00063                 float var_1 = v * (1 - s);
00064                 float var_2 = v * (1 - s * (h2 - var_i));
00065                 float var_3 = v * (1 - s * (1 - (h2 - var_i)));
00066                 
00067       float var_r, var_g, var_b;
00068                 if( var_i == 0) 
00069                 { 
00070                         var_r = v; 
00071                         var_g = var_3; 
00072                         var_b = var_1;
00073                 }
00074                 else if(var_i == 1)
00075                 { 
00076                         var_r = var_2; 
00077                         var_g = v;
00078                         var_b = var_1;
00079                 }
00080                 else if(var_i == 2)
00081                 {
00082                         var_r = var_1;
00083                         var_g = v;
00084                         var_b = var_3; 
00085                 }
00086                 else if(var_i == 3)
00087                 {
00088                         var_r = var_1;
00089                         var_g = var_2;
00090                         var_b = v;
00091                 }
00092                 else if(var_i == 4)
00093                 {
00094                         var_r = var_3;
00095                         var_g = var_1;
00096                         var_b = v;
00097                 }
00098                 else
00099                 { 
00100                         var_r = v;
00101                         var_g = var_1;
00102                         var_b = var_2;
00103                 }
00104       return DI_Color( int( ceil( var_r * 255 )), 
00105                         int( ceil( var_g * 255 )),
00106                         int( ceil( var_b * 255 ))); 
00107         }
00108 
00109 }
00110 
00111 ColorSwitch::ColorSwitch() : cache(NULL) {
00112 }
00113 
00114 DI_Color ColorSwitch::switchC( int player, int r, int g, int b)
00115 {
00116         if( g == b && r > g)
00117         {
00118            if ( !cache )
00119               generate();
00120 
00121                 return cache->col[player][r][g];
00122         }
00123         else
00124         {
00125       return DI_Color(r,g,b);
00126         }
00127 }
00128 
00129 ColorSwitch colorSwitch;
00130 

Generated on Tue Jun 24 01:27:37 2008 for Advanced Strategic Command by  doxygen 1.4.2