Reimplement shapes with borders to deal with transparency better.
This commit is contained in:
parent
6af65ee19a
commit
958b9fdc02
|
@ -296,8 +296,10 @@ Sets @racket[pict-combine] to refer to @racket[combine-id] within each of the
|
||||||
These functions create shapes with border of the given color and width.
|
These functions create shapes with border of the given color and width.
|
||||||
|
|
||||||
@examples[#:eval the-eval
|
@examples[#:eval the-eval
|
||||||
(ellipse/border 40 20 #:border-color "blue")
|
(ellipse/border 80 40 #:border-color "blue")
|
||||||
(rounded-rectangle/border 40 20 #:color "red")
|
(rounded-rectangle/border 60 60 #:color "red" #:angle 1 #:border-width 3)
|
||||||
|
(circle/border 40 #:color "green" #:border-color "purple")
|
||||||
|
(rectangle/border 200 20 #:border-width 5)
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -209,46 +209,62 @@
|
||||||
;;
|
;;
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
;; the following has been added by stamourv
|
;; the following has been added by stamourv, then replaced with implementations
|
||||||
|
;; adapted from Ian Johnson
|
||||||
|
|
||||||
;; borders may be of slightly uneven width, sadly
|
(define (draw-shape/border dc-path color border-color border-width)
|
||||||
(define-values (ellipse/border
|
(define-values (color* style)
|
||||||
rectangle/border)
|
(if color
|
||||||
(let ()
|
(values color 'solid)
|
||||||
(define ((mk shape) w h
|
(values "white" 'transparent)))
|
||||||
#:color (color "white")
|
(let-values ([(x y w h) (send dc-path get-bounding-box)])
|
||||||
#:border-color (border-color "black")
|
(dc (λ (dc dx dy)
|
||||||
#:border-width (border-width 2))
|
(define old-brush (send dc get-brush))
|
||||||
(cc-superimpose
|
(define old-pen (send dc get-pen))
|
||||||
(colorize (shape w h) border-color)
|
(send dc set-brush
|
||||||
(colorize (shape (- w (* 2 border-width))
|
(send the-brush-list find-or-create-brush color* style))
|
||||||
(- h (* 2 border-width)))
|
(send dc set-pen (send the-pen-list
|
||||||
color)))
|
find-or-create-pen
|
||||||
(values (mk filled-ellipse)
|
border-color
|
||||||
(mk filled-rectangle))))
|
border-width
|
||||||
|
'solid))
|
||||||
(define (rounded-rectangle/border
|
(send dc draw-path dc-path (- dx x) (- dy y))
|
||||||
w h
|
(send dc set-brush old-brush)
|
||||||
#:color (color "white")
|
(send dc set-pen old-pen))
|
||||||
#:border-color (border-color "black")
|
w h)))
|
||||||
#:border-width (border-width 2)
|
|
||||||
#:corner-radius (radius -0.25)
|
|
||||||
#:angle (angle 0))
|
|
||||||
(cc-superimpose
|
|
||||||
(colorize (filled-rounded-rectangle w h radius #:angle angle) border-color)
|
|
||||||
(colorize (filled-rounded-rectangle
|
|
||||||
(- w (* 2 border-width))
|
|
||||||
(- h (* 2 border-width)) radius #:angle angle)
|
|
||||||
color)))
|
|
||||||
|
|
||||||
|
(define (ellipse/border ew eh
|
||||||
|
#:color [color #f]
|
||||||
|
#:border-color [border-color "black"]
|
||||||
|
#:border-width [border-width 2])
|
||||||
|
(define dc-path (new dc-path%))
|
||||||
|
(send dc-path ellipse 0 0 ew eh)
|
||||||
|
(draw-shape/border dc-path color border-color border-width))
|
||||||
(define (circle/border d
|
(define (circle/border d
|
||||||
#:color (color "white")
|
#:color [color #f]
|
||||||
#:border-color (border-color "black")
|
#:border-color [border-color "black"]
|
||||||
#:border-width (border-width 2))
|
#:border-width [border-width 2])
|
||||||
(cc-superimpose
|
(ellipse/border d d
|
||||||
(colorize (disk d) border-color)
|
#:color color #:border-color border-color
|
||||||
(colorize (disk (- d (* 2 border-width)))
|
#:border-width border-width))
|
||||||
color)))
|
(define (rounded-rectangle/border w h
|
||||||
|
#:color [color #f]
|
||||||
|
#:border-color [border-color "black"]
|
||||||
|
#:border-width [border-width 2]
|
||||||
|
#:corner-radius [corner-radius -0.25]
|
||||||
|
#:angle [angle 0])
|
||||||
|
(define dc-path (new dc-path%))
|
||||||
|
(send dc-path rounded-rectangle 0 0 w h corner-radius)
|
||||||
|
(send dc-path rotate angle)
|
||||||
|
(draw-shape/border dc-path color border-color border-width))
|
||||||
|
(define (rectangle/border w h
|
||||||
|
#:color [color #f]
|
||||||
|
#:border-color [border-color "black"]
|
||||||
|
#:border-width [border-width 2]
|
||||||
|
#:corner-radius [corner-radius -0.25])
|
||||||
|
(define dc-path (new dc-path%))
|
||||||
|
(send dc-path rectangle 0 0 w h)
|
||||||
|
(draw-shape/border dc-path color border-color border-width))
|
||||||
|
|
||||||
(define shape/border-contract
|
(define shape/border-contract
|
||||||
(->* [real? real?]
|
(->* [real? real?]
|
||||||
|
|
Loading…
Reference in New Issue
Block a user