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 {
00015    delete cache;
00016    cache = new Cache();
00017 
00018    for ( int r = 0; r < 256; ++r )
00019       for ( int g = 0; g < 256; ++g )
00020          if ( g < r ) {
00021             HSV hsv = rgb2hsv(r,g);
00022             for ( int player = 0; player < 9; ++player ) {
00023                if ( sat[player] == true )
00024                   cache->col[player][r][g] = hsv2rgb( HSV(playerAngles[player], hsv.s, hsv.v) );
00025                else
00026                   cache->col[player][r][g] = hsv2rgb( HSV(playerAngles[player], 0, hsv.v) );
00027             }
00028          }
00029 }
00030 
00031 ColorSwitch::HSV ColorSwitch::rgb2hsv( int r, int g)
00032 {
00033    float max = float(r) / 255.0;
00034    float min = float(g) / 255.0;
00035 
00036    float delta = max - min;
00037 
00038    HSV hsv;
00039    hsv.s = int(ceil((delta / max) * 255));
00040    hsv.v = r;
00041 
00042    return hsv;
00043 }
00044 
00045 DI_Color ColorSwitch::hsv2rgb( HSV hsv)
00046 {
00047    float h = float(hsv.h) / 360;
00048    float s = float(hsv.s) / 255;
00049    float v = float(hsv.v) / 255;
00050 
00051 
00052    if (hsv.s == 0) { // grey
00053       return DI_Color(hsv.v, hsv.v, hsv.v);
00054    } else {
00055       float h2 = h * 6;
00056       if (h2 >= 6)
00057          h2 = 0; //muss kleiner als 1 sein
00058 
00059       float var_i = floor(h2);
00060 
00061       float var_1 = v * (1 - s);
00062       float var_2 = v * (1 - s * (h2 - var_i));
00063       float var_3 = v * (1 - s * (1 - (h2 - var_i)));
00064 
00065       float var_r, var_g, var_b;
00066       if ( var_i == 0) {
00067          var_r = v;
00068          var_g = var_3;
00069          var_b = var_1;
00070       } else if (var_i == 1) {
00071          var_r = var_2;
00072          var_g = v;
00073          var_b = var_1;
00074       } else if (var_i == 2) {
00075          var_r = var_1;
00076          var_g = v;
00077          var_b = var_3;
00078       } else if (var_i == 3) {
00079          var_r = var_1;
00080          var_g = var_2;
00081          var_b = v;
00082       } else if (var_i == 4) {
00083          var_r = var_3;
00084          var_g = var_1;
00085          var_b = v;
00086       } else {
00087          var_r = v;
00088          var_g = var_1;
00089          var_b = var_2;
00090       }
00091       return DI_Color( int( ceil( var_r * 255 )),
00092                        int( ceil( var_g * 255 )),
00093                        int( ceil( var_b * 255 )));
00094    }
00095 
00096 }
00097 
00098 ColorSwitch::ColorSwitch() : cache(NULL)
00099 {
00100 }
00101 /*
00102 DI_Color ColorSwitch::switchC( int player, int r, int g, int b)
00103 {
00104    if ( g == b && r > g) {
00105       if ( !cache )
00106          generate();
00107 
00108       return cache->col[player][r][g];
00109    } else {
00110       return DI_Color(r,g,b);
00111    }
00112 }
00113 */
00114 
00115 ColorSwitch colorSwitch;
00116 

Generated on Mon May 21 01:26:30 2012 for Advanced Strategic Command by  doxygen 1.5.1