/* * FloatImg library * HUE - SATURATION - VALUE */ #include #include #include #include #include "../floatimg.h" extern int verbosity; /* --------------------------------------------------------------------- */ /* helper functions */ static float maxi3f(float a, float b, float c) { return ((a > b)? (a > c ? a : c) : (b > c ? b : c)); } static float mini3f(float a, float b, float c) { return ((a < b)? (a < c ? a : c) : (b < c ? b : c)); } static int pseudoeq(float a, float b) { return (fabsf(a-b)<0.00000000000001); // UGLY HACK ??? } /* --------------------------------------------------------------------- */ /* * WARNING : ALL THIS CODE IS SHIT */ int fimg_rgb2hsv(float rgb[3], float hsv[3], float scale) { // float h, s, v; float cmin, cmax, diff; // scale input value to [0..1] rgb[0] /= scale; rgb[1] /= scale; rgb[2] /= scale; hsv[0] = hsv[1] = hsv[2] = -12345.6789; cmin = mini3f(rgb[0], rgb[1], rgb[2]); cmax = maxi3f(rgb[0], rgb[1], rgb[2]); diff = cmax - cmin; if (pseudoeq(cmax, cmin)) hsv[0] = 0.0; else if (pseudoeq(cmax, rgb[0])) hsv[0] = fmod((60 * ((rgb[1] - rgb[2]) / diff) + 360), 360.0); else if (pseudoeq(cmax, rgb[1])) hsv[0] = fmod((60 * ((rgb[2] - rgb[0]) / diff) + 120), 360.0); else if (pseudoeq(cmax, rgb[2])) hsv[0] = fmod((60 * ((rgb[0] - rgb[1]) / diff) + 240), 360.0); if (pseudoeq(cmax, 0.0)) hsv[1] = 0.0; else hsv[1] = (diff / cmax) / 100.0; hsv[2] = cmax * 100.0; /* WHAT THE FUCK ? */ #if DEBUG_LEVEL fprintf(stderr, "cmin/cmax %f %f\n", cmin, cmax); #endif return 0; } /* --------------------------------------------------------------------- */ int fimg_essai_hsv(char *fname) { float colors[3], values[3]; int foo, r, g, b; #define INC 16 for (r=0; r<255; r+=INC) { for (g=0; g<255; g+=INC) { for (b=0; b<255; b+=INC) { printf("%4d %4d %4d ", r, g, b); colors[0] = (float)r; colors[1] = (float)g; colors[2] = (float)b; foo = fimg_rgb2hsv(colors, values, 255.0); if (foo) { exit(1); } printf(" %9.5f %9.5f %9.5f\n", values[0], values[1], values[2]); } } } return -1; } /* --------------------------------------------------------------------- */