Path: utzoo!mnetor!uunet!husc6!bloom-beacon!mit-eddie!ll-xn!ames!pasteur!ucbvax!ucsfcgl!pixar!fishkin
From: fishkin@pixar.UUCP (Ken Fishkin)
Newsgroups: comp.graphics
Subject: HSL to RGB alg
Message-ID: <1784@pixar.UUCP>
Date: 9 May 88 18:34:03 GMT
Reply-To: fishkin@pixar.UUCP (Ken Fishkin)
Organization: Pixar -- Marin County, California
Lines: 51
Summary: here's one

About a week ago, somebody asked for an HSL to RGB algorithm.

    A while ago, I figured out how to optimize that alg.
so it's just about the same speed as HSV to RGB (the standard is
about twice as slow). We decided it wasn't worth publishing and buried
it in my thesis, but if anybody out there can use it, here it is.

----------------------------------------------------------
/*
* given [h,s,l] on [0..1], return RGB on [0..1]
*/
HSLxRGB(h,s,l,R,G,B)
double h,s,l;
double *R,*G,*B;
{
    double v,min,sv,vsf;
    int sextant;
    double fract;
    double mid1,mid2;

	/* compute V */
    if (l <= 0.5) {
	v = l*(1.0+s);
    } else {
	v = l + s - l*s;
    }
    if (v == 0.0) {
	*R = *G = *B = 0.0;
	return;
    }
    min = l + l - v;
	/* compute S in HSV space */
    sv = (v - min) / v;
	/* HSV to RGB from here on */
    h *= 6.0;
    sextant = (int) h; /* implicit floor */
    fract = h - sextant;
    vsf = v*sv*fract;
    mid1 = min + vsf;
    mid2 = v - vsf;
    switch (sextant) {
    case 0: *R = v; *G = mid1; *B = min; break;
    case 1: *R = mid2; *G = v; *B = min; break;
    case 2: *R = min; *G = v; *B = mid1; break;
    case 3: *R = min; *G = mid2; *B = v; break;
    case 4: *R = mid1; *G = min; *B = v; break;
    case 5: *R = v; *G = min; *B = mid2; break;
    }
}
-- 
Ken Fishkin	...{ucbvax,sun}!pixar!fishkin