diff --git a/collects/frtime/tool/clock.png b/collects/frtime/tool/clock.png index 96c583338c..4a3e849ff3 100644 Binary files a/collects/frtime/tool/clock.png and b/collects/frtime/tool/clock.png differ diff --git a/collects/icons/macro-stepper-32x32.png b/collects/icons/macro-stepper-32x32.png index 4ed6905da5..c6c9a6e661 100644 Binary files a/collects/icons/macro-stepper-32x32.png and b/collects/icons/macro-stepper-32x32.png differ diff --git a/collects/images/icons/misc.rkt b/collects/images/icons/misc.rkt index 84345699b1..166f253f94 100644 --- a/collects/images/icons/misc.rkt +++ b/collects/images/icons/misc.rkt @@ -18,7 +18,8 @@ left-magnifying-glass-icon left-magnifying-glass-flomap bomb-icon bomb-flomap left-bomb-icon left-bomb-flomap - clock-icon clock-flomap) + clock-icon clock-flomap + stopwatch-icon stopwatch-flomap) (only-doc-out (all-defined-out))) (define (flat-regular-polygon-flomap sides start color size) @@ -266,63 +267,110 @@ [face-color (or/c string? (is-a?/c color%)) light-metal-icon-color] [hand-color (or/c string? (is-a?/c color%)) "firebrick"] [hours (integer-in 0 11) 1] - [minutes (real-in 0 60) 33]) flomap? + [minutes (real-in 0 60) 47]) flomap? (make-cached-flomap [height face-color hand-color hours minutes] - (define R 12) - (define hour-θ (* (+ (- hours 3) (/ minutes 60)) (/ (* 2 pi) 12))) - (define minute-θ (* (- minutes 15) (/ (* 2 pi) 60))) - (define 60-degrees (* 60 (/ (* 2 pi) 180))) - (define scale (/ height 32)) - - (define face-fm - (draw-icon-flomap - 32 32 (λ (dc) - ;; face - (set-icon-pen dc (icon-color->outline-color face-color) 1 'solid) - (send dc set-brush face-color 'solid) - (draw-ellipse/smoothed dc 0 0 32 32) - ;; ticks + (define R 13) + (define hour-θ (* (+ (- hours 3) (/ minutes 60)) (/ (* 2 pi) 12))) + (define minute-θ (* (- minutes 15) (/ (* 2 pi) 60))) + (define scale (/ height 32)) + (define face-fm + (flomap-cc-superimpose + ;; face and ticks + (draw-icon-flomap + 32 32 (λ (dc) + (set-icon-pen dc (icon-color->outline-color (icon-color->outline-color face-color)) + 1 'solid) + (send dc set-brush face-color 'solid) + (draw-ellipse/smoothed dc 0 0 32 32) + (set-icon-pen dc "black" 1 'solid) + (for ([θ (in-range 0 (* 2 pi) (* 1/30 pi))] + [r (in-cycle (list 1.5 .5 .5 .5 .5 + 1.0 .5 .5 .5 .5 + 1.0 .5 .5 .5 .5))] + [t (in-cycle (list 1.0 .25 .25 .25 .25 + .75 .25 .25 .25 .25 + .75 .25 .25 .25 .25))]) + (set-icon-pen dc "black" t 'solid) + (send dc draw-line + (+ 15.5 (* (- R r) (cos θ))) + (+ 15.5 (* (- R r) (sin θ))) + (+ 15.5 (* R (cos θ))) + (+ 15.5 (* R (sin θ)))))) + scale) + (fm* 0.25 (lambda-flomap face-color (* 1/2 height) glass-icon-material)) + (draw-rendered-icon-flomap + 32 32 (λ (dc) + (set-icon-pen dc (icon-color->outline-color hand-color) 1/2 'solid) + (send dc set-brush hand-color 'solid) + ;; minute hand + (send dc draw-polygon + (list (cons (+ 15.5 (* R (cos minute-θ))) + (+ 15.5 (* R (sin minute-θ)))) + (cons (+ 15.5 (* 1 (cos (+ minute-θ (* 1/2 pi))))) + (+ 15.5 (* 1 (sin (+ minute-θ (* 1/2 pi)))))) + (cons (+ 15.5 (* 1 (cos (+ minute-θ pi)))) + (+ 15.5 (* 1 (sin (+ minute-θ pi))))) + (cons (+ 15.5 (* 1 (cos (+ minute-θ (* 3/2 pi))))) + (+ 15.5 (* 1 (sin (+ minute-θ (* 3/2 pi))))))))) + scale + metal-icon-material) + ;; hands + (draw-rendered-icon-flomap + 32 32 (λ (dc) + (set-icon-pen dc (icon-color->outline-color hand-color) 1/2 'solid) + (send dc set-brush hand-color 'solid) + ;; hour hand + (send dc draw-polygon + (list (cons (+ 15.5 (* (- R 5) (cos hour-θ))) + (+ 15.5 (* (- R 5) (sin hour-θ)))) + (cons (+ 15.5 (* 1.25 (cos (+ hour-θ (* 1/2 pi))))) + (+ 15.5 (* 1.25 (sin (+ hour-θ (* 1/2 pi)))))) + (cons (+ 15.5 (* 1.25 (cos (+ hour-θ pi)))) + (+ 15.5 (* 1.25 (sin (+ hour-θ pi))))) + (cons (+ 15.5 (* 1.25 (cos (+ hour-θ (* 3/2 pi))))) + (+ 15.5 (* 1.25 (sin (+ hour-θ (* 3/2 pi))))))))) + scale + metal-icon-material))) + + (define shell-fm + (draw-icon-flomap + 32 32 (λ (dc) + (set-icon-pen dc "white" 1 'solid) + (send dc set-brush "white" 'solid) + (draw-ellipse/smoothed dc 1 1 30 30)) + scale)) + + (let* ([dfm (flomap->deep-flomap shell-fm)] + [dfm (deep-flomap-bulge-spheroid dfm (* 6 scale))] + [dfm (deep-flomap-raise dfm (* -2 scale))] + [dfm (deep-flomap-smooth-z dfm (* 1/3 scale))]) + (flomap-cc-superimpose + face-fm + (deep-flomap-render-icon dfm clock-shell-material face-fm))))) + +(defproc (stopwatch-flomap [height (and/c rational? (>=/c 0)) (default-icon-height)] + [face-color (or/c string? (is-a?/c color%)) light-metal-icon-color] + [hand-color (or/c string? (is-a?/c color%)) "firebrick"] + [hours (integer-in 0 11) 0] + [minutes (real-in 0 60) 47]) flomap? + (make-cached-flomap + [height face-color hand-color hours minutes] + (define clock-fm (clock-flomap (* 30/32 height) face-color hand-color hours minutes)) + (define buttons-fm + (draw-rendered-icon-flomap + 32 8 (λ (dc) + (set-icon-pen dc (make-object color% 128 0 0) 1 'solid) + (send dc set-brush (make-object color% 144 0 0) 'solid) + (send dc draw-polygon '((2 . 4) (4 . 2) (15.5 . 15.5))) + (send dc draw-polygon '((0 . 5) (5 . 0) (6 . 1) (1 . 6))) (set-icon-pen dc "black" 1 'solid) - (for ([θ (in-range 0 (* 2 pi) (* 1/6 pi))] - [i (in-cycle (in-range 0 3))]) - (define r (if (= i 0) 2 1)) - (send dc draw-line - (+ 15.5 (* (- R r) (cos θ))) - (+ 15.5 (* (- R r) (sin θ))) - (+ 15.5 (* R (cos θ))) - (+ 15.5 (* R (sin θ))))) - (set-icon-pen dc (icon-color->outline-color hand-color) 1/2 'solid) - (send dc set-brush hand-color 'solid) - ;; minute hand - (send dc draw-polygon - (list (cons (+ 15.5 (* R (cos minute-θ))) - (+ 15.5 (* R (sin minute-θ)))) - (cons (+ 15.5 (* 1.5 (cos (+ minute-θ 60-degrees)))) - (+ 15.5 (* 1.5 (sin (+ minute-θ 60-degrees))))) - (cons (+ 15.5 (* 1.5 (cos (- minute-θ 60-degrees)))) - (+ 15.5 (* 1.5 (sin (- minute-θ 60-degrees))))))) - ;; hour hand - (send dc draw-polygon - (list (cons (+ 15.5 (* (- R 4) (cos hour-θ))) - (+ 15.5 (* (- R 4) (sin hour-θ)))) - (cons (+ 15.5 (* 1.5 (cos (+ hour-θ 60-degrees)))) - (+ 15.5 (* 1.5 (sin (+ hour-θ 60-degrees))))) - (cons (+ 15.5 (* 1.5 (cos (- hour-θ 60-degrees)))) - (+ 15.5 (* 1.5 (sin (- hour-θ 60-degrees)))))))) - scale)) - - (define shell-fm - (draw-icon-flomap - 32 32 (λ (dc) - (set-icon-pen dc (icon-color->outline-color "white") 1 'solid) - (send dc set-brush "white" 'solid) - (draw-ellipse/smoothed dc 0 0 32 32)) - scale)) - - (let* ([dfm (flomap->deep-flomap shell-fm)] - [dfm (deep-flomap-bulge-spheroid dfm (* 8 scale))]) - (deep-flomap-render-icon dfm clock-shell-material face-fm)))) + (send dc set-brush (make-object color% 16 16 16) 'solid) + (send dc draw-polygon '((28 . 5) (26 . 3) (15.5 . 15.5))) + (send dc draw-polygon '((31 . 5) (26 . 0) (24.5 . 1.5) (29.5 . 6.5)))) + (/ height 32) + metal-icon-material)) + (flomap-pin* 1/2 0 1/2 -2/32 buttons-fm clock-fm))) ;; =================================================================================================== ;; Bitmaps (icons) @@ -335,12 +383,14 @@ ) (is-a?/c bitmap%) (flomap->bitmap (regular-polygon-flomap sides start color height material))) -(defproc (clock-icon [height (and/c rational? (>=/c 0)) (default-icon-height)] - [face-color (or/c string? (is-a?/c color%)) light-metal-icon-color] - [hand-color (or/c string? (is-a?/c color%)) "firebrick"] - [hours (integer-in 0 11) 1] - [minutes (real-in 0 60) 33]) (is-a?/c bitmap%) - (flomap->bitmap (clock-flomap height face-color hand-color hours minutes))) +(define-icon-wrappers + ([height (and/c rational? (>=/c 0)) (default-icon-height)] + [face-color (or/c string? (is-a?/c color%)) light-metal-icon-color] + [hand-color (or/c string? (is-a?/c color%)) "firebrick"] + [hours (integer-in 0 11) 0] + [minutes (real-in 0 60) 47]) + [clock-icon clock-flomap] + [stopwatch-icon stopwatch-flomap]) (define-icon-wrappers ([color (or/c string? (is-a?/c color%))] diff --git a/collects/images/icons/style.rkt b/collects/images/icons/style.rkt index cbacf5bb6b..8eebd87fc0 100644 --- a/collects/images/icons/style.rkt +++ b/collects/images/icons/style.rkt @@ -72,8 +72,9 @@ ) (is-a?/c bitmap%) (let* ([fm (bitmap->flomap bitmap)] [dfm (flomap->deep-flomap fm)] - [dfm (deep-flomap-icon-style dfm (* 32 z-ratio))]) - (flomap->bitmap (deep-flomap-render-icon dfm material)))) + [dfm (deep-flomap-icon-style dfm (* 32 z-ratio))] + [fm (deep-flomap-render-icon dfm material)]) + (flomap->bitmap fm))) (defproc (icon-color->outline-color [color (or/c string? (is-a?/c color%))]) (is-a?/c color%) (cond [(string? color) (icon-color->outline-color (send the-color-database find-color color))] @@ -120,7 +121,8 @@ (define s (/ (deep-flomap-height dfm) 32)) (let* ([dfm (deep-flomap-emboss dfm (* s 2) (* s 2))] [dfm (deep-flomap-bulge-round dfm (* s 6))] - [dfm (deep-flomap-raise dfm (* s height))]) + [dfm (deep-flomap-raise dfm (* s height))] + [dfm (deep-flomap-smooth-z dfm 1/3)]) dfm)) (define (draw-icon-flomap w h draw-proc scale) diff --git a/collects/images/icons/symbol.rkt b/collects/images/icons/symbol.rkt index aa33dd9045..cfde68106a 100644 --- a/collects/images/icons/symbol.rkt +++ b/collects/images/icons/symbol.rkt @@ -13,7 +13,8 @@ recycle-icon recycle-flomap x-icon x-flomap check-icon check-flomap - lambda-icon lambda-flomap) + lambda-icon lambda-flomap + hash-quote-icon hash-quote-flomap) (only-doc-out (all-defined-out))) (define (flat-x-flomap color height) @@ -238,6 +239,35 @@ (/ height 32) material))) +(defproc (hash-quote-flomap [color (or/c string? (is-a?/c color%))] + [height (and/c rational? (>=/c 0)) (default-icon-height)] + [material deep-flomap-material-value? (default-icon-material)]) flomap? + (make-cached-flomap + [height color material] + (define (draw-hash-quote dc) + ;; vertical lines + (send dc draw-polygon '((6 . 0) (11 . 0) (9 . 30) (4 . 30))) + (send dc draw-polygon '((17 . 0) (22 . 0) (20 . 30) (15 . 30))) + ;; horizontal lines + (send dc draw-polygon '((1 . 6.5) (26 . 6.5) (26 . 11.5) (1 . 11.5))) + (send dc draw-polygon '((0 . 18.5) (25 . 18.5) (25 . 23.5) (0 . 23.5))) + ;; quote + (send dc draw-polygon '((30 . 0) (34 . 0) (33 . 9) (30 . 9)))) + + (define outline-color (icon-color->outline-color color)) + + (draw-rendered-icon-flomap + 36 32 (λ (dc) + (send dc translate 0.5 0.5) + (set-icon-pen dc outline-color 2 'solid) + (send dc set-brush outline-color 'solid) + (draw-hash-quote dc) + (send dc set-pen "black" 1 'transparent) + (send dc set-brush color 'solid) + (draw-hash-quote dc)) + (/ height 32) + material))) + ;; =================================================================================================== ;; Bitmaps (icons) @@ -257,4 +287,5 @@ [recycle-icon recycle-flomap] [x-icon x-flomap] [check-icon check-flomap] - [lambda-icon lambda-flomap]) + [lambda-icon lambda-flomap] + [hash-quote-icon hash-quote-flomap]) diff --git a/collects/images/icons/tool.rkt b/collects/images/icons/tool.rkt index 47534a52d1..ec5b9152aa 100644 --- a/collects/images/icons/tool.rkt +++ b/collects/images/icons/tool.rkt @@ -24,10 +24,12 @@ (defthing debugger-bomb-color (or/c string? (is-a?/c color%)) #:document-value (make-object color% 128 32 32)) + ;; Actual color is too dark after rendering -;(define macro-stepper-hash-color (make-object color% 30 96 30)) (defthing macro-stepper-hash-color (or/c string? (is-a?/c color%)) #:document-value - (make-object color% 90 192 90)) + (make-object color% 60 192 60)) +(defthing small-macro-stepper-hash-color (or/c string? (is-a?/c color%)) #:document-value + (make-object color% 128 255 128)) (defproc (check-syntax-flomap [height (and/c rational? (>=/c 0)) (toolbar-icon-height)] [material deep-flomap-material-value? (default-icon-material)] @@ -49,8 +51,7 @@ [material deep-flomap-material-value? (default-icon-material)] ) flomap? (flomap-ht-append - (text-flomap "#'" (make-object font% (max 1 (min 1024 height)) 'system) - macro-stepper-hash-color #t 'auto height material) + (hash-quote-flomap macro-stepper-hash-color height material) (make-flomap 4 (max 1 (inexact->exact (round (* 1/32 height)))) 0) (step-flomap syntax-icon-color height material))) @@ -60,8 +61,7 @@ (flomap-pin* 0 0 7/16 0 (step-flomap syntax-icon-color height material) - (text-flomap "#'" (make-object font% (max 1 (min 1024 height)) 'system) - macro-stepper-hash-color #t 'auto (* 3/4 height) material))) + (hash-quote-flomap small-macro-stepper-hash-color (* 3/4 height) material))) (defproc (debugger-flomap [height (and/c rational? (>=/c 0)) (toolbar-icon-height)] [material deep-flomap-material-value? (default-icon-material)] diff --git a/collects/images/logos.rkt b/collects/images/logos.rkt index 10cfe4b5ad..05cb4cbd76 100644 --- a/collects/images/logos.rkt +++ b/collects/images/logos.rkt @@ -298,33 +298,10 @@ (lambda-flomap light-metal-icon-color (* 5/8 height) metal-icon-material))) (defproc (macro-stepper-logo-flomap [height (and/c rational? (>=/c 0)) 96]) flomap? - (define outline-color (icon-color->outline-color light-metal-icon-color)) - - (define (draw-hash-quote dc) - ;; vertical lines - (send dc draw-polygon '((5 . 0) (8 . 0) (6 . 19) (3 . 19))) - (send dc draw-polygon '((12 . 0) (15 . 0) (13 . 19) (10 . 19))) - ;; horizontal lines - (send dc draw-polygon '((1 . 4) (1 . 7) (18 . 7) (18 . 4))) - (send dc draw-polygon '((0 . 12) (0 . 15) (17 . 15) (17 . 12))) - ;; quote - (send dc draw-polygon '((20 . 0) (23 . 0) (22.75 . 6) (20.25 . 6))) - ) - (flomap-pin* - 1/2 20/32 1/2 1/2 + 1/2 20/32 15/36 1/2 (foot-flomap (make-object color% 34 42 160) height glass-icon-material) - (draw-rendered-icon-flomap - 32 32 (λ (dc) - (send dc translate 5 6) - (set-icon-pen dc outline-color 2 'solid) - (send dc set-brush outline-color 'solid) - (draw-hash-quote dc) - (send dc set-pen "black" 1 'transparent) - (send dc set-brush light-metal-icon-color 'solid) - (draw-hash-quote dc)) - (/ (* 3/4 height) 32) - metal-icon-material))) + (hash-quote-flomap light-metal-icon-color (* 1/2 height) metal-icon-material))) (define-icon-wrappers ([height (and/c rational? (>=/c 0)) 256]) diff --git a/collects/images/private/deep-flomap-render.rkt b/collects/images/private/deep-flomap-render.rkt index 6d6dd3ce15..412323d66b 100644 --- a/collects/images/private/deep-flomap-render.rkt +++ b/collects/images/private/deep-flomap-render.rkt @@ -69,11 +69,13 @@ ;; =================================================================================================== ;; Pass 1: tracing from a directional light source -(: trace-directional-light (flomap flomap flomap flomap Integer Integer Integer Integer - -> (values flomap flomap))) -(define (trace-directional-light alpha-fm rgb-fm z-fm normal-fm x-min x-max y-min y-max) +(: trace-directional-light (flomap flomap flomap flomap + Integer Integer Integer Integer -> (values flomap flomap))) +(define (trace-directional-light alpha-fm rgb-fm z-fm normal-fm + x-min x-max y-min y-max) (match-define (flomap alpha-vs 1 w h) alpha-fm) - (match-define (list rgb-vs z-vs normal-vs) (map flomap-values (list rgb-fm z-fm normal-fm))) + (match-define (list rgb-vs z-vs normal-vs) + (map flomap-values (list rgb-fm z-fm normal-fm))) (define z-max (flomap-max-value z-fm)) (define opacity-z (/ z-max (transmission-density))) @@ -111,8 +113,12 @@ (define diffuse-fm (make-flomap 3 w h lz)) (define diffuse-vs (flomap-values diffuse-fm)) - (define sx-vs (make-flvector (* w h) +nan.0)) - (define sy-vs (make-flvector (* w h) +nan.0)) + ;(define sx-vs (make-flvector (* w h) +nan.0)) + ;(define sy-vs (make-flvector (* w h) +nan.0)) + (define sx-fm (inline-build-flomap 1 w h (λ (k x y i) (+ (fx->fl x) 0.5)))) + (define sy-fm (inline-build-flomap 1 w h (λ (k x y i) (+ (fx->fl y) 0.5)))) + (define sx-vs (flomap-values sx-fm)) + (define sy-vs (flomap-values sy-fm)) (define Irgb-vs (make-flvector (* 3 w h))) (for*: ([int-y : Integer (in-range y-min y-max)] @@ -330,9 +336,10 @@ ;; =================================================================================================== ;; Pass 2: tracing from a directional viewer -(: trace-directional-view (flomap flomap flomap flomap flomap Integer Integer Integer Integer - -> (values flomap flomap))) -(define (trace-directional-view alpha-fm rgb-fm z-fm normal-fm shadow-fm x-min x-max y-min y-max) +(: trace-directional-view (flomap flomap flomap flomap flomap + Integer Integer Integer Integer -> (values flomap flomap))) +(define (trace-directional-view alpha-fm rgb-fm z-fm normal-fm shadow-fm + x-min x-max y-min y-max) (define-values (w h) (flomap-size alpha-fm)) (match-define (list alpha-vs rgb-vs z-vs normal-vs shadow-vs) (map flomap-values (list alpha-fm rgb-fm z-fm normal-fm shadow-fm))) @@ -407,7 +414,10 @@ (unsafe-flvector-set! reflected-vs (fx+ j 2) b)))) ;; transmission (refraction) (when (Ti . > . 0.0) - (define-values (tx ty tz) (transmitted-vector nx ny nz 0.0 0.0 -1.0 1.0 η2)) + (define snx (unsafe-flvector-ref normal-vs j)) + (define sny (unsafe-flvector-ref normal-vs (fx+ j 1))) + (define snz (unsafe-flvector-ref normal-vs (fx+ j 2))) + (define-values (tx ty tz) (transmitted-vector snx sny snz 0.0 0.0 -1.0 1.0 η2)) ;; sz = z + dist * tz, so dist = (sz - z) / tz (define dist (/ (- 0.0 z) tz)) (when (and (dist . >= . 0.0) (dist . < . +inf.0)) @@ -456,38 +466,43 @@ (case-lambda [(dfm) (deep-flomap-render dfm #f)] [(dfm background-fm) - (define-values (w h) (deep-flomap-size dfm)) - (define argb-fm (flomap-divide-alpha (deep-flomap-argb dfm))) - (define alpha-fm (flomap-ref-component argb-fm 0)) - (define rgb-fm (flomap-drop-components argb-fm 1)) - (define z-fm (fmmax 0.0 (deep-flomap-z dfm))) - (define normal-fm (flomap-gradient-normal z-fm)) - (define bg-fm (if background-fm (prep-background background-fm w h) #f)) - (define-values (_1 x-min y-min _2 x-max y-max) (flomap-nonzero-rect alpha-fm)) - - ;; pass 1: trace from the light source - (define-values (diffracted-fm raw-shadow-fm) - (trace-directional-light alpha-fm rgb-fm z-fm normal-fm x-min x-max y-min y-max)) - - ;; blur the shadow to simulate internal scatter - (define σ (* (min w h) (shadow-blur))) - (define shadow-fm - (cond [bg-fm - ;; two Gaussian blurs by half-σ is equivalent to one Gaussian blur by σ - (define half-σ (* (/ 1 (sqrt 2)) σ)) - (let* ([fm (flomap-blur raw-shadow-fm half-σ)] - [fm (fm* fm bg-fm)] - [fm (flomap-blur fm half-σ)]) - fm)] - [else - (flomap-blur raw-shadow-fm σ)])) - - ;; pass 2: trace from the viewer - (define-values (reflected-fm transmitted-fm) - (trace-directional-view alpha-fm rgb-fm z-fm normal-fm shadow-fm x-min x-max y-min y-max)) - - ;; add all the light together, convert to premultiplied-alpha flomap - (let* ([fm (fm+ (fm+ diffracted-fm transmitted-fm) reflected-fm)] - [fm (flomap-append-components alpha-fm fm)] - [fm (flomap-multiply-alpha fm)]) - fm)])) + (let ([dfm (deep-flomap-inset dfm 1)]) + (define-values (w h) (deep-flomap-size dfm)) + (define argb-fm (flomap-divide-alpha (deep-flomap-argb dfm))) + (define alpha-fm (flomap-ref-component argb-fm 0)) + (define rgb-fm (flomap-drop-components argb-fm 1)) + (define z-fm (fmmax 0.0 (deep-flomap-z dfm))) + (define normal-fm (flomap-gradient-normal z-fm)) + (define bg-fm (if background-fm (prep-background background-fm w h) #f)) + (define-values (x-min y-min x-max y-max) + (let-values ([(_1 x-min y-min _2 x-max y-max) (flomap-nonzero-rect alpha-fm)]) + (values (max 0 (- x-min 1)) (max 0 (- y-min 1)) + (min w (+ x-max 1)) (min h (+ y-max 1))))) + + ;; pass 1: trace from the light source + (define-values (diffracted-fm raw-shadow-fm) + (trace-directional-light alpha-fm rgb-fm z-fm normal-fm x-min x-max y-min y-max)) + + ;; two Gaussian blurs by half of σ^2 is equivalent to one Gaussian blur by σ^2 + (define σ^2 (sqr (* (min w h) (shadow-blur)))) + + ;; blur the shadow to simulate internal scatter + (define shadow-fm + (cond [bg-fm + (let* ([fm (flomap-blur raw-shadow-fm (sqrt (* 1/3 σ^2)))] + [fm (fm* fm bg-fm)] + [fm (flomap-blur fm (sqrt (* 1/3 σ^2)))]) + fm)] + [else + (flomap-blur raw-shadow-fm (sqrt (* 2/3 σ^2)))])) + + ;; pass 2: trace from the viewer + (define-values (reflected-fm raw-transmitted-fm) + (trace-directional-view alpha-fm rgb-fm z-fm normal-fm shadow-fm x-min x-max y-min y-max)) + ;; simulate scatter some more + (define transmitted-fm (flomap-blur raw-transmitted-fm (sqrt (* 1/3 σ^2)))) + ;; add all the light together, convert to premultiplied-alpha flomap + (let* ([fm (fm+ (fm+ diffracted-fm transmitted-fm) reflected-fm)] + [fm (flomap-append-components alpha-fm fm)] + [fm (flomap-multiply-alpha fm)]) + (flomap-inset fm -1)))])) diff --git a/collects/images/private/flomap-gradient.rkt b/collects/images/private/flomap-gradient.rkt index 29986297fc..1320212be7 100644 --- a/collects/images/private/flomap-gradient.rkt +++ b/collects/images/private/flomap-gradient.rkt @@ -14,44 +14,56 @@ (: flomap-gradient-x (flomap -> flomap)) (define (flomap-gradient-x fm) (match-define (flomap vs c w h) fm) - (define cw (fx* c w)) - (define d20 (fx- 1 cw)) - (define d22 (fx+ cw 1)) + (define +x (fx* c 1)) + (define -x+y (fx* c (fx- w 1))) + (define +x+y (fx* c (fx+ w 1))) (define w-1 (fx- w 1)) (define h-1 (fx- h 1)) (inline-build-flomap c w h - (λ (_k x y i) + (λ (k x y i) (cond [(and (x . fx> . 0) (x . fx< . w-1) (y . fx> . 0) (y . fx< . h-1)) - (+ (- (* 0.1875 (unsafe-flvector-ref vs (fx+ i d20))) - (* 0.1875 (unsafe-flvector-ref vs (fx- i d22)))) - (- (* 0.6250 (unsafe-flvector-ref vs (fx+ i 1))) - (* 0.6250 (unsafe-flvector-ref vs (fx- i 1)))) - (- (* 0.1875 (unsafe-flvector-ref vs (fx+ i d22))) - (* 0.1875 (unsafe-flvector-ref vs (fx- i d20)))))] - [else 0.0])))) + (+ (- (* 0.1875 (unsafe-flvector-ref vs (fx- i -x+y))) + (* 0.1875 (unsafe-flvector-ref vs (fx- i +x+y)))) + (- (* 0.6250 (unsafe-flvector-ref vs (fx+ i +x))) + (* 0.6250 (unsafe-flvector-ref vs (fx- i +x)))) + (- (* 0.1875 (unsafe-flvector-ref vs (fx+ i +x+y))) + (* 0.1875 (unsafe-flvector-ref vs (fx+ i -x+y)))))] + [else + (+ (- (* 0.1875 (flomap-ref fm k (+ x 1) (- y 1))) + (* 0.1875 (flomap-ref fm k (- x 1) (- y 1)))) + (- (* 0.6250 (flomap-ref fm k (+ x 1) y)) + (* 0.6250 (flomap-ref fm k (- x 1) y))) + (- (* 0.1875 (flomap-ref fm k (+ x 1) (+ y 1))) + (* 0.1875 (flomap-ref fm k (- x 1) (+ y 1)))))])))) (: flomap-gradient-y (flomap -> flomap)) (define (flomap-gradient-y fm) (match-define (flomap vs c w h) fm) - (define cw (fx* c w)) - (define d02 (fx- cw 1)) - (define d22 (fx+ cw 1)) + (define +y (fx* c w)) + (define -x+y (fx* c (fx- w 1))) + (define +x+y (fx* c (fx+ w 1))) (define w-1 (fx- w 1)) (define h-1 (fx- h 1)) (inline-build-flomap c w h - (λ (_k x y i) + (λ (k x y i) (cond [(and (x . fx> . 0) (x . fx< . w-1) (y . fx> . 0) (y . fx< . h-1)) - (+ (- (* 0.1875 (unsafe-flvector-ref vs (fx+ i d02))) - (* 0.1875 (unsafe-flvector-ref vs (fx- i d22)))) - (- (* 0.6250 (unsafe-flvector-ref vs (fx+ i cw))) - (* 0.6250 (unsafe-flvector-ref vs (fx- i cw)))) - (- (* 0.1875 (unsafe-flvector-ref vs (fx+ i d22))) - (* 0.1875 (unsafe-flvector-ref vs (fx- i d02)))))] - [else 0.0])))) + (+ (- (* 0.1875 (unsafe-flvector-ref vs (fx+ i -x+y))) + (* 0.1875 (unsafe-flvector-ref vs (fx- i +x+y)))) + (- (* 0.6250 (unsafe-flvector-ref vs (fx+ i +y))) + (* 0.6250 (unsafe-flvector-ref vs (fx- i +y)))) + (- (* 0.1875 (unsafe-flvector-ref vs (fx+ i +x+y))) + (* 0.1875 (unsafe-flvector-ref vs (fx- i -x+y)))))] + [else + (+ (- (* 0.1875 (flomap-ref fm k (- x 1) (+ y 1))) + (* 0.1875 (flomap-ref fm k (- x 1) (- y 1)))) + (- (* 0.6250 (flomap-ref fm k x (+ y 1))) + (* 0.6250 (flomap-ref fm k x (- y 1)))) + (- (* 0.1875 (flomap-ref fm k (+ x 1) (+ y 1))) + (* 0.1875 (flomap-ref fm k (+ x 1) (- y 1)))))])))) (: flomap-gradient (flomap -> (values flomap flomap))) (define (flomap-gradient fm) diff --git a/collects/images/scribblings/icons.scrbl b/collects/images/scribblings/icons.scrbl index 811fce839b..171c928e20 100644 --- a/collects/images/scribblings/icons.scrbl +++ b/collects/images/scribblings/icons.scrbl @@ -45,8 +45,7 @@ Its shape and color are a visual metaphor for an action or a message. Icons should be @bold{easily recognizable}, @bold{distinguishable}, @bold{visually consistent}, and @bold{metaphorically appropriate} for the actions and messages they are used with. It can be difficult to meet all four requirements at once (``distinguishable'' and ``visually consistent' are often at odds), but good examples, good abstractions, and an existing icon library help considerably. -@(define (hash-quote) (text-icon "#'" (make-object font% 32 'system) - macro-stepper-hash-color #t 'auto 16)) +@(define (hash-quote) (hash-quote-icon macro-stepper-hash-color 16)) @(define (step) (step-icon syntax-icon-color 16)) @(define (play) (play-icon syntax-icon-color 16)) @(define (bar) (bar-icon syntax-icon-color 16)) @@ -283,7 +282,7 @@ Renders a text string as an icon. For example, @interaction[#:eval icons-eval (text-icon "An Important Point!" (make-object font% 48 'decorative 'normal 'bold #t) - "lightskyblue" #t 2 48)] + "lightskyblue" #t 'auto 48)] Before rendering, the drawn text is scaled so that it is exactly @racket[height] pixels tall. Make sure the font is large enough that scaling does not create blurry and jagged edge artifacts, as in the following example: @@ -329,6 +328,12 @@ Returns an ``x'' icon that is guaranteed to look the same on all platforms. (lambda-icon light-metal-icon-color 32 metal-icon-material)] } +@doc-apply[hash-quote-icon]{ +@examples[#:eval icons-eval + (require (only-in images/icons/tool macro-stepper-hash-color)) + (hash-quote-icon macro-stepper-hash-color 32)] +} + @;==================================================================================================== @section[#:tag "misc"]{Miscellaneous Icons} @@ -388,10 +393,14 @@ Equivalent to @racket[(regular-polygon-icon 8 (/ (* 2 pi) 16) color height mater @doc-apply[clock-icon]{ @examples[#:eval icons-eval - (clock-icon 48) + (clock-icon 96) (clock-icon 48 "lightblue" "darkblue" 3 21)] } +@doc-apply[stopwatch-icon]{ +@examples[#:eval icons-eval (stopwatch-icon 96)] +} + @;==================================================================================================== @section[#:tag "stickman"]{Stickman Icons} diff --git a/collects/images/scribblings/logos.scrbl b/collects/images/scribblings/logos.scrbl index 8701378f93..11881f74a8 100644 --- a/collects/images/scribblings/logos.scrbl +++ b/collects/images/scribblings/logos.scrbl @@ -30,11 +30,11 @@ Returns an unofficial PLaneT logo. This is used as the PLaneT icon when DrRacket } @doc-apply[stepper-logo]{ -An algebraic stepper logo. +Returns the algebraic stepper logo. @examples[#:eval logos-eval (stepper-logo)] } @doc-apply[macro-stepper-logo]{ -A macro stepper logo. +Returns the macro stepper logo. @examples[#:eval logos-eval (macro-stepper-logo)] } diff --git a/collects/images/tests/icon-tests.rkt b/collects/images/tests/icon-tests.rkt index 2ffe7b9f01..9de3436f60 100644 --- a/collects/images/tests/icon-tests.rkt +++ b/collects/images/tests/icon-tests.rkt @@ -48,12 +48,13 @@ (λ (color) (load-icon syntax-icon-color color)) (λ (color) (small-save-icon syntax-icon-color color)) (λ (color) (small-load-icon syntax-icon-color color))) - (list x-icon check-icon recycle-icon lambda-icon) + (list x-icon check-icon recycle-icon lambda-icon hash-quote-icon) (list octagon-icon stop-sign-icon stop-signs-icon foot-icon (λ (color) (magnifying-glass-icon metal-icon-color color)) (λ (color) (left-magnifying-glass-icon metal-icon-color color)) (λ (color) (bomb-icon metal-icon-color color)) - (λ (color) (left-bomb-icon metal-icon-color color))))) + (λ (color) (left-bomb-icon metal-icon-color color)) + (λ (color) (stopwatch-icon (default-icon-height) color))))) (define tool-icon-procs (list check-syntax-icon small-check-syntax-icon diff --git a/collects/typed-racket/optimizer/tool/tool.rkt b/collects/typed-racket/optimizer/tool/tool.rkt index 926aa31aac..186ed37197 100644 --- a/collects/typed-racket/optimizer/tool/tool.rkt +++ b/collects/typed-racket/optimizer/tool/tool.rkt @@ -1,7 +1,9 @@ #lang racket/base (require racket/class racket/port racket/list racket/match - racket/gui/base racket/unit drracket/tool) + racket/gui/base racket/unit drracket/tool + images/compile-time + (for-syntax racket/base images/icons/misc images/icons/style)) (require "report.rkt" "display.rkt") @@ -11,9 +13,7 @@ ;; DrRacket tool for reporting missed optimizations in the editor. (define performance-report-bitmap - (make-object - bitmap% - (collection-file-path "performance-report.png" "icons") 'png/mask)) + (compiled-bitmap (stopwatch-icon (toolbar-icon-height)))) ;; performance-report-callback : drracket:unit:frame<%> -> void (define (performance-report-callback drr-frame)