(define (array->list a) (let* ( (i (- (length a) 1)) (lout ()) ) (while (<= 0 i) (set! lout (cons (aref a i) lout)) (set! i (- i 1))) lout)) (define (squared a) (* a a)) (define (benday img base-layer dot-size intensity-fn) (gimp-image-undo-freeze img) (let* ( (w (car (gimp-drawable-width base-layer))) (h (car (gimp-drawable-height base-layer))) (layer (car (gimp-layer-copy base-layer 0))) (x 0) (y 0) (bw (* 1.1 1.7321 dot-size)) (bh (* 0.55 dot-size)) (points (cons-array 2 'double)) (one-two 0) ) (gimp-selection-all img) (gimp-edit-clear layer) (gimp-image-add-layer img layer -1) (while (< y h) (set! one-two (list (* 0.5 bw) 1)) (while (not (or (null? one-two) (>= y h))) (set! x (car one-two)) (aset points 1 y) (while (< x w) (aset points 0 x) (let* ((r (* dot-size (sqrt (- 1.0 (intensity-fn base-layer x y)))))) (if (< 2 r) (begin (gimp-ellipse-select img (- x (* 0.5 r)) (- y (* 0.5 r)) r r 2 1 0 0) (gimp-edit-fill layer 0))) ) (set! x (+ x bw)) ) (set! one-two (cdr one-two)) (set! y (+ y bh)) ) ) (gimp-selection-all img) (plug-in-blur 1 img layer) (gimp-selection-clear img) ) (gimp-image-undo-thaw img) ) (let* ( (img (aref (cadr (gimp-image-list)) 0)) ; assumes at least one image (base-layer (car (gimp-image-get-active-layer img)))) (benday img base-layer 19 (lambda (layer x y) (let* ( (a (array->list (cadr (gimp-drawable-get-pixel layer x y)))) (px (mapcar (lambda (b) (if (< 0 b) b (- 128 b))) (butlast a))) (return (/ (apply + px) (length px) 255)) ; assumes px not empty ) (min 1.0 (max 0.0 return)) ) ) ) )