2 * Integer only conversion functions between HSV and RGB
7 // TODO fix these buggy macros
8 #define max(x,y) ((x>y) ? x:y)
9 #define min(x,y) ((x>y) ? y:x)
10 #define min3(x,y,z) (min(min(x,y),z))
11 #define max3(x,y,z) (max(max(x,y),z))
14 rgb_color hsv2rgb(hsv_color hsv)
16 // From : http://qscribble.blogspot.fr/2008/06/integer-conversion-from-hsl-to-rgb.html
20 rgb_color rgb = {0, 0, 0};
26 int sextant = (h*6)/256;
28 int f = h - (sextant*256)/6;
30 int p = (v * (256 - s))/256;
31 int q = (v * (256*43 - s*f))/(256*43);
32 int t = (v * (256*43 - s*(43-f)))/(256*43);
34 // Corrige les erreurs dues aux arrondis
35 p = max(min(p, 255), 0);
36 q = max(min(q, 255), 0);
37 t = max(min(t, 255), 0);
40 case 0: rgb.r = v; rgb.g = t; rgb.b = p; break;
41 case 1: rgb.r = q; rgb.g = v; rgb.b = p; break;
42 case 2: rgb.r = p; rgb.g = v; rgb.b = t; break;
43 case 3: rgb.r = p; rgb.g = q; rgb.b = v; break;
44 case 4: rgb.r = t; rgb.g = p; rgb.b = v; break;
45 default:rgb.r = v; rgb.g = p; rgb.b = q; break;
51 hsv_color rgb2hsv(rgb_color rgb)
53 // From : http://www.ruinelli.ch/rgb-to-hsv
54 hsv_color hsv = {0, 0, 0};
57 min = min3(rgb.r, rgb.g, rgb.b);
58 max = max3(rgb.r, rgb.g, rgb.b);
70 hsv.s = (delta)*255 / max;
73 hsv.h = (rgb.g - rgb.b)*42/delta; // between yellow & magenta
75 hsv.h = 120 + (rgb.b - rgb.r)*42/delta; // between cyan & yellow
77 hsv.h = 240 + (rgb.r - rgb.g)*42/delta; // between magenta & cyan