diff --git a/collects/racket/draw/private/bitmap-dc.rkt b/collects/racket/draw/private/bitmap-dc.rkt index 469508cb37..8aa16dbad5 100644 --- a/collects/racket/draw/private/bitmap-dc.rkt +++ b/collects/racket/draw/private/bitmap-dc.rkt @@ -50,6 +50,7 @@ (exact->inexact (send bm get-height))))) (define/override (get-cr) c) + (define/override (release-cr cr) (when bm (send bm drop-alpha-s))) (define/override (end-cr) (void)) diff --git a/collects/racket/draw/private/bitmap.rkt b/collects/racket/draw/private/bitmap.rkt index 13114daf0f..da99da0d02 100644 --- a/collects/racket/draw/private/bitmap.rkt +++ b/collects/racket/draw/private/bitmap.rkt @@ -190,7 +190,7 @@ ;; Use for non-alpha color bitmaps when they are used as a mask: (define alpha-s #f) (define alpha-s-up-to-date? #f) - (define/private (drop-alpha-s) + (define/public (drop-alpha-s) (set! alpha-s-up-to-date? #f) (when alpha-s (let ([s2 alpha-s]) @@ -681,7 +681,8 @@ [(and set-alpha? (not alpha-channel?)) ;; Set alphas: - (set-alphas-as-mask x y w h bstr (* 4 w) 0)])) + (set-alphas-as-mask x y w h bstr (* 4 w) 0)]) + (drop-alpha-s)) (define/public (get-alphas-as-mask x y w h bstr) (let ([data (cairo_image_surface_get_data (if (or b&w? alpha-channel?) diff --git a/collects/racket/draw/private/local.rkt b/collects/racket/draw/private/local.rkt index c3cfeea2c4..7987888e63 100644 --- a/collects/racket/draw/private/local.rkt +++ b/collects/racket/draw/private/local.rkt @@ -12,6 +12,7 @@ get-cairo-alpha-surface release-bitmap-storage get-bitmap-gl-context + drop-alpha-s ;; bitmap-dc% internal-get-bitmap diff --git a/collects/tests/gracket/dc.rktl b/collects/tests/gracket/dc.rktl index cfff7e84ee..10ea7d6b4b 100644 --- a/collects/tests/gracket/dc.rktl +++ b/collects/tests/gracket/dc.rktl @@ -235,7 +235,7 @@ 255 0 0 0 255 255 255 255)) (send u set-loaded-mask mu) - (define (try-draw nonce-color b&w?) + (define (try-draw nonce-color b&w? changed?) (let* ((bm (make-object bitmap% 2 2 b&w?)) (dc (make-object bitmap-dc% bm))) (send dc clear) @@ -254,15 +254,33 @@ 0 255 255 255 0 255 255 255 0 255 255 255) - (bytes 255 100 0 0 - 255 255 255 255 - 255 255 255 255 - 255 255 255 255)) + (if changed? + (bytes 255 255 255 255 + 255 0 0 0 + 255 255 255 255 + 255 255 255 255) + (bytes 255 100 0 0 + 255 255 255 255 + 255 255 255 255 + 255 255 255 255))) 'masked-draw s)))) - (try-draw (make-object color% "green") #f) - (try-draw (make-object color%) #f) - (try-draw (make-object color%) #t)) + (try-draw (make-object color% "green") #f #f) + (try-draw (make-object color%) #f #f) + (try-draw (make-object color%) #t #f) + (send mu set-argb-pixels 0 0 2 2 + (bytes 255 255 255 255 + 255 0 0 0 + 255 255 255 255 + 255 0 0 0)) + (try-draw (make-object color%) #f #t) + (let ([dc (make-object bitmap-dc% mu)]) + (send dc erase) + (send dc set-pen "white" 1 'transparent) + (send dc set-brush "black" 'solid) + (send dc draw-rectangle 0 0 1 1) + (send dc set-bitmap #f)) + (try-draw (make-object color%) #f #f)) ;; ----------------------------------------