static 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); }