forked from tTh/FloatImg
96 lines
2.2 KiB
C
96 lines
2.2 KiB
C
|
/*
|
||
|
* FloatImg library
|
||
|
* HUE - SATURATION - VALUE
|
||
|
*/
|
||
|
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <string.h>
|
||
|
#include <math.h>
|
||
|
#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;
|
||
|
}
|
||
|
/* --------------------------------------------------------------------- */
|