From 23bc4b080b6f04cf8f87ed1a000f0cd07d168857 Mon Sep 17 00:00:00 2001 From: Shinmera Date: Fri, 17 Jan 2020 09:58:40 +0100 Subject: [PATCH] Add lerp and gradient evaluation functions. --- ops.lisp | 16 ++++++++++++++++ package.lisp | 4 +++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/ops.lisp b/ops.lisp index 6316ba0..485355b 100644 --- a/ops.lisp +++ b/ops.lisp @@ -235,3 +235,19 @@ (expt (- 1 (exp (* exposure (- (g color))))) (/ gamma)) (expt (- 1 (exp (* exposure (- (b color))))) (/ gamma)) (a color))) + +(defun lerp (x a b) + (macrolet ((lerp (f) + `(+ (* (,f a) (- 1 x)) (* (,f b) x)))) + (color (lerp r) (lerp g) (lerp b) (lerp a)))) + +(defun gradient (x stops) + (if (<= x 0) + (cdr (first stops)) + (loop for prev = (first stops) then next + for next in (rest stops) + do (destructuring-bind (px . pc) prev + (destructuring-bind (nx . nc) next + (when (<= px x nx) + (return (lerp (/ (- x px) (- nx px)) pc nc))))) + finally (return (cdr prev))))) diff --git a/package.lisp b/package.lisp index 6766221..2d651b9 100644 --- a/package.lisp +++ b/package.lisp @@ -54,7 +54,9 @@ #:map-color #:gamma-adjust #:reinhard-map - #:exposure-map) + #:exposure-map + #:lerp + #:gradient) ;; constants.lisp (:export #:define-color))