One Quickie


Converting HSL to RGB (Graphics->General)
// Based on Foley and van Dam algorithm.
void ConvertHSLToRGB (const CGFloat *hslComponents, CGFloat *rgbComponents) {
    CGFloat hue = hslComponents[0];
    CGFloat saturation = hslComponents[1];
    CGFloat lightness = hslComponents[2];

    CGFloat temp1, temp2;
    CGFloat rgb[3];  // "temp3"

    if (saturation == 0) {
        // Like totally gray man.
        rgb[0] = rgb[1] = rgb[2] = lightness;

    } else {
        if (lightness < 0.5) temp2 = lightness * (1.0 + saturation);
        else                 temp2 = (lightness + saturation) - (lightness * saturation);

        temp1 = (lightness * 2.0) - temp2;

        // Convert hue to 0..1
        hue /= 360.0;

        // Use the rgb array as workspace for our "temp3"s
        rgb[0] = hue + (1.0 / 3.0);
        rgb[1] = hue;
        rgb[2] = hue - (1.0 / 3.0);

        // Magic
        for (int i = 0; i < 3; i++) {
            if (rgb[i] < 0.0)        rgb[i] += 1.0;
            else if (rgb[i] > 1.0)   rgb[i] -= 1.0;

            if (6.0 * rgb[i] < 1.0)      rgb[i] = temp1 + ((temp2 - temp1)
                                                           * 6.0 * rgb[i]);
            else if (2.0 * rgb[i] < 1.0) rgb[i] = temp2;
            else if (3.0 * rgb[i] < 2.0) rgb[i] = temp1 + ((temp2 - temp1)
                                                       * ((2.0 / 3.0) - rgb[i]) * 6.0);
            else                         rgb[i] = temp1;
        }
    }

    // Clamp to 0..1 and put into the return pile.
    for (int i = 0; i < 3; i++) {
        rgbComponents[i] = MAX (0.0, MIN (1.0, rgb[i]));
    }

} // ConvertHSLToRGB



borkware home | products | miniblog | rants | quickies | cocoaheads
Advanced Mac OS X Programming book

webmonster@borkware.com