diff options
author | hobbs <hobbs> | 2007-06-10 00:15:51 (GMT) |
---|---|---|
committer | hobbs <hobbs> | 2007-06-10 00:15:51 (GMT) |
commit | d15d30fa7f843c894058933ad72edbc04b0ecc81 (patch) | |
tree | 9706f808b4ee8d790cd1cfdf80a611b767f1f02c /win | |
parent | ac88da786fe0f162bd48af8a0a9cd35112d954b3 (diff) | |
download | tk-d15d30fa7f843c894058933ad72edbc04b0ecc81.zip tk-d15d30fa7f843c894058933ad72edbc04b0ecc81.tar.gz tk-d15d30fa7f843c894058933ad72edbc04b0ecc81.tar.bz2 |
* win/tkWinWm.c (WmIconphotoCmd): fix wm iconphoto RGBA issues.
[Bug 1467997] (janssen)
Diffstat (limited to 'win')
-rw-r--r-- | win/tkWinWm.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/win/tkWinWm.c b/win/tkWinWm.c index e089985..4018958 100644 --- a/win/tkWinWm.c +++ b/win/tkWinWm.c @@ -12,7 +12,7 @@ * See the file "license.terms" for information on usage and redistribution of * this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkWinWm.c,v 1.116 2007/05/04 21:29:23 patthoyts Exp $ + * RCS: @(#) $Id: tkWinWm.c,v 1.117 2007/06/10 00:15:52 hobbs Exp $ */ #include "tkWinInt.h" @@ -4327,7 +4327,8 @@ WmIconphotoCmd( TkWindow *useWinPtr = winPtr; /* window to apply to (NULL if -default) */ Tk_PhotoHandle photo; Tk_PhotoImageBlock block; - int i, width, height, startObj = 3; + int i, width, height, idx, bufferSize, startObj = 3; + unsigned char *bgraPixelPtr; BlockOfIconImagesPtr lpIR; WinIconPtr titlebaricon = NULL; HICON hIcon; @@ -4380,11 +4381,20 @@ WmIconphotoCmd( Tk_PhotoGetImage(photo, &block); /* - * Encode the image data into an HICON. + * Convert the image data into BGRA format (RGBQUAD) and then + * encode the image data into an HICON. */ - + bufferSize = height * width * block.pixelSize; + bgraPixelPtr = ckalloc(bufferSize); + for (idx = 0 ; idx < bufferSize ; idx += 4) { + bgraPixelPtr[idx] = block.pixelPtr[idx+2]; + bgraPixelPtr[idx+1] = block.pixelPtr[idx+1]; + bgraPixelPtr[idx+2] = block.pixelPtr[idx+0]; + bgraPixelPtr[idx+3] = block.pixelPtr[idx+3]; + } hIcon = CreateIcon(Tk_GetHINSTANCE(), width, height, 1, 32, - NULL, (BYTE *) block.pixelPtr); + NULL, (BYTE *) bgraPixelPtr); + ckfree(bgraPixelPtr); if (hIcon == NULL) { /* * XXX should free up created icons. |