#ifdef G_OS_WIN32 #define WIN32_LEAN_AND_MEAN 1 #include #endif #include #include "funcs.h" #include "palette.h" static float trip_like_i_do_arr[10][3] = { {1.0f, 0.0f, 0.0f}, {1.0f, 0.0f, 1.0f}, {0.0f, 0.0f, 1.0f}, {0.0f, 1.0f, 1.0f}, {0.0f, 1.0f, 0.0f}, {1.0f, 0.5f, 0.0f}, {1.0f, 0.75f, 0.0f}, {0.5f, 0.0f, 1.0f}, {0.0f, 1.0f, 0.5f}, {1.0f, 0.0f, 0.5f}, }; void HSVtoRGB(float *r, float *g, float *b, float h, float s, float v) { int i; float f, p, q, t; if( s == 0 ) { // achromatic (grey) *r = *g = *b = v; return; } h /= 60; // sector 0 to 5 i = (int)floor(h); f = h - i; // factorial part of h p = v * (1 - s); q = v * (1 - s * f); t = v * (1 - s * (1 - f)); switch(i) { case 0: *r = v; *g = t; *b = p; break; case 1: *r = q; *g = v; *b = p; break; case 2: *r = p; *g = v; *b = t; break; case 3: *r = p; *g = q; *b = v; break; case 4: *r = t; *g = p; *b = v; break; default: // case 5: *r = v; *g = p; *b = q; break; } } // r,g,b values are from 0 to 1 // h = [0,360], s = [0,1], v = [0,1] // if s == 0, then h = -1 (undefined) void RGBtoHSV(float r, float g, float b, float *h, float *s, float *v) { float min, max, delta; min = MIN3(r, g, b); max = MAX3(r, g, b); *v = max; // v delta = max - min; if(max != 0) { *s = delta / max; // s } else { // r = g = b = 0 // s = 0, v is undefined *s = 0; *h = -1; return; } if(r == max) { *h = ( g - b ) / delta; // between yellow & magenta } else if(g == max) { *h = 2 + (b - r) / delta; // between cyan & yellow } else { *h = 4 + (r - g) / delta; // between magenta & cyan } *h *= 60; // degrees if(*h < 0) { *h += 360; } } static struct color4f blackandwhite(float value) { struct color4f return_value; return_value.r = value; return_value.g = value; return_value.b = value; return return_value; } //rainbow: Implements a color palette, mapping the scalar 'value' to a rainbow color RGB static struct color4f rainbow(float value) { struct color4f return_value; const float dx = 0.8f; if (value < 0) { value = 0; } if (value > 1) { value = 1; } value = (6 - 2 * dx) * value + dx; return_value.r = (float)max(0.0f, (3 - fabs(value - 4.0f) - fabs(value - 5.0f)) / 2.0f); return_value.g = (float)max(0.0f, (4 - fabs(value - 2.0f) - fabs(value - 4.0f)) / 2.0f); return_value.b = (float)max(0.0f, (3 - fabs(value - 1.0f) - fabs(value - 2.0f)) / 2.0f); return return_value; } static struct color4f puke_like_he_does(float value) { struct color4f return_value; return_value.r = 0; return_value.g = 0; return_value.b = 0; if (value > 0.001) { value *= 100; value = ((int)value) % 10; value /= 10; return_value.r = value; return_value.g = value; return_value.b = value; } return return_value; } static struct color4f trip_like_i_do(float value) { struct color4f return_value; int val; return_value.r = 0; return_value.b = 0; return_value.g = 0; if (value > 0.001) { val = (int)(value * 100) % 10; return_value.r = trip_like_i_do_arr[val][0]; return_value.g = trip_like_i_do_arr[val][1]; return_value.b = trip_like_i_do_arr[val][2]; } return return_value; } static struct color4f colormap_fire(float value) { struct color4f return_value; return_value.r = value; return_value.g = value / 3.0f; return_value.b = 0.0f; return return_value; } #if 0 static struct color4f bluegreenred(float value) { struct color4f return_value; return_value.r = 0; return_value.b = 0; return_value.g = 0; if (value < -0.1) { value -= -0.1f; value /= 0.9f; return_value.b = -value; } else if (value < 0.1) { value += 0.1f; value /= 0.2f; return_value.g = value; } else { value -= 0.1f; value /= 0.9f; return_value.r = value; } return return_value; } #endif //set_palette: Sets three different types of colormaps struct color4f set_palette(int colormap_sort, float value, int num_colors) { struct color4f return_value; return_value.r = 0; return_value.b = 0; return_value.g = 0; value *= num_colors; value = (float)(int)(value); value /= num_colors; switch (colormap_sort) { case PALETTE_BLACKWHITE: return_value = blackandwhite(value); break; case PALETTE_RAINBOW: return_value = rainbow(value); break; case PALETTE_BANDS: value *= 7; value = (float)(int)(value); value/= 7; return_value = rainbow(value); break; case PALETTE_WILRIK: return_value = colormap_fire(value); break; case PALETTE_OLIVER: return_value = trip_like_i_do(value); break; case PALETTE_GREY_BANDS: return_value = puke_like_he_does(value); break; case PALETTE_RED: return_value.r = 1.0f; break; case PALETTE_GREEN: return_value.g = 1.0f; break; case PALETTE_BLUE: return_value.b = 1.0f; break; default: break; } return return_value; }