added finer control over pens

svn: r17670

original commit: ddf0b4ec01063440eed8420f742bff49eaf84059
This commit is contained in:
Robby Findler 2010-01-16 02:03:54 +00:00
parent b22f2873d4
commit 8729e3ca31

View File

@ -174,6 +174,18 @@ has been moved out).
;; a mode is either 'solid or 'outline (indicating a pen width for outline mode) ;; a mode is either 'solid or 'outline (indicating a pen width for outline mode)
;; a pen is
;; - (make-pen color? ;; <- the struct, not a string
;; (<=/c 0 255)
;; (or/c 'solid 'dot 'long-dash 'short-dash 'dot-dash)
;; (or/c 'round 'projecting 'butt)
;; (or/c 'round 'bevel 'miter))
(define-struct/reg-mk pen (color width style cap join) #:transparent)
;; an color is
;; - (make-color (<=/c 0 255) (<=/c 0 255) (<=/c 0 255))
;; - string
(define-struct/reg-mk color (red green blue) #:transparent)
; ;
; ;
@ -409,7 +421,7 @@ has been moved out).
(add-crops (add-crops
(make-polygon (map scale-point (polygon-points shape)) (make-polygon (map scale-point (polygon-points shape))
(polygon-mode shape) (polygon-mode shape)
(polygon-color shape)))]) (scale-color (polygon-color shape) x-scale y-scale)))])
(if bottom (if bottom
(make-overlay bottom (f this-one)) (make-overlay bottom (f this-one))
(f this-one)))] (f this-one)))]
@ -418,7 +430,7 @@ has been moved out).
(add-crops (add-crops
(make-line-segment (scale-point (line-segment-start shape)) (make-line-segment (scale-point (line-segment-start shape))
(scale-point (line-segment-end shape)) (scale-point (line-segment-end shape))
(line-segment-color shape)))]) (scale-color (line-segment-color shape) x-scale y-scale)))])
(if bottom (if bottom
(make-overlay bottom (f this-one)) (make-overlay bottom (f this-one))
(f this-one)))] (f this-one)))]
@ -434,7 +446,7 @@ has been moved out).
(scale-point (curve-segment-end shape)) (scale-point (curve-segment-end shape))
(curve-segment-e-angle shape) (curve-segment-e-angle shape)
(curve-segment-e-pull shape) (curve-segment-e-pull shape)
(curve-segment-color shape)))]) (scale-color (curve-segment-color shape) x-scale y-scale)))])
(if bottom (if bottom
(make-overlay bottom (f this-one)) (make-overlay bottom (f this-one))
(f this-one)))] (f this-one)))]
@ -474,7 +486,7 @@ has been moved out).
(* y-scale (ellipse-height shape)) (* y-scale (ellipse-height shape))
(ellipse-angle shape) (ellipse-angle shape)
(ellipse-mode shape) (ellipse-mode shape)
(ellipse-color shape))] (scale-color (ellipse-color shape) x-scale y-scale))]
[(text? shape) [(text? shape)
;; should probably do something different here so that ;; should probably do something different here so that
;; the y-scale is always greater than 1 ;; the y-scale is always greater than 1
@ -497,6 +509,15 @@ has been moved out).
(* y-scale (bitmap-y-scale shape)) (* y-scale (bitmap-y-scale shape))
#f #f)])) #f #f)]))
(define (scale-color color x-scale y-scale)
(cond
[(pen? color)
(make-pen (pen-color color)
(* (pen-width color) (/ (+ x-scale y-scale) 2))
(pen-style color)
(pen-cap color)
(pen-join color))]
[else color]))
; ;
; ;
@ -556,29 +577,13 @@ has been moved out).
(define (render-simple-shape simple-shape dc dx dy) (define (render-simple-shape simple-shape dc dx dy)
(cond (cond
[(polygon? simple-shape) [(polygon? simple-shape)
(send dc set-pen (mode-color->pen (polygon-mode simple-shape) (let ([mode (polygon-mode simple-shape)]
(polygon-color simple-shape))) [color (polygon-color simple-shape)]
(send dc set-brush (mode-color->brush (polygon-mode simple-shape) [path (polygon-points->path (polygon-points simple-shape))])
(polygon-color simple-shape))) (send dc set-pen (mode-color->pen mode color))
(send dc set-smoothing (mode->smoothing (polygon-mode simple-shape))) (send dc set-brush (mode-color->brush mode color))
(cond (send dc set-smoothing (mode-color->smoothing mode color))
[(eq? (polygon-mode simple-shape) 'outline) (send dc draw-path path dx dy 'winding))]
(let ([connect
(λ (p1 p2)
(let ([path (new dc-path%)])
(send path move-to (point-x p1) (point-y p1))
(send path line-to (point-x p2) (point-y p2))
(send dc draw-path path dx dy)))])
(let loop ([points (polygon-points simple-shape)])
(cond
[(null? (cdr points))
(connect (car points) (car (polygon-points simple-shape)))]
[else
(connect (car points) (cadr points))
(loop (cdr points))])))]
[else
(let ([path (polygon-points->path (polygon-points simple-shape))])
(send dc draw-path path dx dy 'winding))])]
[(line-segment? simple-shape) [(line-segment? simple-shape)
(let* ([start (line-segment-start simple-shape)] (let* ([start (line-segment-start simple-shape)]
[end (line-segment-end simple-shape)] [end (line-segment-end simple-shape)]
@ -589,9 +594,9 @@ has been moved out).
[ey (point-y end)]) [ey (point-y end)])
(send path move-to sx sy) (send path move-to sx sy)
(send path line-to ex ey) (send path line-to ex ey)
(send dc set-pen (line-segment-color simple-shape) 1 'solid) (send dc set-pen (mode-color->pen 'outline (line-segment-color simple-shape)))
(send dc set-brush "black" 'transparent) (send dc set-brush "black" 'transparent)
(send dc set-smoothing 'aligned) (send dc set-smoothing 'smoothed)
(send dc draw-path path dx dy))] (send dc draw-path path dx dy))]
[(curve-segment? simple-shape) [(curve-segment? simple-shape)
(let* ([path (new dc-path%)] (let* ([path (new dc-path%)]
@ -614,9 +619,9 @@ has been moved out).
(+ ey (* ep (sin ea))) (+ ey (* ep (sin ea)))
ex ex
ey) ey)
(send dc set-pen (curve-segment-color simple-shape) 1 'solid) (send dc set-pen (mode-color->pen 'outline (curve-segment-color simple-shape)))
(send dc set-brush "black" 'transparent) (send dc set-brush "black" 'transparent)
(send dc set-smoothing 'aligned) (send dc set-smoothing 'smoothed)
(send dc draw-path path dx dy))] (send dc draw-path path dx dy))]
[else [else
(let ([dx (+ dx (translate-dx simple-shape))] (let ([dx (+ dx (translate-dx simple-shape))]
@ -627,14 +632,16 @@ has been moved out).
(let* ([path (new dc-path%)] (let* ([path (new dc-path%)]
[ew (ellipse-width atomic-shape)] [ew (ellipse-width atomic-shape)]
[eh (ellipse-height atomic-shape)] [eh (ellipse-height atomic-shape)]
[θ (degrees->radians (ellipse-angle atomic-shape))]) [θ (degrees->radians (ellipse-angle atomic-shape))]
[color (ellipse-color atomic-shape)]
[mode (ellipse-mode atomic-shape)])
(let-values ([(rotated-width rotated-height) (ellipse-rotated-size ew eh θ)]) (let-values ([(rotated-width rotated-height) (ellipse-rotated-size ew eh θ)])
(send path ellipse 0 0 ew eh) (send path ellipse 0 0 ew eh)
(send path translate (- (/ ew 2)) (- (/ eh 2))) (send path translate (- (/ ew 2)) (- (/ eh 2)))
(send path rotate θ) (send path rotate θ)
(send dc set-pen (mode-color->pen (ellipse-mode atomic-shape) (ellipse-color atomic-shape))) (send dc set-pen (mode-color->pen mode color))
(send dc set-brush (mode-color->brush (ellipse-mode atomic-shape) (ellipse-color atomic-shape))) (send dc set-brush (mode-color->brush mode color))
(send dc set-smoothing (mode->smoothing (ellipse-mode atomic-shape))) (send dc set-smoothing (mode-color->smoothing mode color))
(send dc draw-path path dx dy)))] (send dc draw-path path dx dy)))]
[(bitmap? atomic-shape) [(bitmap? atomic-shape)
(let ([bm (get-rendered-bitmap atomic-shape)]) (let ([bm (get-rendered-bitmap atomic-shape)])
@ -669,7 +676,8 @@ has been moved out).
(round (point-x (car points))) (round (point-x (car points)))
(round (point-y (car points)))) (round (point-y (car points))))
(loop (cdr points)))) (loop (cdr points))))
(send path line-to (round (point-x (car points))) (round (point-y (car points)))) (send path close)
;(send path line-to (round (point-x (car points))) (round (point-y (car points))))
path)) path))
(define (points->bb-path points) (define (points->bb-path points)
@ -819,24 +827,30 @@ the mask bitmap and the original bitmap are all together in a single bytes!
(define (degrees->radians θ) (define (degrees->radians θ)
(* θ 2 pi (/ 360))) (* θ 2 pi (/ 360)))
(define (mode->smoothing mode) (define (mode-color->smoothing mode color)
(case mode (cond
[(outline) 'aligned] [(and (eq? mode 'outline)
[(solid) 'smoothed])) (not (pen? color)))
'aligned]
[else 'smoothed]))
(define (mode-color->pen mode color) (define (mode-color->pen mode color)
(case mode (case mode
[(outline) [(outline)
(send the-pen-list find-or-create-pen (get-color-arg color) 1 'solid)] (cond
[(pen? color)
(pen->pen-obj/cache color)]
[else
(send the-pen-list find-or-create-pen (get-color-arg color) 0 'solid)])]
[(solid) [(solid)
(send the-pen-list find-or-create-pen "black" 1 'transparent)])) (send the-pen-list find-or-create-pen "black" 1 'transparent)]))
(define (mode-color->brush mode color) (define (mode-color->brush mode color)
(send the-brush-list find-or-create-brush (case mode
(get-color-arg color) [(outline)
(case mode (send the-brush-list find-or-create-brush "black" 'transparent)]
[(outline) 'transparent] [(solid)
[(solid) 'solid]))) (send the-brush-list find-or-create-brush (get-color-arg color) 'solid)]))
(define (get-color-arg color) (define (get-color-arg color)
(if (string? color) (if (string? color)
@ -846,7 +860,33 @@ the mask bitmap and the original bitmap are all together in a single bytes!
(color-green color) (color-green color)
(color-blue color)))) (color-blue color))))
(define-struct/reg-mk color (red green blue) #:transparent)
(define pen-ht (make-hash))
(define (pen->pen-obj/cache pen)
(cond
[(and (equal? 'round (pen-join pen))
(equal? 'round (pen-cap pen)))
(send the-pen-list find-or-create-pen
(pen-color pen)
(pen-width pen)
(pen-style pen))]
[else
(let* ([wb/f (hash-ref pen-ht pen #f)]
[pen-obj/f (and (weak-box? wb/f) (weak-box-value wb/f))])
(or pen-obj/f
(let ([pen-obj (pen->pen-obj pen)])
(hash-set! pen-ht pen (make-weak-box pen-obj))
pen-obj)))]))
(define (pen->pen-obj pen)
(let ([ans (make-object pen%
(pen-color pen)
(pen-width pen)
(pen-style pen))])
(send ans set-cap (pen-cap pen))
(send ans set-join (pen-join pen))
ans))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ -868,6 +908,7 @@ the mask bitmap and the original bitmap are all together in a single bytes!
curve-segment-start curve-segment-s-angle curve-segment-s-pull curve-segment-start curve-segment-s-angle curve-segment-s-pull
curve-segment-end curve-segment-e-angle curve-segment-e-pull curve-segment-end curve-segment-e-angle curve-segment-e-pull
curve-segment-color curve-segment-color
make-pen pen? pen-color pen-width pen-style pen-cap pen-join
make-bitmap bitmap? bitmap-raw-bitmap bitmap-raw-mask bitmap-angle bitmap-x-scale bitmap-y-scale make-bitmap bitmap? bitmap-raw-bitmap bitmap-raw-mask bitmap-angle bitmap-x-scale bitmap-y-scale
bitmap-rendered-bitmap bitmap-rendered-mask bitmap-rendered-bitmap bitmap-rendered-mask