From 985a1f03d9d2cd2596408671ce50adc009ea8aeb Mon Sep 17 00:00:00 2001 From: dkf Date: Fri, 3 Dec 2004 13:09:39 +0000 Subject: Alpha blending fix. [Patch 848161] --- ChangeLog | 7 +++++++ generic/tkImgPhoto.c | 57 ++++++++++++++++++++++++++++++++-------------------- 2 files changed, 42 insertions(+), 22 deletions(-) diff --git a/ChangeLog b/ChangeLog index eaa4531..73832ae 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2004-12-03 Donal K. Fellows + + * generic/tkImgPhoto.c (Tk_PhotoPutBlock, Tk_PhotoPutZoomedBlock): + Make overlay compositing where the target is empty no longer set + the target to magical gray, and also make sure that the + complex-alpha flag is toggled when necessary. [Patch 848161] + 2004-12-01 Jeff Hobbs * unix/tkUnixButton.c (TkpDisplayButton): constrain coords to diff --git a/generic/tkImgPhoto.c b/generic/tkImgPhoto.c index 76a07dd..34d0d46 100644 --- a/generic/tkImgPhoto.c +++ b/generic/tkImgPhoto.c @@ -17,7 +17,7 @@ * Department of Computer Science, * Australian National University. * - * RCS: @(#) $Id: tkImgPhoto.c,v 1.52 2004/12/02 02:10:37 hobbs Exp $ + * RCS: @(#) $Id: tkImgPhoto.c,v 1.53 2004/12/03 13:09:39 dkf Exp $ */ #include "tkInt.h" @@ -2545,14 +2545,15 @@ static int ToggleComplexAlphaIfNeeded(PhotoMaster *mPtr) { size_t len = MAX(mPtr->userWidth, mPtr->width) * - MAX(mPtr->userHeight, mPtr->height) * 4; - unsigned char *c = mPtr->pix32; + MAX(mPtr->userHeight, mPtr->height) * 4; + unsigned char *c = mPtr->pix32; unsigned char *end = c + len; /* * Set the COMPLEX_ALPHA flag if we have an image with partially * transparent bits. */ + mPtr->flags &= ~COMPLEX_ALPHA; c += 3; /* start at first alpha byte */ for (; c < end; c += 4) { @@ -4476,20 +4477,20 @@ Tk_PhotoPutBlock(interp, handle, blockPtr, x, y, width, height, compRule) * Combine according to the compositing rule. */ switch (compRule) { - case TK_PHOTO_COMPOSITE_SET: - *destPtr++ = srcPtr[0]; - *destPtr++ = srcPtr[greenOffset]; - *destPtr++ = srcPtr[blueOffset]; - *destPtr++ = alpha; - break; - case TK_PHOTO_COMPOSITE_OVERLAY: if (!destPtr[3]) { /* - * There must be a better way to select a - * background colour! + * The destination is entirely + * blank, so set it to the source, + * just as if we used the SET + * compositing rule. */ - destPtr[0] = destPtr[1] = destPtr[2] = 0xd9; + case TK_PHOTO_COMPOSITE_SET: + *destPtr++ = srcPtr[0]; + *destPtr++ = srcPtr[greenOffset]; + *destPtr++ = srcPtr[blueOffset]; + *destPtr++ = alpha; + break; } if (alpha) { @@ -4586,6 +4587,12 @@ Tk_PhotoPutBlock(interp, handle, blockPtr, x, y, width, height, compRule) } /* + * Check if display code needs alpha blending... + */ + + ToggleComplexAlphaIfNeeded(masterPtr); + + /* * Update each instance. */ @@ -4779,19 +4786,19 @@ Tk_PhotoPutZoomedBlock(interp, handle, blockPtr, x, y, width, height, } switch (compRule) { - case TK_PHOTO_COMPOSITE_SET: - *destPtr++ = srcPtr[0]; - *destPtr++ = srcPtr[greenOffset]; - *destPtr++ = srcPtr[blueOffset]; - *destPtr++ = alpha; - break; case TK_PHOTO_COMPOSITE_OVERLAY: if (!destPtr[3]) { /* - * There must be a better way to select a - * background colour! + * The destination is entirely blank, + * so set it to the source, just as if + * we used the SET compositing rule. */ - destPtr[0] = destPtr[1] = destPtr[2] = 0xd9; + case TK_PHOTO_COMPOSITE_SET: + *destPtr++ = srcPtr[0]; + *destPtr++ = srcPtr[greenOffset]; + *destPtr++ = srcPtr[blueOffset]; + *destPtr++ = alpha; + break; } if (alpha) { int Alpha = destPtr[3]; @@ -4880,6 +4887,12 @@ Tk_PhotoPutZoomedBlock(interp, handle, blockPtr, x, y, width, height, } /* + * Check if display code needs alpha blending... + */ + + ToggleComplexAlphaIfNeeded(masterPtr); + + /* * Update each instance. */ -- cgit v0.12