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
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) {
00053 return DI_Color(hsv.v, hsv.v, hsv.v);
00054 } else {
00055 float h2 = h * 6;
00056 if (h2 >= 6)
00057 h2 = 0;
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
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115 ColorSwitch colorSwitch;
00116