View Raw SPL
/* convert hsv to rgb values */
hsv2rgb(h, s, v)
{
local r, g, b, hi, f, p, q, t, nr = -1;
if (argc == 1)
{
if (length(h) == 3)
{
nr = 3;
h = transpose(h);
}
if (numcols(h) == 3)
{
s = col(h, 2);
v = col(h, 3);
h = col(h, 1);
}
else if (numrows(h) == 3)
{
nr = 3;
s = h[3, ..];
v = h[2, ..];
h = h[1, ..];
}
else
{
/* assume image */
(r, g, b) = getrgb(h);
(h, s, v) = rgb2hsv(r, g, b);
}
}
else if (argc != 3)
{
error(sprintf("%s - 1 or 3 input arguments required", __FUNC__));
}
hi = int(h * 6);
/* keep in range */
s = hsv2rgb_clip(s, 0, 1);
v = hsv2rgb_clip(v, 0, 1);
f = (h * 6.0) - hi;
p = v * (1 - s);
q = v * (1 - f * s);
t = v * (1 - (1 - f) * s);
hi = hi % 6;
r = (hi == 0) * v + (hi == 1) * q + (hi == 2) * p + (hi == 3) * p + (hi == 4) * t + (hi == 5) * v;
g = (hi == 0) * t + (hi == 1) * v + (hi == 2) * v + (hi == 3) * q + (hi == 4) * p + (hi == 5) * p;
b = (hi == 0) * p + (hi == 1) * p + (hi == 2) * t + (hi == 3) * v + (hi == 4) * v + (hi == 5) * q;
if (outargc <= 1)
{
/* cast to series */
r = {r};
g = {g};
b = {b};
}
/* label */
if (nr == 3)
{
setvunits(r, "RGB");
}
else
{
if (isarray(r)) setvunits(r, "Red");
if (isarray(g)) setvunits(g, "Green");
if (isarray(b)) setvunits(b, "Blue");
}
if (outargc > 1)
{
return(r, g, b);
}
else if (nr == 3)
{
return({r, g, b});
}
else
{
return(ravel(r, g, b));
}
}
/* clip series or scalar */
hsv2rgb_clip(s, lo, hi)
{
local was_scalar;
was_scalar = isscalar(s);
s = clip({s}, lo, hi);
if (was_scalar)
{
s = s[1];
}
return(s);
}