Index: generic/tkImgPhoto.c =================================================================== RCS file: /cvsroot/tktoolkit/tk/generic/tkImgPhoto.c,v retrieving revision 1.40 diff -u -r1.40 tkImgPhoto.c --- generic/tkImgPhoto.c 15 Aug 2003 10:54:59 -0000 1.40 +++ generic/tkImgPhoto.c 25 Oct 2003 00:14:59 -0000 @@ -1049,6 +1049,12 @@ if (options.options & OPT_FORMAT) { return TCL_ERROR; } + + /* + * We're not an image format, we're a list of lists of pixel + * colours. + */ + Tcl_ResetResult(interp); if (Tcl_ListObjGetElements(interp, options.name, &dataHeight, &srcObjv) != TCL_OK) { @@ -1072,7 +1078,7 @@ } dataWidth = listObjc; pixelPtr = (unsigned char *) - ckalloc((unsigned) dataWidth * dataHeight * 3); + ckalloc((unsigned) dataWidth * dataHeight * 4); block.pixelPtr = pixelPtr; } else if (listObjc != dataWidth) { Tcl_AppendResult(interp, "all elements of color list must", @@ -1089,6 +1095,16 @@ * absolutely do not want to invoke the fallback code. */ + if (colorString[0] == '\0') { + /* + * Empty string == transparent + */ + *pixelPtr++ = 0; + *pixelPtr++ = 0; + *pixelPtr++ = 0; + *pixelPtr++ = 0; + continue; + } if (colorString[0] == '#') { if (isxdigit(UCHAR(colorString[1])) && isxdigit(UCHAR(colorString[2])) && @@ -1100,6 +1116,7 @@ *pixelPtr++ = tmpr * 0x11; *pixelPtr++ = tmpg * 0x11; *pixelPtr++ = tmpb * 0x11; + *pixelPtr++ = 0xff; continue; } else if (isxdigit(UCHAR(colorString[4])) && isxdigit(UCHAR(colorString[5])) && @@ -1111,6 +1128,7 @@ *pixelPtr++ = tmpr; *pixelPtr++ = tmpg; *pixelPtr++ = tmpb; + *pixelPtr++ = 0xff; continue; } } @@ -1125,6 +1143,7 @@ *pixelPtr++ = color.red >> 8; *pixelPtr++ = color.green >> 8; *pixelPtr++ = color.blue >> 8; + *pixelPtr++ = 0xff; } if (x < dataWidth) { break; @@ -1151,16 +1170,16 @@ } block.width = dataWidth; block.height = dataHeight; - block.pitch = dataWidth * 3; - block.pixelSize = 3; + block.pitch = dataWidth * 4; + block.pixelSize = 4; block.offset[0] = 0; block.offset[1] = 1; block.offset[2] = 2; - block.offset[3] = 0; + block.offset[3] = 3; result = Tk_PhotoPutBlock(interp, (ClientData)masterPtr, &block, options.toX, options.toY, options.toX2 - options.toX, options.toY2 - options.toY, - TK_PHOTO_COMPOSITE_SET); + TK_PHOTO_COMPOSITE_OVERLAY); ckfree((char *) block.pixelPtr); return result;