Untitled
public text v1 · immutablestatic void
ewl_spectrum_rgb_from_hsv(Ewl_Spectrum *sp)
{
DENTER_FUNCTION(DLEVEL_STABLE);
DCHECK_PARAM_PTR("sp", sp);
if (sp->hsv.s == 0)
{
unsigned int i;
i = ((sp->hsv.v / 100.0) * 255.0) + 0.5;
sp->rgb.r = i;
sp->rgb.g = i;
sp->rgb.b = i;
}
else
{
double h, s, v, f, p, q, t, vs, vsf;
int i;
if (sp->hsv.h == 360) sp->hsv.h = 0;
h = sp->hsv.h / 60.0;
i = h;
f = h - (double)i;
v = sp->hsv.v / 100.0;
s = sp->hsv.s / 100.0;
v *= 255.0;
vs = v * s;
vsf = vs * f;
p = v - vs;
q = v - vsf;
t = v - vs + vsf;
s *= 255.0;
printf("i%d v%f p%f q%f t%f\n", i, v, p, q, t);
/* make sure these truncate the right way */
v += 0.5;
s += 0.5;
p += 0.5;
q += 0.5;
t += 0.5;
switch(i)
{
case 0:
sp->rgb.r = v;
sp->rgb.g = t;
sp->rgb.b = p;
break;
case 1:
sp->rgb.r = q;
sp->rgb.g = v;
sp->rgb.b = p;
break;
case 2:
sp->rgb.r = p;
sp->rgb.g = v;
sp->rgb.b = t;
break;
case 3:
sp->rgb.r = p;
sp->rgb.g = q;
sp->rgb.b = v;
break;
case 4:
sp->rgb.r = t;
sp->rgb.g = p;
sp->rgb.b = v;
break;
case 5:
sp->rgb.r = v;
sp->rgb.g = p;
sp->rgb.b = q;
break;
}
}
DLEAVE_FUNCTION(DLEVEL_STABLE);
}