summaryrefslogtreecommitdiffstats
path: root/generic
diff options
context:
space:
mode:
authordkf <donal.k.fellows@manchester.ac.uk>2006-03-15 23:10:53 (GMT)
committerdkf <donal.k.fellows@manchester.ac.uk>2006-03-15 23:10:53 (GMT)
commitb2454c69dcfee02561f24485b4eba5091225181c (patch)
tree5e21480b07977f248a61bd2005bef42a2b21eaa9 /generic
parent01f6b10405b343d8604493dc9568774c6643c07e (diff)
downloadtk-b2454c69dcfee02561f24485b4eba5091225181c.zip
tk-b2454c69dcfee02561f24485b4eba5091225181c.tar.gz
tk-b2454c69dcfee02561f24485b4eba5091225181c.tar.bz2
Squelch [Bug 1409140] by special-case-ing the single-pixel put case.
Diffstat (limited to 'generic')
-rw-r--r--generic/tkImgPhoto.c40
1 files changed, 37 insertions, 3 deletions
diff --git a/generic/tkImgPhoto.c b/generic/tkImgPhoto.c
index 5758897..e1d83ef 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.36.2.14 2005/08/11 12:17:09 dkf Exp $
+ * RCS: @(#) $Id: tkImgPhoto.c,v 1.36.2.15 2006/03/15 23:11:01 dkf Exp $
*/
#include "tkInt.h"
@@ -4587,7 +4587,24 @@ Tk_PhotoPutBlock(handle, blockPtr, x, y, width, height, compRule)
*/
if (alphaOffset != 0 || masterPtr->flags & COMPLEX_ALPHA) {
- ToggleComplexAlphaIfNeeded(masterPtr);
+ /*
+ * Note that we skip in the single pixel case if we can. This speeds
+ * up code that builds up large simple-alpha images by single pixels,
+ * which seems to be a common use-case. [Bug 1409140]
+ */
+
+ if (width == 1 && height == 1 && !(masterPtr->flags & COMPLEX_ALPHA)) {
+ unsigned char newAlpha;
+
+ destLinePtr = masterPtr->pix32 + (y * masterPtr->width + x) * 4;
+ newAlpha = destLinePtr[3];
+
+ if (newAlpha > 0 && newAlpha < 255) {
+ masterPtr->flags |= COMPLEX_ALPHA;
+ }
+ } else {
+ ToggleComplexAlphaIfNeeded(masterPtr);
+ }
}
/*
@@ -4881,7 +4898,24 @@ Tk_PhotoPutZoomedBlock(handle, blockPtr, x, y, width, height, zoomX, zoomY,
*/
if (alphaOffset != 0 || masterPtr->flags & COMPLEX_ALPHA) {
- ToggleComplexAlphaIfNeeded(masterPtr);
+ /*
+ * Note that we skip in the single pixel case if we can. This speeds
+ * up code that builds up large simple-alpha images by single pixels,
+ * which seems to be a common use-case. [Bug 1409140]
+ */
+
+ if (width == 1 && height == 1 && !(masterPtr->flags & COMPLEX_ALPHA)) {
+ unsigned char newAlpha;
+
+ destLinePtr = masterPtr->pix32 + (y * masterPtr->width + x) * 4;
+ newAlpha = destLinePtr[3];
+
+ if (newAlpha > 0 && newAlpha < 255) {
+ masterPtr->flags |= COMPLEX_ALPHA;
+ }
+ } else {
+ ToggleComplexAlphaIfNeeded(masterPtr);
+ }
}
/*