stew

HSL

HSL is on of the most common cylindrical-coordinate representations of values in a RGB color model.

<?php

/*

Can convert hsl() colors in your css document into rgb().

EXAMPLE USAGE:

header('content-type: text/css');
$css =<<<EHTML

.test1 { color: hsl(150,100%,50%); }
.test2 { color: hsla(220,10%,40%,0.5); }
.test3 { color: rgb(100,50,200); }

EHTML;

$hsl = new hsl2rgb;
$hsl->css = $css;
$hsl->convert();
echo $hsl->css;

*/

class hsl2rgb
{
    public function convert() {
        preg_match_all("/hsla?\(([^\)]+)\)/i",$this->css,$match,PREG_PATTERN_ORDER);
        foreach($match[1] as $k=>$v) {
            $hsl = self::hsl(self::fromString($v));
            $rgb = "rgb";
            if ($hsl[3]) {
                $alpha = ",".$hsl[3];
                $rgb = "rgba";
            }
            $this->css = str_replace($match[0][$k], "$rgb(".$hsl[0].",".$hsl[1].",".$hsl[2].$alpha.")",$this->css);
        }
    }
    private function fromString($str) {
        $x = preg_split('/[, ]/', $str, -1, PREG_SPLIT_NO_EMPTY);
        $h = $x[0];
        $s = substr($x[1], -1) == '%' ? ((float) $x[1]) : (float) $x[1]*100;
        $l = substr($x[2], -1) == '%' ? ((float) $x[2]) : (float) $x[2]*100;
        return array($h, $s, $l, $x[3]);
    }
    private function hsl($hsl) { 
        $h = $hsl[0]/360;
        $s = $hsl[1]/100;
        $l = $hsl[2]/100;
        if ($s == 0.0) { $r = $g = $b = $l; }
        else {
            if ($l<=0.5) { $m2 = $l*($s+1); }
            else { $m2 = $l+$s-($l*$s); }
            $m1 = $l*2 - $m2;
            $r = self::hue($m1, $m2, ($h+1/3));
            $g = self::hue($m1, $m2, $h);
            $b = self::hue($m1, $m2, ($h-1/3));
        }
        return array(round($r*255), round($g*255), round($b*255), $hsl[3]);
    }
    private function hue($m1, $m2, $h) {
        if ($h<0) { $h = $h+1; }
        if ($h>1) { $h = $h-1; }
        if ($h*6<1) { return $m1+($m2-$m1)*$h*6; }
        if ($h*2<1) { return $m2; }
        if ($h*3<2) { return $m1+($m2-$m1)*(2/3-$h)*6; }
        return $m1;
    }
}