unstable/gui/pict (blur):
fix blur wrt smoothing mode refactored code, used macros for inlining added #:pre-inset?
This commit is contained in:
parent
95ce7ec6ed
commit
78c784ed6f
|
@ -18,7 +18,8 @@
|
||||||
[blur
|
[blur
|
||||||
(->* (pict? nneg-real/c)
|
(->* (pict? nneg-real/c)
|
||||||
(nneg-real/c
|
(nneg-real/c
|
||||||
#:mode (or/c 'gaussian 'iterated-box 'single-box))
|
#:mode (or/c 'gaussian 'iterated-box 'single-box)
|
||||||
|
#:pre-inset? any/c)
|
||||||
pict?)]
|
pict?)]
|
||||||
[shadow
|
[shadow
|
||||||
(->* (pict? nneg-real/c)
|
(->* (pict? nneg-real/c)
|
||||||
|
@ -35,10 +36,15 @@
|
||||||
|
|
||||||
;; ----
|
;; ----
|
||||||
|
|
||||||
(define (blur p hbr [vbr hbr] #:mode [mode 'iterated-box] #:auto-inset? [auto-inset? #f])
|
(define (blur p hbr [vbr hbr]
|
||||||
(let ([blurred (*blur (inset p hbr vbr) hbr vbr mode)])
|
#:mode [mode 'iterated-box]
|
||||||
(cond [auto-inset? blurred]
|
#:pre-inset? [pre-inset? #t])
|
||||||
[else (inset blurred (- hbr) (- vbr))])))
|
(let* ([p
|
||||||
|
(cond [pre-inset? (inset p hbr vbr)]
|
||||||
|
[else p])]
|
||||||
|
[blurred (*blur p hbr vbr mode)])
|
||||||
|
(cond [pre-inset? (inset blurred (- hbr) (- vbr))]
|
||||||
|
[else blurred])))
|
||||||
|
|
||||||
(define (shadow p br [dx 0] [dy dx]
|
(define (shadow p br [dx 0] [dy dx]
|
||||||
#:color [c #f]
|
#:color [c #f]
|
||||||
|
@ -81,6 +87,10 @@
|
||||||
(send bdc set-pen (send dc get-pen))
|
(send bdc set-pen (send dc get-pen))
|
||||||
(send bdc set-brush (send dc get-brush))
|
(send bdc set-brush (send dc get-brush))
|
||||||
(send bdc set-text-foreground (send dc get-text-foreground))
|
(send bdc set-text-foreground (send dc get-text-foreground))
|
||||||
|
(when (or (zero? hbr*) (zero? vbr*))
|
||||||
|
;; probably not worth smoothing when about to blur
|
||||||
|
;; except when blurring by zero
|
||||||
|
(send bdc set-smoothing (send dc get-smoothing)))
|
||||||
(drawer bdc 0 0)
|
(drawer bdc 0 0)
|
||||||
(blur! bmp hbr* vbr* mode)
|
(blur! bmp hbr* vbr* mode)
|
||||||
(send dc set-scale 1.0 1.0)
|
(send dc set-scale 1.0 1.0)
|
||||||
|
@ -187,7 +197,7 @@
|
||||||
|
|
||||||
;; iterated box blur
|
;; iterated box blur
|
||||||
|
|
||||||
(define (box-line* radius start end get-val set-val)
|
(define-syntax-rule (box-line* radius start end get-val set-val)
|
||||||
(let ([non-zero-alpha?
|
(let ([non-zero-alpha?
|
||||||
(for/or ([outi (in-range start end)])
|
(for/or ([outi (in-range start end)])
|
||||||
(positive? (get-val outi 0)))])
|
(positive? (get-val outi 0)))])
|
||||||
|
@ -237,34 +247,30 @@
|
||||||
(set-val outI 3 0))])))
|
(set-val outI 3 0))])))
|
||||||
|
|
||||||
(define (box-h in out radius w h iterations)
|
(define (box-h in out radius w h iterations)
|
||||||
(define (get-val i offset) (bytes-ref in (unsafe-fx+ offset (unsafe-fx* 4 i))))
|
|
||||||
(define (set-val i offset v) (bytes-set! out (unsafe-fx+ offset (unsafe-fx* 4 i)) v))
|
|
||||||
(define (get-val* i offset) (bytes-ref out (unsafe-fx+ offset (unsafe-fx* 4 i))))
|
|
||||||
(define (set-val* i offset v) (bytes-set! in (unsafe-fx+ offset (unsafe-fx* 4 i)) v))
|
|
||||||
(for/async ([row (in-range h)])
|
(for/async ([row (in-range h)])
|
||||||
(for ([iter (in-range iterations)])
|
(for ([iter (in-range iterations)])
|
||||||
(box-line* radius (* row w) (* (add1 row) w)
|
(let ([start (* row w)]
|
||||||
(if (even? iter) get-val get-val*)
|
[end (* (add1 row) w)]
|
||||||
(if (even? iter) set-val set-val*)))))
|
[in (if (even? iter) in out)]
|
||||||
|
[out (if (even? iter) out in)])
|
||||||
|
(define-syntax-rule (get-val i offset)
|
||||||
|
(bytes-ref in (unsafe-fx+ offset (unsafe-fx* 4 i))))
|
||||||
|
(define-syntax-rule (set-val i offset v)
|
||||||
|
(bytes-set! out (unsafe-fx+ offset (unsafe-fx* 4 i)) v))
|
||||||
|
(box-line* radius start end get-val set-val)))))
|
||||||
|
|
||||||
(define (box-v in out radius w h iterations)
|
(define (box-v in out radius w h iterations)
|
||||||
(define ((mkget col) i offset)
|
|
||||||
(bytes-ref in (unsafe-fx+ (unsafe-fx* 4 (unsafe-fx+ (unsafe-fx* w i) col)) offset)))
|
|
||||||
(define ((mkset col) i offset v)
|
|
||||||
(bytes-set! out (unsafe-fx+ (unsafe-fx* 4 (unsafe-fx+ (unsafe-fx* w i) col)) offset) v))
|
|
||||||
(define ((mkget* col) i offset)
|
|
||||||
(bytes-ref out (unsafe-fx+ (unsafe-fx* 4 (unsafe-fx+ (unsafe-fx* w i) col)) offset)))
|
|
||||||
(define ((mkset* col) i offset v)
|
|
||||||
(bytes-set! in (unsafe-fx+ (unsafe-fx* 4 (unsafe-fx+ (unsafe-fx* w i) col)) offset) v))
|
|
||||||
(for/async ([col (in-range w)])
|
(for/async ([col (in-range w)])
|
||||||
(let ([get (mkget col)]
|
(for ([iter (in-range iterations)])
|
||||||
[get* (mkget* col)]
|
(let ([start 0]
|
||||||
[set (mkset col)]
|
[end h]
|
||||||
[set* (mkset* col)])
|
[in (if (even? iter) in out)]
|
||||||
(for ([iter (in-range iterations)])
|
[out (if (even? iter) out in)])
|
||||||
(box-line* radius 0 h
|
(define-syntax-rule (get-val i offset)
|
||||||
(if (even? iter) get get*)
|
(bytes-ref in (unsafe-fx+ (unsafe-fx* 4 (unsafe-fx+ (unsafe-fx* w i) col)) offset)))
|
||||||
(if (even? iter) set set*))))))
|
(define-syntax-rule (set-val i offset v)
|
||||||
|
(bytes-set! out (unsafe-fx+ (unsafe-fx* 4 (unsafe-fx+ (unsafe-fx* w i) col)) offset) v))
|
||||||
|
(box-line* radius start end get-val set-val)))))
|
||||||
|
|
||||||
;; ----
|
;; ----
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user