Skip to content

Commit 48dfbd8

Browse files
author
p
committed
generate sparkline base dynamically (fix #28)
1 parent c085d33 commit 48dfbd8

File tree

1 file changed

+43
-24
lines changed

1 file changed

+43
-24
lines changed

symon.el

Lines changed: 43 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -156,13 +156,27 @@ rendering."
156156
;; + sparkline generator
157157

158158
;; sparkline-types are internally a symbol with property
159-
;; 'symon-sparkline-type associated to a 2d-bool-vector.
159+
;; 'symon-sparkline-type associated to a function that generates a
160+
;; 2d-bool-vector.
161+
162+
(defvar symon--sparkline-base-cache
163+
[nil symon-sparkline-width symon-sparkline-height nil])
164+
(defun symon--get-sparkline-base ()
165+
(unless (and (eq (aref symon--sparkline-base-cache 0) symon-sparkline-type)
166+
(= (aref symon--sparkline-base-cache 1) symon-sparkline-width)
167+
(= (aref symon--sparkline-base-cache 2) symon-sparkline-height))
168+
(aset symon--sparkline-base-cache 0 symon-sparkline-type)
169+
(aset symon--sparkline-base-cache 1 symon-sparkline-width)
170+
(aset symon--sparkline-base-cache 2 symon-sparkline-height)
171+
(aset symon--sparkline-base-cache 3
172+
(funcall (get symon-sparkline-type 'symon-sparkline-type))))
173+
(copy-sequence (aref symon--sparkline-base-cache 3)))
160174

161175
(defun symon--make-sparkline (list &optional minimum maximum)
162176
"make sparkline image from LIST."
163177
(let ((num-samples (length list)))
164178
(unless (zerop num-samples)
165-
(let* ((image-data (copy-sequence (get symon-sparkline-type 'symon-sparkline-type)))
179+
(let* ((image-data (symon--get-sparkline-base))
166180
(maximum (if maximum (float maximum) 100.0))
167181
(minimum (if minimum (float minimum) 0.0))
168182
(topmargin (1- symon-sparkline-thickness))
@@ -615,28 +629,33 @@ while(1) \
615629
(dotimes (y/2 (/ symon-sparkline-height 2))
616630
(aset vec (+ (* (* y/2 2) symon-sparkline-width) x) t)))
617631

618-
(put 'plain 'symon-sparkline-type
619-
(make-bool-vector (* symon-sparkline-height symon-sparkline-width) nil))
620-
621-
(put 'bounded 'symon-sparkline-type
622-
(let ((vec (copy-sequence (get 'plain 'symon-sparkline-type))))
623-
(symon--sparkline-draw-horizontal-grid vec 0)
624-
(symon--sparkline-draw-horizontal-grid vec (1- symon-sparkline-height))
625-
vec))
626-
627-
(put 'boxed 'symon-sparkline-type
628-
(let ((vec (copy-sequence (get 'bounded 'symon-sparkline-type))))
629-
(symon--sparkline-draw-vertical-grid vec 0)
630-
(symon--sparkline-draw-vertical-grid vec (1- symon-sparkline-width))
631-
vec))
632-
633-
(put 'gridded 'symon-sparkline-type
634-
(let ((vec (copy-sequence (get 'boxed 'symon-sparkline-type))))
635-
(symon--sparkline-draw-horizontal-grid vec (/ symon-sparkline-height 2))
636-
(symon--sparkline-draw-vertical-grid vec (/ symon-sparkline-width 4))
637-
(symon--sparkline-draw-vertical-grid vec (/ symon-sparkline-width 2))
638-
(symon--sparkline-draw-vertical-grid vec (/ (* symon-sparkline-width 3) 4))
639-
vec))
632+
(defun symon--make-plain-sparkline ()
633+
(make-bool-vector (* symon-sparkline-height symon-sparkline-width) nil))
634+
635+
(defun symon--make-bounded-sparkline ()
636+
(let ((vec (symon--make-plain-sparkline)))
637+
(symon--sparkline-draw-horizontal-grid vec 0)
638+
(symon--sparkline-draw-horizontal-grid vec (1- symon-sparkline-height))
639+
vec))
640+
641+
(defun symon--make-boxed-sparkline ()
642+
(let ((vec (symon--make-bounded-sparkline)))
643+
(symon--sparkline-draw-vertical-grid vec 0)
644+
(symon--sparkline-draw-vertical-grid vec (1- symon-sparkline-width))
645+
vec))
646+
647+
(defun symon--make-gridded-sparkline ()
648+
(let ((vec (symon--make-boxed-sparkline)))
649+
(symon--sparkline-draw-horizontal-grid vec (/ symon-sparkline-height 2))
650+
(symon--sparkline-draw-vertical-grid vec (/ symon-sparkline-width 4))
651+
(symon--sparkline-draw-vertical-grid vec (/ symon-sparkline-width 2))
652+
(symon--sparkline-draw-vertical-grid vec (/ (* symon-sparkline-width 3) 4))
653+
vec))
654+
655+
(put 'plain 'symon-sparkline-type 'symon--make-plain-sparkline)
656+
(put 'bounded 'symon-sparkline-type 'symon--make-bounded-sparkline)
657+
(put 'boxed 'symon-sparkline-type 'symon--make-boxed-sparkline)
658+
(put 'gridded 'symon-sparkline-type 'symon--make-gridded-sparkline)
640659

641660
;; + symon core
642661

0 commit comments

Comments
 (0)