Use bitmap' instead of
icon->pict'
Rename `pict->icon' to `pict->bitmap' and put in `slideshow/pict'
This commit is contained in:
parent
daf371059d
commit
076453dacc
|
@ -11,8 +11,6 @@
|
||||||
icon-style/c
|
icon-style/c
|
||||||
toolbar-icon-height
|
toolbar-icon-height
|
||||||
default-icon-style
|
default-icon-style
|
||||||
icon->pict
|
|
||||||
pict->icon
|
|
||||||
load-icon-pict
|
load-icon-pict
|
||||||
load-icon
|
load-icon
|
||||||
format-icon-name
|
format-icon-name
|
||||||
|
|
|
@ -16,32 +16,17 @@
|
||||||
(defparam toolbar-icon-height (>/c 0) 16)
|
(defparam toolbar-icon-height (>/c 0) 16)
|
||||||
(defparam default-icon-style (or/c 'diffuse 'shiny) 'diffuse)
|
(defparam default-icon-style (or/c 'diffuse 'shiny) 'diffuse)
|
||||||
|
|
||||||
(defproc (icon->pict [icon (is-a?/c bitmap%)]) pict?
|
|
||||||
(bitmap icon))
|
|
||||||
|
|
||||||
(defproc (pict->icon [p pict?]) (is-a?/c bitmap%)
|
|
||||||
(define w (pict-width p))
|
|
||||||
(define h (pict-height p))
|
|
||||||
(define bm (make-bitmap (max 1 (inexact->exact (ceiling w)))
|
|
||||||
(max 1 (inexact->exact (ceiling h)))))
|
|
||||||
(define dc (make-object bitmap-dc% bm))
|
|
||||||
(send dc set-smoothing 'smoothed)
|
|
||||||
(draw-pict p dc 0 0)
|
|
||||||
bm)
|
|
||||||
|
|
||||||
(defproc (load-icon-pict [category string?] [name string?] [height (>=/c 0)]) pict?
|
(defproc (load-icon-pict [category string?] [name string?] [height (>=/c 0)]) pict?
|
||||||
(define hs (icon-category-heights category))
|
(define hs (icon-category-heights category))
|
||||||
(define icon-height
|
(define icon-height
|
||||||
(let ([h (for/first ([h (in-list hs)] #:when (height . <= . h)) h)])
|
(let ([h (for/first ([h (in-list hs)] #:when (height . <= . h)) h)])
|
||||||
(if h h (last hs))))
|
(if h h (last hs))))
|
||||||
(define icon
|
(define icon-path
|
||||||
(make-object bitmap%
|
(build-path svg-icons-base-path (format "~a/~a/~a.png" category icon-height name)))
|
||||||
(build-path svg-icons-base-path (format "~a/~a/~a.png" category icon-height name))
|
(scale (bitmap icon-path) (/ height icon-height)))
|
||||||
'png/alpha))
|
|
||||||
(scale (icon->pict icon) (/ height icon-height)))
|
|
||||||
|
|
||||||
(defproc (load-icon [category string?] [name string?] [height (>=/c 0)]) (is-a?/c bitmap%)
|
(defproc (load-icon [category string?] [name string?] [height (>=/c 0)]) (is-a?/c bitmap%)
|
||||||
(pict->icon (load-icon-pict category name height)))
|
(pict->bitmap (load-icon-pict category name height)))
|
||||||
|
|
||||||
(defproc (format-icon-name [name string?] [color icon-color/c]
|
(defproc (format-icon-name [name string?] [color icon-color/c]
|
||||||
[style (or/c icon-style/c #f) (default-icon-style)]) string?
|
[style (or/c icon-style/c #f) (default-icon-style)]) string?
|
||||||
|
@ -183,7 +168,7 @@
|
||||||
(syntax/loc stx
|
(syntax/loc stx
|
||||||
(begin (defproc (f [color icon-color/c] [height (>=/c 0)]
|
(begin (defproc (f [color icon-color/c] [height (>=/c 0)]
|
||||||
[style icon-style/c (default-icon-style)]) (is-a?/c bitmap%)
|
[style icon-style/c (default-icon-style)]) (is-a?/c bitmap%)
|
||||||
(pict->icon (f-pict color height style)))
|
(pict->bitmap (f-pict color height style)))
|
||||||
...)))]))
|
...)))]))
|
||||||
|
|
||||||
(define-syntax (define-wrapped-icon-fun/no-color stx)
|
(define-syntax (define-wrapped-icon-fun/no-color stx)
|
||||||
|
@ -194,7 +179,7 @@
|
||||||
(syntax/loc stx
|
(syntax/loc stx
|
||||||
(begin (defproc (f [height (>=/c 0)]
|
(begin (defproc (f [height (>=/c 0)]
|
||||||
[style icon-style/c (default-icon-style)]) (is-a?/c bitmap%)
|
[style icon-style/c (default-icon-style)]) (is-a?/c bitmap%)
|
||||||
(pict->icon (f-pict height style)))
|
(pict->bitmap (f-pict height style)))
|
||||||
...)))]))
|
...)))]))
|
||||||
|
|
||||||
(define-wrapped-icon-fun
|
(define-wrapped-icon-fun
|
||||||
|
|
|
@ -74,7 +74,7 @@ Icon sizes are given as heights to make it easier to append them horizontally.
|
||||||
In the following example, applying @racket[load-icon] is equivalent to @racket[(plt-logo 100 'diffuse)]:
|
In the following example, applying @racket[load-icon] is equivalent to @racket[(plt-logo 100 'diffuse)]:
|
||||||
@interaction[#:eval icon-eval (load-icon "logo" "plt-logo-diffuse" 100)]
|
@interaction[#:eval icon-eval (load-icon "logo" "plt-logo-diffuse" 100)]
|
||||||
|
|
||||||
(In the interactions window, you would have to send the result of applying @racket[load-icon] to @racket[icon->pict] to see it.)
|
(In the interactions window, you would have to send the result of applying @racket[load-icon] to @racket[bitmap] to see it.)
|
||||||
|
|
||||||
@doc-apply[icon-categories]{
|
@doc-apply[icon-categories]{
|
||||||
Returns a list of all the icon categories.
|
Returns a list of all the icon categories.
|
||||||
|
@ -221,36 +221,33 @@ A contract that identifies icon styles.
|
||||||
|
|
||||||
It is more flexible, but a little more complicated, to load icons as @racket[pict]s.
|
It is more flexible, but a little more complicated, to load icons as @racket[pict]s.
|
||||||
As picts, icons can easily be appended, inset, superimposed, blurred, and more.
|
As picts, icons can easily be appended, inset, superimposed, blurred, and more.
|
||||||
|
Almost all of the functions in preceeding sections are defined in terms of the @racket[pict]-producing functions documented in this section.
|
||||||
To use these functions effectively, you should require @racketmodname[icons] and @racketmodname[slideshow/pict] together.
|
|
||||||
|
|
||||||
Almost all of the functions in preceeding sections are defined in terms of the functions documented in this section.
|
|
||||||
|
|
||||||
@interaction-eval[#:eval icon-eval (require slideshow/pict)]
|
@interaction-eval[#:eval icon-eval (require slideshow/pict)]
|
||||||
|
|
||||||
@doc-apply[load-icon-pict]{
|
To use these functions effectively, you should require @racketmodname[icons] and @racketmodname[slideshow/pict] together.
|
||||||
Corresponds to @racket[load-icon]. In fact, @racket[load-icon] uses @racket[load-icon-pict] to load the icon as a @racket[pict], and passes it to @racket[pict->icon].
|
Use @racket[bitmap] to convert a @racket[bitmap%] (e.g. an icon) to a @racket[pict], and @racket[pict->bitmap] to convert back.
|
||||||
}
|
|
||||||
|
|
||||||
@doc-apply[icon->pict]
|
Converting from @racket[pict]s to bitmaps can be lossy. For example, converting text can look especially horrible:
|
||||||
@doc-apply[pict->icon]{
|
|
||||||
Convert from an icon to a @racket[pict], and back.
|
|
||||||
|
|
||||||
The conversion from @racket[pict]s to icons can be lossy because it renders vector graphics as a bitmap. For example, converting text can look especially horrible:
|
|
||||||
@interaction[#:eval icon-eval
|
@interaction[#:eval icon-eval
|
||||||
(scale (text "Hello" null 10) 5)
|
(scale (text "Hello" null 10) 5)
|
||||||
(scale (icon->pict (pict->icon (text "Hello" null 10))) 5)]
|
(scale (bitmap (pict->bitmap (text "Hello" null 10))) 5)]
|
||||||
|
|
||||||
Therefore, when composing icons from parts, work only with @racket[pict]s, and convert to an icon as the last step.
|
Therefore, when composing icons from parts, try to work only with @racket[pict]s, and convert to an icon using @racket[pict->bitmap] as the last step.
|
||||||
|
|
||||||
On the other hand, @racket[(compose pict->icon icon->pict)] always returns an equivalent icon:
|
When composing icons from parts, it is fine to use @racket[pict]s converted from @racket[bitmap%]s.
|
||||||
|
Without scaling or rotating, the conversion is lossless:
|
||||||
@interaction[#:eval icon-eval
|
@interaction[#:eval icon-eval
|
||||||
(define not-blurry (magnifying-glass-icon 'green 64 'shiny))
|
(define not-blurry (magnifying-glass-icon 'green 64 'shiny))
|
||||||
not-blurry
|
not-blurry
|
||||||
(define still-not-blurry
|
|
||||||
(for/fold ([icon not-blurry]) ([i (in-range 30)])
|
(for/fold ([icon not-blurry]) ([i (in-range 30)])
|
||||||
(pict->icon (icon->pict icon))))
|
(pict->bitmap (bitmap icon)))]
|
||||||
still-not-blurry]
|
|
||||||
|
Avoid converting between @racket[pict]s and @racket[bitmap%]s more than once if bitmap-backed @racket[pict]s are scaled, rotated by angles that are not multiples of 90 degrees, or superimposed or appended at non-integer coordinates.
|
||||||
|
Avoid scaling up in general.
|
||||||
|
|
||||||
|
@doc-apply[load-icon-pict]{
|
||||||
|
Corresponds to @racket[load-icon]. In fact, @racket[load-icon] uses @racket[load-icon-pict] to load the icon as a @racket[pict], and passes it to @racket[pict->bitmap].
|
||||||
}
|
}
|
||||||
|
|
||||||
@doc-apply[go-icon-pict]
|
@doc-apply[go-icon-pict]
|
||||||
|
@ -360,5 +357,5 @@ For convenience, write functions to load the icon; for example,
|
||||||
height))
|
height))
|
||||||
|
|
||||||
(define (silly-walk-icon color height [style (default-icon-style)])
|
(define (silly-walk-icon color height [style (default-icon-style)])
|
||||||
(pict->icon (silly-walk-icon-pict color height style)))
|
(pict->bitmap (silly-walk-icon-pict color height style)))
|
||||||
]
|
]
|
||||||
|
|
|
@ -75,7 +75,7 @@
|
||||||
3/4))
|
3/4))
|
||||||
|
|
||||||
(define not-blurry
|
(define not-blurry
|
||||||
(let* ([1x (compose icon->pict pict->icon)]
|
(let* ([1x (compose bitmap pict->bitmap)]
|
||||||
[2x (compose 1x 1x)]
|
[2x (compose 1x 1x)]
|
||||||
[4x (compose 2x 2x)]
|
[4x (compose 2x 2x)]
|
||||||
[8x (compose 4x 4x)]
|
[8x (compose 4x 4x)]
|
||||||
|
|
|
@ -1074,6 +1074,12 @@ Draws @racket[pict] to @racket[dc], with its top-left corner at offset
|
||||||
(@racket[x], @racket[y]).}
|
(@racket[x], @racket[y]).}
|
||||||
|
|
||||||
|
|
||||||
|
@defproc[(pict->bitmap [pict pict?])
|
||||||
|
(is-a?/c bitmap%)]{
|
||||||
|
|
||||||
|
Returns a @racket[bitmap%] with an alpha channel, no larger than @racket[pict], with @racket[pict] drawn on it in the top-left corner (@racket[0], @racket[0]).}
|
||||||
|
|
||||||
|
|
||||||
@defproc[(make-pict-drawer [pict pict?])
|
@defproc[(make-pict-drawer [pict pict?])
|
||||||
((is-a?/c dc<%>) real? real? . -> . void?)]{
|
((is-a?/c dc<%>) real? real? . -> . void?)]{
|
||||||
|
|
||||||
|
|
|
@ -7,8 +7,9 @@
|
||||||
[pin-line t:pin-line]
|
[pin-line t:pin-line]
|
||||||
[pin-arrow-line t:pin-arrow-line]
|
[pin-arrow-line t:pin-arrow-line]
|
||||||
[pin-arrows-line t:pin-arrows-line])
|
[pin-arrows-line t:pin-arrows-line])
|
||||||
(only-in racket/draw dc-path%)
|
(only-in racket/draw dc-path% make-bitmap bitmap% bitmap-dc%)
|
||||||
(only-in racket/class new send))
|
(only-in racket/class new send make-object is-a?/c)
|
||||||
|
racket/contract)
|
||||||
|
|
||||||
(define (hline w h #:segment [seg #f])
|
(define (hline w h #:segment [seg #f])
|
||||||
(if seg
|
(if seg
|
||||||
|
@ -200,6 +201,16 @@
|
||||||
(standard-fish w h direction color eye-color open-mouth))])
|
(standard-fish w h direction color eye-color open-mouth))])
|
||||||
standard-fish))
|
standard-fish))
|
||||||
|
|
||||||
|
(define (pict->bitmap p)
|
||||||
|
(define w (pict-width p))
|
||||||
|
(define h (pict-height p))
|
||||||
|
(define bm (make-bitmap (max 1 (inexact->exact (ceiling w)))
|
||||||
|
(max 1 (inexact->exact (ceiling h)))))
|
||||||
|
(define dc (make-object bitmap-dc% bm))
|
||||||
|
(send dc set-smoothing 'smoothed)
|
||||||
|
(draw-pict p dc 0 0)
|
||||||
|
bm)
|
||||||
|
|
||||||
(provide hline vline
|
(provide hline vline
|
||||||
frame
|
frame
|
||||||
pict-path?
|
pict-path?
|
||||||
|
@ -262,4 +273,6 @@
|
||||||
standard-fish
|
standard-fish
|
||||||
|
|
||||||
find-pen find-brush)
|
find-pen find-brush)
|
||||||
(rename-out [fish standard-fish])))
|
(rename-out [fish standard-fish])
|
||||||
|
(contract-out [pict->bitmap (pict? . -> . (is-a?/c bitmap%))])
|
||||||
|
))
|
||||||
|
|
Loading…
Reference in New Issue
Block a user