merged unstable/gui/blur into unstable/gui/pict

This commit is contained in:
Ryan Culpepper 2011-07-30 00:42:08 -05:00
parent 19ec1fbccd
commit d1fcbc0a7c
5 changed files with 100 additions and 111 deletions

View File

@ -4,7 +4,9 @@
racket/splicing racket/stxparam racket/draw
racket/block racket/class
unstable/define
(for-syntax racket/base))
(for-syntax racket/base)
"private/blur.rkt")
(provide (all-from-out "private/blur.rkt"))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
@ -12,6 +14,7 @@
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ryanc: 'inset-to' might be a better name than 'fill'
(define (fill pict w h)
(cc-superimpose
pict

View File

@ -13,4 +13,3 @@
@include-section["gui/pict.scrbl"]
@include-section["gui/slideshow.scrbl"]
@include-section["gui/pslide.scrbl"]
@include-section["gui/blur.scrbl"]

View File

@ -1,107 +0,0 @@
#lang scribble/doc
@(require scribble/base
scribble/manual
scribble/eval
"../utils.rkt"
(for-label racket/base
racket/contract
racket/class
racket/future
slideshow/pict
racket/draw
unstable/gui/blur))
@title[#:tag "blur"]{Blur}
@unstable[@author+email["Ryan Culpepper" "ryanc@racket-lang.org"]]
@(define the-eval (make-base-eval))
@(the-eval '(require slideshow/pict unstable/gui/blur))
@defmodule[unstable/gui/blur]
@defproc[(blur [p pict?]
[h-radius (and/c real? (not/c negative?))]
[v-radius (and/c real? (not/c negative?)) h-radius]
[#:mode mode (or/c 'gaussian 'iterated-box 'single-box) 'iterated-box])
pict?]{
Blurs @racket[p] using a gaussian blur (if @racket[mode] is
@racket['gaussian]), an iterated box blur that approximates a gaussian
blur (if @racket[mode] is @racket['iterated-box]), or a single box
blur (if @racket[mode] is @racket['single-box]). The @racket[h-radius]
and @racket[v-radius] arguments control the strength of the horizontal
and vertical components of the blur, respectively. They are given in
terms of pict units, which may not directly correspond to screen pixels.
The @racket['gaussian] blur mode is quite slow for large blur
radii. It takes work proportional to
@racketblock[(* (pict-width p) (pict-height p) (+ h-radius v-radius))]
The @racket['iterated-box] blur mode is much faster; it takes work
proportional to
@racketblock[(* (pict-width p) (pict-height p))]
The genuine @racket['gaussian] mode generally produces smoother and
lighter images, but the @racket['iterated-box] approximation is
acceptable for most uses. All modes may be sped up by a factor of up
to @racket[(processor-count)] due to the use of @racket[future]s.
@examples[#:eval the-eval
(blur (text "blur" null 40) 5)
(blur (text "more blur" null 40) 10)
(blur (text "much blur" null 40) 20)
(blur (text "horiz. blur" null 40) 10 0)
]
The resulting pict has the same bounding box as @racket[p], so when
picts are automatically @racket[clip]ped (as in Scribble documents),
the pict should be @racket[inset] by the blur radius.
@examples[#:eval the-eval
(inset (blur (text "more blur" null 40) 10) 10)
]
Genuine @racket['gaussian] blur compared with @racket['iterated-box] blur:
@examples[#:eval the-eval
(vl-append (inset (blur (text "blur" null 40) 10 #:mode 'gaussian) 10)
(inset (blur (text "blur" null 40) 10 #:mode 'iterated-box) 10))
]
}
@defproc[(blur-bitmap! [bitmap (is-a?/c bitmap%)]
[h-radius (and/c real? (not/c negative?))]
[v-radius (and/c real? (not/c negative?)) h-radius]
[#:mode mode (or/c 'gaussian 'iterated-box 'single-box) 'iterated-box])
void?]{
Blurs @racket[bitmap] using blur radii @racket[h-radius] and
@racket[v-radius] and mode @racket[mode].
}
@defproc[(shadow [p pict?]
[radius (and/c real? (not/c negative?))]
[dx real? 0]
[dy real? dx]
[#:color color (or/c #f string? (is-a?/c color%)) #f]
[#:shadow-color shadow-color (or/c #f string? (is-a?/c color%)) #f]
[#:mode mode (or/c 'gaussian 'iterated-box 'single-box) 'iterated-box])
pict?]{
Creates a shadow effect by superimposing @racket[p] over a
blurred version of @racket[p]. The shadow is offset from @racket[p] by
(@racket[dx], @racket[dy]) units.
If @racket[color] is not @racket[#f], the foreground part is
@racket[(colorize p color)]; otherwise it is just @racket[p]. If
@racket[shadow-color] is not @racket[#f], the shadow part is produced
by blurring @racket[(colorize p shadow-color)]; otherwise it is
produced by blurring @racket[p].
The resulting pict has the same bounding box as @racket[p].
@examples[#:eval the-eval
(inset (shadow (text "shadow" null 50) 10) 10)
(inset (shadow (text "shadow" null 50) 10 5) 10)
(inset (shadow (text "shadow" null 50)
5 0 2 #:color "white" #:shadow-color "red")
10)
]
}
@(close-eval the-eval)

View File

@ -1,7 +1,12 @@
#lang scribble/manual
@(require "../utils.rkt"
scribble/eval
(for-label slideshow
(for-label racket/base
racket/contract
racket/class
racket/draw
racket/future
slideshow/pict
unstable/contract
unstable/gui/pict))
@ -237,7 +242,7 @@ Sets @racket[pict-combine] to refer to @racket[combine-id] within each of the
]
}
@section{Miscellaneous Pict Utilities}
@section{Shapes with Borders}
@addition{Vincent St-Amour}
@ -271,6 +276,8 @@ These functions create shapes with border of the given color and width.
]
}
@section{Lines with Labels}
@addition{Scott Owens}
@deftogether[(
@ -338,4 +345,91 @@ the line.
]
}
@section{Blur}
@addition{Ryan Culpepper}
@defproc[(blur [p pict?]
[h-radius (and/c real? (not/c negative?))]
[v-radius (and/c real? (not/c negative?)) h-radius]
[#:mode mode (or/c 'gaussian 'iterated-box 'single-box) 'iterated-box])
pict?]{
Blurs @racket[p] using a gaussian blur (if @racket[mode] is
@racket['gaussian]), an iterated box blur that approximates a gaussian
blur (if @racket[mode] is @racket['iterated-box]), or a single box
blur (if @racket[mode] is @racket['single-box]). The @racket[h-radius]
and @racket[v-radius] arguments control the strength of the horizontal
and vertical components of the blur, respectively. They are given in
terms of pict units, which may not directly correspond to screen pixels.
The @racket['gaussian] blur mode can be quite slow, especially for
large blur radii. It takes work proportional to
@racketblock[(* (pict-width p) (pict-height p) (+ h-radius v-radius))]
The default @racket['iterated-box] blur mode is faster; it takes work
proportional to
@racketblock[(* (pict-width p) (pict-height p))]
All modes may be sped up by a factor of up to
@racket[(processor-count)] due to the use of @racket[future]s.
@examples[#:eval the-eval
(blur (text "blur" null 40) 5)
(blur (text "more blur" null 40) 10)
(blur (text "much blur" null 40) 20)
(blur (text "horiz. blur" null 40) 10 0)
]
The resulting pict has the same bounding box as @racket[p], so when
picts are automatically @racket[clip]ped (as in Scribble documents),
the pict should be @racket[inset] by the blur radius.
@examples[#:eval the-eval
(inset (blur (text "more blur" null 40) 10) 10)
]
Genuine @racket['gaussian] blur compared with @racket['iterated-box] blur:
@examples[#:eval the-eval
(vl-append (inset (blur (text "blur" null 40) 10 #:mode 'gaussian) 10)
(inset (blur (text "blur" null 40) 10 #:mode 'iterated-box) 10))
]
}
@defproc[(shadow [p pict?]
[radius (and/c real? (not/c negative?))]
[dx real? 0]
[dy real? dx]
[#:color color (or/c #f string? (is-a?/c color%)) #f]
[#:shadow-color shadow-color (or/c #f string? (is-a?/c color%)) #f]
[#:mode mode (or/c 'gaussian 'iterated-box 'single-box) 'iterated-box])
pict?]{
Creates a shadow effect by superimposing @racket[p] over a
blurred version of @racket[p]. The shadow is offset from @racket[p] by
(@racket[dx], @racket[dy]) units.
If @racket[color] is not @racket[#f], the foreground part is
@racket[(colorize p color)]; otherwise it is just @racket[p]. If
@racket[shadow-color] is not @racket[#f], the shadow part is produced
by blurring @racket[(colorize p shadow-color)]; otherwise it is
produced by blurring @racket[p].
The resulting pict has the same bounding box as @racket[p].
@examples[#:eval the-eval
(inset (shadow (text "shadow" null 50) 10) 10)
(inset (shadow (text "shadow" null 50) 10 5) 10)
(inset (shadow (text "shadow" null 50)
5 0 2 #:color "white" #:shadow-color "red")
10)
]
}
@defproc[(blur-bitmap! [bitmap (is-a?/c bitmap%)]
[h-radius (and/c real? (not/c negative?))]
[v-radius (and/c real? (not/c negative?)) h-radius]
[#:mode mode (or/c 'gaussian 'iterated-box 'single-box) 'iterated-box])
void?]{
Blurs @racket[bitmap] using blur radii @racket[h-radius] and
@racket[v-radius] and mode @racket[mode].
}
@(close-eval the-eval)