diff --git a/collects/racket/draw/private/record-dc.rkt b/collects/racket/draw/private/record-dc.rkt index a4c3f5c041..d1caa46f8e 100644 --- a/collects/racket/draw/private/record-dc.rkt +++ b/collects/racket/draw/private/record-dc.rkt @@ -197,14 +197,20 @@ (if r (if (send r internal-get-dc) (let ([paths (send r get-paths)]) - (lambda (dc state) - (let ([new-r (make-object region% dc)]) - (send new-r set-paths! (transform-region-paths paths (dc-state-transformation state))) - new-r))) + (values (lambda (dc state) + (let ([new-r (make-object region% dc)]) + (send new-r set-paths! (transform-region-paths paths (dc-state-transformation state))) + new-r)) + paths + #t)) (let ([new-r (make-object region%)]) (send new-r union r) - (lambda (dc state) new-r))) - (lambda (dc state) #f))) + (values (lambda (dc state) new-r) + new-r + #f))) + (values (lambda (dc state) #f) + #f + #f))) (define (transform-region-paths paths t) (if (equal? t '#(1.0 0.0 0.0 1.0 0.0 0.0)) @@ -220,11 +226,13 @@ (cons new-p (cdr p))) paths))) -(define (convert-region r) - (and r - (cons (and (send r internal-get-dc) #t) +(define (convert-region paths/r has-dc?) + (and paths/r + (cons has-dc? (map (lambda (s) (cons (convert-path (car s)) (cdr s))) - (send r get-paths))))) + (if (paths/r . is-a? . region%) + (send paths/r get-paths) + paths/r))))) (define (unconvert-region l) (if l @@ -525,13 +533,13 @@ (define/override (set-clipping-region r) (super set-clipping-region r) (when (continue-recording?) - (let ([make-r (region-maker r)]) + (let-values ([(make-r paths has-dc?) (region-maker r)]) (record (lambda (dc state) (send dc set-clipping-region (combine-regions dc (dc-state-region state) (make-r dc state))) state) - (lambda () (list 'set-clipping-region (convert-region r))))))) + (lambda () (list 'set-clipping-region (convert-region paths has-dc?))))))) (define/override (set-alpha a) (super set-alpha a) diff --git a/collects/tests/gracket/draw.rkt b/collects/tests/gracket/draw.rkt index 74783b8408..5eff3fb4b3 100644 --- a/collects/tests/gracket/draw.rkt +++ b/collects/tests/gracket/draw.rkt @@ -1200,7 +1200,18 @@ (when (send r get-dc) (unless (eq? (send r is-empty?) (eq? clip 'empty)) (show-error 'draw-text "region `is-empty?' mismatch")))))) - + + (define (mutate-region) + (when (and (not clock-clip?) + (not (eq? clip 'none))) + ;; To be uncooperative, mutate the clipping region: + (define r (send dc get-clipping-region)) + (define r2 (make-object region% (send r get-dc))) + (send r2 union r) + (send dc set-clipping-region #f) + (send r set-rectangle 0 0 10 10) + (send dc set-clipping-region r2))) + ;; check default pen/brush: (send dc draw-rectangle 0 0 5 5) (send dc draw-line 0 0 20 6) @@ -1208,6 +1219,8 @@ (send dc set-font (make-object font% 10 'default)) (draw-series dc pen0s pen0t pen0x "0 x 0" 5 0 0 #f) + + (mutate-region) (draw-series dc pen1s pen1t pen1x "1 x 1" 70 0 1 #f) @@ -1256,8 +1269,7 @@ (list (* xscale DRAW-WIDTH) (* yscale DRAW-HEIGHT)) (list (* 2 DRAW-WIDTH) (* 2 DRAW-HEIGHT)))))) - (send dc set-clipping-region #f) - + (send dc set-clipping-region #f) (send dc end-page) (when (and kind multi-page?)