00001
00002 #include <cmath>
00003
00004 #include "colorizer.h"
00005
00006
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)
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;
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