parent
3cf887e103
commit
44165c0a03
@ -0,0 +1,95 @@ |
||||
/*
|
||||
* 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; |
||||
} |
||||
/* --------------------------------------------------------------------- */ |
Loading…
Reference in new issue