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