diff options
author | William Joye <wjoye@cfa.harvard.edu> | 2019-01-08 21:04:08 (GMT) |
---|---|---|
committer | William Joye <wjoye@cfa.harvard.edu> | 2019-01-08 21:04:08 (GMT) |
commit | 6dac183be1cdcc0a13966343e2c40c3ff56a3810 (patch) | |
tree | 802a6a87435da647463c945cf3571d52a84aad55 /tkimg/base/tkimgPPB.c | |
parent | dbbb38af9cefef9e9e1a03c97945ee59063aa782 (diff) | |
download | blt-6dac183be1cdcc0a13966343e2c40c3ff56a3810.zip blt-6dac183be1cdcc0a13966343e2c40c3ff56a3810.tar.gz blt-6dac183be1cdcc0a13966343e2c40c3ff56a3810.tar.bz2 |
update tkimg 1.4.7
Diffstat (limited to 'tkimg/base/tkimgPPB.c')
-rw-r--r-- | tkimg/base/tkimgPPB.c | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/tkimg/base/tkimgPPB.c b/tkimg/base/tkimgPPB.c new file mode 100644 index 0000000..573fdc6 --- /dev/null +++ b/tkimg/base/tkimgPPB.c @@ -0,0 +1,142 @@ +/* + * tkimgPPB.tcl + */ + +#include <string.h> +#include "tkimg.h" + +/* + * Make sure that all Tk's stub entries are available, no matter what + * Tcl version we compile against. + */ +#undef Tk_PhotoPutBlock /* 266 */ +#define Tk_PhotoPutBlock ((int (*)(Tcl_Interp *, Tk_PhotoHandle, Tk_PhotoImageBlock *, int, int, int, int, int)) *((&tkStubsPtr->tk_MainLoop)+266)) +#undef Tk_PhotoPutBlock_Panic /* 246 */ +#define Tk_PhotoPutBlock_Panic ((void (*)(Tk_PhotoHandle, Tk_PhotoImageBlock *, int, int, int, int, int)) *((&tkStubsPtr->tk_MainLoop)+246)) +#undef Tk_PhotoPutBlock_NoComposite /* 144 */ +#define Tk_PhotoPutBlock_NoComposite ((void (*)(Tk_PhotoHandle, Tk_PhotoImageBlock *, int, int, int, int)) *((&tkStubsPtr->tk_MainLoop)+144)) +#undef Tk_PhotoExpand /* 265 */ +#define Tk_PhotoExpand ((int (*)(Tcl_Interp *, Tk_PhotoHandle, int, int)) *((&tkStubsPtr->tk_MainLoop)+265)) +#undef Tk_PhotoExpand_Panic /* 148 */ +#define Tk_PhotoExpand_Panic ((void (*)(Tk_PhotoHandle, int, int)) *((&tkStubsPtr->tk_MainLoop)+148)) +#undef Tk_PhotoSetSize /* 268 */ +#define Tk_PhotoSetSize ((int (*)(Tcl_Interp *, Tk_PhotoHandle, int, int)) *((&tkStubsPtr->tk_MainLoop)+268)) +#undef Tk_PhotoSetSize_Panic /* 150 */ +#define Tk_PhotoSetSize_Panic ((int (*)(Tk_PhotoHandle, int, int)) *((&tkStubsPtr->tk_MainLoop)+150)) + +/* + *---------------------------------------------------------------------- + * + * tkimg_PhotoPutBlock -- + * + * This procedure is called to put image data into a photo image. + * The difference with Tk_PhotoPutBlock is that it handles the + * transparency information as well. + * + * Results: + * None. + * + * Side effects: + * The image data is stored. The image may be expanded. + * The Tk image code is informed that the image has changed. + * + *---------------------------------------------------------------------- + */ + +int tkimg_PhotoPutBlock( + Tcl_Interp *interp, /* Interpreter for error-reporting. */ + Tk_PhotoHandle handle, /* Opaque handle for the photo image to be updated. */ + Tk_PhotoImageBlock *blockPtr, /* Pointer to a structure describing the + * pixel data to be copied into the image. */ + int x, /* Coordinates of the top-left pixel to */ + int y, /* be updated in the image. */ + int width, /* Dimensions of the area of the image */ + int height,/* to be updated. */ + int flags /* TK_PHOTO_COMPOSITE_OVERLAY or TK_PHOTO_COMPOSITE_SET */ +) { + if (tkimg_initialized & IMG_NOPANIC) { + return Tk_PhotoPutBlock(interp, handle, blockPtr, x, y, width, height, flags); + } + if (tkimg_initialized & IMG_COMPOSITE) { + Tk_PhotoPutBlock_Panic(handle, blockPtr, x, y, width, height, flags); + return TCL_OK; + } + if (0 && (flags == TK_PHOTO_COMPOSITE_OVERLAY)) { + int alphaOffset = blockPtr->offset[3]; + if ((alphaOffset< 0) || (alphaOffset>= blockPtr->pixelSize)) { + alphaOffset = blockPtr->offset[0]; + if (alphaOffset < blockPtr->offset[1]) { + alphaOffset = blockPtr->offset[1]; + } + if (alphaOffset < blockPtr->offset[2]) { + alphaOffset = blockPtr->offset[2]; + } + if (++alphaOffset >= blockPtr->pixelSize) { + alphaOffset = blockPtr->offset[0]; + } + } else { + if ((alphaOffset == blockPtr->offset[1]) || + (alphaOffset == blockPtr->offset[2])) { + alphaOffset = blockPtr->offset[0]; + } + } + if (alphaOffset != blockPtr->offset[0]) { + int X, Y, end; + unsigned char *pixelPtr, *imagePtr, *rowPtr; + rowPtr = imagePtr = blockPtr->pixelPtr; + for (Y = 0; Y < height; Y++) { + X = 0; + pixelPtr = rowPtr + alphaOffset; + while (X < width) { + /* search for first non-transparent pixel */ + while ((X < width) && !(*pixelPtr)) { + X++; pixelPtr += blockPtr->pixelSize; + } + end = X; + /* search for first transparent pixel */ + while ((end < width) && *pixelPtr) { + end++; pixelPtr += blockPtr->pixelSize; + } + if (end > X) { + blockPtr->pixelPtr = rowPtr + blockPtr->pixelSize * X; + Tk_PhotoPutBlock_NoComposite(handle, blockPtr, x+X, y+Y, end-X, 1); + } + X = end; + } + rowPtr += blockPtr->pitch; + } + blockPtr->pixelPtr = imagePtr; + return TCL_OK; + } + } + Tk_PhotoPutBlock_NoComposite(handle, blockPtr, x, y, width, height); + return TCL_OK; +} + +int tkimg_PhotoExpand( + Tcl_Interp *interp, /* Interpreter for error-reporting. */ + Tk_PhotoHandle handle, /* Opaque handle for the photo image + * to be updated. */ + int width, /* Dimensions of the area of the image */ + int height /* to be updated. */ +) { + if (tkimg_initialized & IMG_NOPANIC) { + return Tk_PhotoExpand(interp, handle, width, height); + } + Tk_PhotoExpand_Panic(handle, width, height); + return TCL_OK; +} + +int tkimg_PhotoSetSize( + Tcl_Interp *interp, /* Interpreter for error-reporting. */ + Tk_PhotoHandle handle, /* Opaque handle for the photo image + * to be updated. */ + int width, /* Dimensions of the area of the image */ + int height /* to be updated. */ +) { + if (tkimg_initialized & IMG_NOPANIC) { + return Tk_PhotoSetSize(interp, handle, width, height); + } + Tk_PhotoSetSize_Panic(handle, width, height); + return TCL_OK; +} |