Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/* HSV to RGB conversion from Ken Fishkin, pixar!fishkin */
void hsb2rgb(float vH, float vS, float vB, float *rp, float *gp, float *bp)
{
float h = 6.0 * (vH < 0 ? vH + (1 - (int)vH) : vH - (int)vH);
int sextant = (int) h; /* implicit floor */
float fract = h - sextant;
float vsf = vS*vB*fract;
float min = (1-vS)*vB;
float mid1 = min + vsf;
float mid2 = vB - vsf;
switch (sextant%6) {
case 0: *rp = vB; *gp = mid1; *bp = min; break;
case 1: *rp = mid2; *gp = vB; *bp = min; break;
case 2: *rp = min; *gp = vB; *bp = mid1; break;
case 3: *rp = min; *gp = mid2; *bp = vB; break;
case 4: *rp = mid1; *gp = min; *bp = vB; break;
case 5: *rp = vB; *gp = min; *bp = mid2; break;
}
}
void rgb2hsb(float r, float g, float b, float *hp, float *sp, float *bp)
{
float cRGB[3];
int min, max;
float dv;
cRGB[0] = r, cRGB[1] = g, cRGB[2] = b;
if(cRGB[0] < cRGB[1])
min = 0, max = 1;
else
min = 1, max = 0;
if(cRGB[min] > cRGB[2]) min = 2;
else if(cRGB[max] < cRGB[2]) max = 2;
*bp = cRGB[max];
dv = cRGB[max] - cRGB[min];
if(dv == 0) {
*hp = 0; /* hue undefined, use 0 */
*sp = 0;
} else {
float dh = (cRGB[3 - max - min] - cRGB[min]) / (6*dv);
*hp = (3+max-min)%3==1 ? max/3.0 + dh : max/3.0 - dh;
if(*hp < 0) *hp += 1 + (int)*hp;
if(*hp > 1) *hp -= (int)*hp;
*sp = dv / cRGB[max];
}
}