(in-package #:color) (defun hsl->rgb (h s l) (declare (optimize (speed 3) (safety 0)) ((single-float 0.0 1.0) h s l)) (labels ((hue-to-rgb (p q tt) (declare (single-float p q tt)) (setf tt (mod tt 1)) (cond ((< tt (float (/ 1 6))) (+ p (* (- q p) 6 tt))) ((< tt (/ 1 2)) q) ((< tt (float (/ 2 3))) (+ p (* (- q p) 6 (- (/ 2 3) tt)))) (t p)))) (if (= s 0) (values l l l) (let* ((q (if (< l 0.5) (* l (1+ s)) (+ l s (- (* l s))))) (p (- (* 2 l) q))) (values (hue-to-rgb p q (+ h (/ 1 3))) (hue-to-rgb p q h) (hue-to-rgb p q (- h (/ 1 3))))))))