From 5440edfd749e1241d6d6c8ed3abfa6fe4b048287 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Mon, 27 Dec 2010 19:14:22 -0700 Subject: [PATCH] `set-argb-pixels' needs to pre-multiply alpha for a alpha-channel bitmap Closes PR 11571 --- collects/racket/draw/private/bitmap.rkt | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/collects/racket/draw/private/bitmap.rkt b/collects/racket/draw/private/bitmap.rkt index f97ee71889..f885a6dd81 100644 --- a/collects/racket/draw/private/bitmap.rkt +++ b/collects/racket/draw/private/bitmap.rkt @@ -670,12 +670,18 @@ (bytes-set! data (+ ri 1) v) (bytes-set! data (+ ri 2) v) (bytes-set! data (+ ri B) v)) - (begin - (when alpha-channel? - (bytes-set! data (+ ri A) (bytes-ref bstr pi))) - (bytes-set! data (+ ri R) (bytes-ref bstr (+ pi 1))) - (bytes-set! data (+ ri G) (bytes-ref bstr (+ pi 2))) - (bytes-set! data (+ ri B) (bytes-ref bstr (+ pi 3))))))))))) + (if alpha-channel? + (let ([a (bytes-ref bstr pi)] + [pm (lambda (a v) + (quotient (* a v) 255))]) + (bytes-set! data (+ ri A) a) + (bytes-set! data (+ ri R) (pm a (bytes-ref bstr (+ pi 1)))) + (bytes-set! data (+ ri G) (pm a (bytes-ref bstr (+ pi 2)))) + (bytes-set! data (+ ri B) (pm a (bytes-ref bstr (+ pi 3))))) + (begin + (bytes-set! data (+ ri R) (bytes-ref bstr (+ pi 1))) + (bytes-set! data (+ ri G) (bytes-ref bstr (+ pi 2))) + (bytes-set! data (+ ri B) (bytes-ref bstr (+ pi 3)))))))))))) (cairo_surface_mark_dirty s))) (cond [(and set-alpha?