(when (<= (abs (- v1 v2)) value-range)\r
t))\r
(t\r
- (when (and (<= (hue-difference-fixnum h1 h2) hue-range)\r
+ (when (and (<= (abs (hue-difference-fixnum h1 h2)) hue-range)\r
(<= (abs (- v1 v2)) value-range)\r
(<= (abs (- s1 s2)) saturation-range))\r
t))))\r
\r
(defun hue-difference (h1 h2)\r
"Return difference between two hues around 360 degree circle"\r
- (when (and h1 h2)\r
+ (cond\r
+ ((and (null h1) (null h2))\r
+ t)\r
+ ((or (null h1) (null h2))\r
+ 360)\r
+ (t\r
(let ((diff (- h2 h1)))\r
(cond\r
((< diff -180)\r
((> diff 180)\r
(- (- 360 diff)))\r
(t\r
- diff)))))\r
+ diff))))))\r
\r
\r
(defun hue-difference-fixnum (h1 h2)\r
"Return difference between two hues around 360 degree circle"\r
- (when (and h1 h2)\r
+ (cond\r
+ ((and (null h1) (null h2))\r
+ t)\r
+ ((or (null h1) (null h2))\r
+ 360)\r
+ (t\r
(locally (declare (type fixnum h1 h2))\r
(let ((diff (- h2 h1)))\r
(cond\r
((> diff 180)\r
(- (- 360 diff)))\r
(t\r
- diff))))))\r
-
\ No newline at end of file
+ diff)))))))\r
+ \r
,@(when docp
`((setf (documentation ',var 'variable) ,doc)))
(define-symbol-macro ,var ,backing-var))))
+
+(defmacro def-cached-vector (name element-type)
+ (let ((get-name (concat-symbol "get-" name "-vector"))
+ (release-name (concat-symbol "release-" name "-vector"))
+ (table-name (concat-symbol "*cached-" name "-table*"))
+ (lock-name (concat-symbol "*cached-" name "-lock*")))
+ `(eval-when (:compile-toplevel :load-toplevel :execute)
+ (defvar ,table-name (make-hash-table :test 'equal))
+ (defvar ,lock-name (kmrcl::make-lock ,name))
+
+ (defun ,get-name (size)
+ (kmrcl::with-lock-held (,lock-name)
+ (let ((buffers (gethash (cons size ,element-type) ,table-name)))
+ (if buffers
+ (let ((buffer (pop buffers)))
+ (setf (gethash (cons size ,element-type) ,table-name) buffers)
+ buffer)
+ (make-array size :element-type ,element-type)))))
+
+ (defun ,release-name (buffer)
+ (kmrcl::with-lock-held (,lock-name)
+ (let ((buffers (gethash (cons (array-total-size buffer)
+ ,element-type)
+ ,table-name)))
+ (setf (gethash (cons (array-total-size buffer)
+ ,element-type) ,table-name)
+ (cons buffer buffers))))))))
+