summaryrefslogtreecommitdiff
path: root/color.lisp
blob: 623007ca0afff49bd3bff65dd38b48316430a3ed (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
(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))))))))