diff options
-rw-r--r-- | ChangeLog | 18 | ||||
-rw-r--r-- | generic/tk.decls | 29 | ||||
-rw-r--r-- | generic/tk.h | 27 | ||||
-rw-r--r-- | generic/tkDecls.h | 84 | ||||
-rw-r--r-- | generic/tkImgGIF.c | 13 | ||||
-rw-r--r-- | generic/tkImgPPM.c | 14 | ||||
-rw-r--r-- | generic/tkImgPhoto.c | 172 | ||||
-rw-r--r-- | generic/tkStubInit.c | 14 |
8 files changed, 295 insertions, 76 deletions
@@ -1,3 +1,21 @@ +2003-03-06 Donal K. Fellows <fellowsd@cs.man.ac.uk> + + * generic/tkImgPhoto.c (Tk_PhotoExpand, Tk_PhotoPutBlock, + Tk_PhotoPutZoomedBlock, Tk_PhotoSetSize): Added interp argument to + these functions and made them return a standard Tcl result, with + error indicating memory allocation failure instead of panic()ing. + [See TIP #116 at http://purl.org/tcl/tip/116.html for discussion.] + Each of these functions has also acquired a backward-compatability + variant as well, named with a _Panic suffix. + * generic.tk.decls: New API in new slots, back-compat API in old ones. + * generic/tk.h (USE_PANIC_ON_PHOTO_ALLOC_FAILURE): Allow users to + define this symbol to get the old 8.4 photo image API, including + panic() calls when things go wrong. + + * generic/tkImgPhoto.c (ImgPhotoCmd): Adjusted to use the new API + * generic/tkImgGIF.c (FileReadGIF): discussed above. + * generic/tkImgPPM.c (FileReadPPM): + 2003-03-05 David Gravereaux <davygrvy@pobox.com> * win/rules.vc: updated default tcl version to 8.5. diff --git a/generic/tk.decls b/generic/tk.decls index deece6d..0f5d4ad 100644 --- a/generic/tk.decls +++ b/generic/tk.decls @@ -11,7 +11,7 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# RCS: @(#) $Id: tk.decls,v 1.24 2002/08/31 06:12:19 das Exp $ +# RCS: @(#) $Id: tk.decls,v 1.25 2003/03/06 15:05:25 dkf Exp $ library tk @@ -731,7 +731,7 @@ declare 147 generic { } declare 148 generic { - void Tk_PhotoExpand (Tk_PhotoHandle handle, int width, int height ) + void Tk_PhotoExpand_Panic (Tk_PhotoHandle handle, int width, int height ) } declare 149 generic { @@ -739,7 +739,7 @@ declare 149 generic { } declare 150 generic { - void Tk_PhotoSetSize (Tk_PhotoHandle handle, int width, int height) + void Tk_PhotoSetSize_Panic (Tk_PhotoHandle handle, int width, int height) } declare 151 generic { @@ -1166,12 +1166,12 @@ declare 245 generic { } declare 246 generic { - void Tk_PhotoPutBlock (Tk_PhotoHandle handle, + void Tk_PhotoPutBlock_Panic (Tk_PhotoHandle handle, Tk_PhotoImageBlock *blockPtr, int x, int y, int width, int height, int compRule) } declare 247 generic { - void Tk_PhotoPutZoomedBlock (Tk_PhotoHandle handle, + void Tk_PhotoPutZoomedBlock_Panic (Tk_PhotoHandle handle, Tk_PhotoImageBlock *blockPtr, int x, int y, int width, int height, int zoomX, int zoomY, int subsampleX, int subsampleY, int compRule) @@ -1243,6 +1243,25 @@ declare 264 generic { int width, int height, int state) } +# TIP#116 +declare 265 generic { + int Tk_PhotoExpand(Tcl_Interp *interp, Tk_PhotoHandle handle, + int width, int height) +} +declare 266 generic { + int Tk_PhotoPutBlock(Tcl_Interp *interp, Tk_PhotoHandle handle, + Tk_PhotoImageBlock *blockPtr, int x, int y, int width, int height, + int compRule) +} +declare 267 generic { + int Tk_PhotoPutZoomedBlock(Tcl_Interp *interp, Tk_PhotoHandle handle, + Tk_PhotoImageBlock *blockPtr, int x, int y, int width, int height, + int zoomX, int zoomY, int subsampleX, int subsampleY, int compRule) +} +declare 268 generic { + int Tk_PhotoSetSize(Tcl_Interp *interp, Tk_PhotoHandle handle, + int width, int height) +} # Define the platform specific public Tk interface. These functions are # only available on the designated platform. diff --git a/generic/tk.h b/generic/tk.h index 9c9592a..debac6c 100644 --- a/generic/tk.h +++ b/generic/tk.h @@ -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: tk.h,v 1.75 2003/03/04 23:50:41 dgp Exp $ + * RCS: @(#) $Id: tk.h,v 1.76 2003/03/06 15:05:26 dkf Exp $ */ #ifndef _TK @@ -1577,7 +1577,7 @@ typedef int (Tk_SelectionProc) _ANSI_ARGS_((ClientData clientData, /* * Allow users to say that they don't want to alter their source to - * add the extra argument to Tk_PhotoPutBlock(); DO NOT DEFINE THIS + * add extra arguments to Tk_PhotoPutBlock() et al; DO NOT DEFINE THIS * WHEN BUILDING TK. * * This goes after the inclusion of the stubbed-decls so that the @@ -1593,13 +1593,34 @@ typedef int (Tk_SelectionProc) _ANSI_ARGS_((ClientData clientData, # undef Tk_PhotoPutZoomedBlock # endif # define Tk_PhotoPutZoomedBlock Tk_PhotoPutZoomedBlock_NoComposite +# define USE_PANIC_ON_PHOTO_ALLOC_FAILURE +#else /* !USE_COMPOSITELESS_PHOTO_PUT_BLOCK */ +# ifdef USE_PANIC_ON_PHOTO_ALLOC_FAILURE +# ifdef Tk_PhotoPutBlock +# undef Tk_PhotoPutBlock +# endif +# define Tk_PhotoPutBlock Tk_PhotoPutBlock_Panic +# ifdef Tk_PhotoPutZoomedBlock +# undef Tk_PhotoPutZoomedBlock +# endif +# define Tk_PhotoPutZoomedBlock Tk_PhotoPutZoomedBlock_Panic +# endif /* USE_PANIC_ON_PHOTO_ALLOC_FAILURE */ #endif /* USE_COMPOSITELESS_PHOTO_PUT_BLOCK */ +#ifdef USE_PANIC_ON_PHOTO_ALLOC_FAILURE +# ifdef Tk_PhotoExpand +# undef Tk_PhotoExpand +# endif +# define Tk_PhotoExpand Tk_PhotoExpand_Panic +# ifdef Tk_PhotoSetSize +# undef Tk_PhotoSetSize +# endif +# define Tk_PhotoSetSize Tk_PhotoSetSize_Panic +#endif /* USE_PANIC_ON_PHOTO_ALLOC_FAILURE */ /* * Tcl commands exported by Tk: */ - #undef TCL_STORAGE_CLASS #define TCL_STORAGE_CLASS DLLIMPORT diff --git a/generic/tkDecls.h b/generic/tkDecls.h index fd5aadd..9216495 100644 --- a/generic/tkDecls.h +++ b/generic/tkDecls.h @@ -8,7 +8,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkDecls.h,v 1.23 2002/08/05 04:30:38 dgp Exp $ + * RCS: @(#) $Id: tkDecls.h,v 1.24 2003/03/06 15:05:28 dkf Exp $ */ #ifndef _TKDECLS @@ -531,14 +531,14 @@ EXTERN int Tk_PhotoGetImage _ANSI_ARGS_((Tk_PhotoHandle handle, /* 147 */ EXTERN void Tk_PhotoBlank _ANSI_ARGS_((Tk_PhotoHandle handle)); /* 148 */ -EXTERN void Tk_PhotoExpand _ANSI_ARGS_((Tk_PhotoHandle handle, - int width, int height)); +EXTERN void Tk_PhotoExpand_Panic _ANSI_ARGS_(( + Tk_PhotoHandle handle, int width, int height)); /* 149 */ EXTERN void Tk_PhotoGetSize _ANSI_ARGS_((Tk_PhotoHandle handle, int * widthPtr, int * heightPtr)); /* 150 */ -EXTERN void Tk_PhotoSetSize _ANSI_ARGS_((Tk_PhotoHandle handle, - int width, int height)); +EXTERN void Tk_PhotoSetSize_Panic _ANSI_ARGS_(( + Tk_PhotoHandle handle, int width, int height)); /* 151 */ EXTERN int Tk_PointToChar _ANSI_ARGS_((Tk_TextLayout layout, int x, int y)); @@ -853,11 +853,12 @@ EXTERN void Tk_SetMinimumRequestSize _ANSI_ARGS_(( EXTERN void Tk_SetCaretPos _ANSI_ARGS_((Tk_Window tkwin, int x, int y, int height)); /* 246 */ -EXTERN void Tk_PhotoPutBlock _ANSI_ARGS_((Tk_PhotoHandle handle, +EXTERN void Tk_PhotoPutBlock_Panic _ANSI_ARGS_(( + Tk_PhotoHandle handle, Tk_PhotoImageBlock * blockPtr, int x, int y, int width, int height, int compRule)); /* 247 */ -EXTERN void Tk_PhotoPutZoomedBlock _ANSI_ARGS_(( +EXTERN void Tk_PhotoPutZoomedBlock_Panic _ANSI_ARGS_(( Tk_PhotoHandle handle, Tk_PhotoImageBlock * blockPtr, int x, int y, int width, int height, int zoomX, int zoomY, @@ -916,6 +917,23 @@ EXTERN void Tk_DrawElement _ANSI_ARGS_((Tk_Style style, Tk_StyledElement element, char * recordPtr, Tk_Window tkwin, Drawable d, int x, int y, int width, int height, int state)); +/* 265 */ +EXTERN int Tk_PhotoExpand _ANSI_ARGS_((Tcl_Interp * interp, + Tk_PhotoHandle handle, int width, int height)); +/* 266 */ +EXTERN int Tk_PhotoPutBlock _ANSI_ARGS_((Tcl_Interp * interp, + Tk_PhotoHandle handle, + Tk_PhotoImageBlock * blockPtr, int x, int y, + int width, int height, int compRule)); +/* 267 */ +EXTERN int Tk_PhotoPutZoomedBlock _ANSI_ARGS_(( + Tcl_Interp * interp, Tk_PhotoHandle handle, + Tk_PhotoImageBlock * blockPtr, int x, int y, + int width, int height, int zoomX, int zoomY, + int subsampleX, int subsampleY, int compRule)); +/* 268 */ +EXTERN int Tk_PhotoSetSize _ANSI_ARGS_((Tcl_Interp * interp, + Tk_PhotoHandle handle, int width, int height)); typedef struct TkStubHooks { struct TkPlatStubs *tkPlatStubs; @@ -1076,9 +1094,9 @@ typedef struct TkStubs { void (*tk_PhotoPutZoomedBlock_NoComposite) _ANSI_ARGS_((Tk_PhotoHandle handle, Tk_PhotoImageBlock * blockPtr, int x, int y, int width, int height, int zoomX, int zoomY, int subsampleX, int subsampleY)); /* 145 */ int (*tk_PhotoGetImage) _ANSI_ARGS_((Tk_PhotoHandle handle, Tk_PhotoImageBlock * blockPtr)); /* 146 */ void (*tk_PhotoBlank) _ANSI_ARGS_((Tk_PhotoHandle handle)); /* 147 */ - void (*tk_PhotoExpand) _ANSI_ARGS_((Tk_PhotoHandle handle, int width, int height)); /* 148 */ + void (*tk_PhotoExpand_Panic) _ANSI_ARGS_((Tk_PhotoHandle handle, int width, int height)); /* 148 */ void (*tk_PhotoGetSize) _ANSI_ARGS_((Tk_PhotoHandle handle, int * widthPtr, int * heightPtr)); /* 149 */ - void (*tk_PhotoSetSize) _ANSI_ARGS_((Tk_PhotoHandle handle, int width, int height)); /* 150 */ + void (*tk_PhotoSetSize_Panic) _ANSI_ARGS_((Tk_PhotoHandle handle, int width, int height)); /* 150 */ int (*tk_PointToChar) _ANSI_ARGS_((Tk_TextLayout layout, int x, int y)); /* 151 */ int (*tk_PostscriptFontName) _ANSI_ARGS_((Tk_Font tkfont, Tcl_DString * dsPtr)); /* 152 */ void (*tk_PreserveColormap) _ANSI_ARGS_((Display * display, Colormap colormap)); /* 153 */ @@ -1174,8 +1192,8 @@ typedef struct TkStubs { void (*tk_SetInternalBorderEx) _ANSI_ARGS_((Tk_Window tkwin, int left, int right, int top, int bottom)); /* 243 */ void (*tk_SetMinimumRequestSize) _ANSI_ARGS_((Tk_Window tkwin, int minWidth, int minHeight)); /* 244 */ void (*tk_SetCaretPos) _ANSI_ARGS_((Tk_Window tkwin, int x, int y, int height)); /* 245 */ - void (*tk_PhotoPutBlock) _ANSI_ARGS_((Tk_PhotoHandle handle, Tk_PhotoImageBlock * blockPtr, int x, int y, int width, int height, int compRule)); /* 246 */ - void (*tk_PhotoPutZoomedBlock) _ANSI_ARGS_((Tk_PhotoHandle handle, Tk_PhotoImageBlock * blockPtr, int x, int y, int width, int height, int zoomX, int zoomY, int subsampleX, int subsampleY, int compRule)); /* 247 */ + void (*tk_PhotoPutBlock_Panic) _ANSI_ARGS_((Tk_PhotoHandle handle, Tk_PhotoImageBlock * blockPtr, int x, int y, int width, int height, int compRule)); /* 246 */ + void (*tk_PhotoPutZoomedBlock_Panic) _ANSI_ARGS_((Tk_PhotoHandle handle, Tk_PhotoImageBlock * blockPtr, int x, int y, int width, int height, int zoomX, int zoomY, int subsampleX, int subsampleY, int compRule)); /* 247 */ int (*tk_CollapseMotionEvents) _ANSI_ARGS_((Display * display, int collapse)); /* 248 */ Tk_StyleEngine (*tk_RegisterStyleEngine) _ANSI_ARGS_((CONST char * name, Tk_StyleEngine parent)); /* 249 */ Tk_StyleEngine (*tk_GetStyleEngine) _ANSI_ARGS_((CONST char * name)); /* 250 */ @@ -1193,6 +1211,10 @@ typedef struct TkStubs { void (*tk_GetElementBox) _ANSI_ARGS_((Tk_Style style, Tk_StyledElement element, char * recordPtr, Tk_Window tkwin, int x, int y, int width, int height, int inner, int * xPtr, int * yPtr, int * widthPtr, int * heightPtr)); /* 262 */ int (*tk_GetElementBorderWidth) _ANSI_ARGS_((Tk_Style style, Tk_StyledElement element, char * recordPtr, Tk_Window tkwin)); /* 263 */ void (*tk_DrawElement) _ANSI_ARGS_((Tk_Style style, Tk_StyledElement element, char * recordPtr, Tk_Window tkwin, Drawable d, int x, int y, int width, int height, int state)); /* 264 */ + int (*tk_PhotoExpand) _ANSI_ARGS_((Tcl_Interp * interp, Tk_PhotoHandle handle, int width, int height)); /* 265 */ + int (*tk_PhotoPutBlock) _ANSI_ARGS_((Tcl_Interp * interp, Tk_PhotoHandle handle, Tk_PhotoImageBlock * blockPtr, int x, int y, int width, int height, int compRule)); /* 266 */ + int (*tk_PhotoPutZoomedBlock) _ANSI_ARGS_((Tcl_Interp * interp, Tk_PhotoHandle handle, Tk_PhotoImageBlock * blockPtr, int x, int y, int width, int height, int zoomX, int zoomY, int subsampleX, int subsampleY, int compRule)); /* 267 */ + int (*tk_PhotoSetSize) _ANSI_ARGS_((Tcl_Interp * interp, Tk_PhotoHandle handle, int width, int height)); /* 268 */ } TkStubs; #ifdef __cplusplus @@ -1801,17 +1823,17 @@ extern TkStubs *tkStubsPtr; #define Tk_PhotoBlank \ (tkStubsPtr->tk_PhotoBlank) /* 147 */ #endif -#ifndef Tk_PhotoExpand -#define Tk_PhotoExpand \ - (tkStubsPtr->tk_PhotoExpand) /* 148 */ +#ifndef Tk_PhotoExpand_Panic +#define Tk_PhotoExpand_Panic \ + (tkStubsPtr->tk_PhotoExpand_Panic) /* 148 */ #endif #ifndef Tk_PhotoGetSize #define Tk_PhotoGetSize \ (tkStubsPtr->tk_PhotoGetSize) /* 149 */ #endif -#ifndef Tk_PhotoSetSize -#define Tk_PhotoSetSize \ - (tkStubsPtr->tk_PhotoSetSize) /* 150 */ +#ifndef Tk_PhotoSetSize_Panic +#define Tk_PhotoSetSize_Panic \ + (tkStubsPtr->tk_PhotoSetSize_Panic) /* 150 */ #endif #ifndef Tk_PointToChar #define Tk_PointToChar \ @@ -2187,13 +2209,13 @@ extern TkStubs *tkStubsPtr; #define Tk_SetCaretPos \ (tkStubsPtr->tk_SetCaretPos) /* 245 */ #endif -#ifndef Tk_PhotoPutBlock -#define Tk_PhotoPutBlock \ - (tkStubsPtr->tk_PhotoPutBlock) /* 246 */ +#ifndef Tk_PhotoPutBlock_Panic +#define Tk_PhotoPutBlock_Panic \ + (tkStubsPtr->tk_PhotoPutBlock_Panic) /* 246 */ #endif -#ifndef Tk_PhotoPutZoomedBlock -#define Tk_PhotoPutZoomedBlock \ - (tkStubsPtr->tk_PhotoPutZoomedBlock) /* 247 */ +#ifndef Tk_PhotoPutZoomedBlock_Panic +#define Tk_PhotoPutZoomedBlock_Panic \ + (tkStubsPtr->tk_PhotoPutZoomedBlock_Panic) /* 247 */ #endif #ifndef Tk_CollapseMotionEvents #define Tk_CollapseMotionEvents \ @@ -2263,6 +2285,22 @@ extern TkStubs *tkStubsPtr; #define Tk_DrawElement \ (tkStubsPtr->tk_DrawElement) /* 264 */ #endif +#ifndef Tk_PhotoExpand +#define Tk_PhotoExpand \ + (tkStubsPtr->tk_PhotoExpand) /* 265 */ +#endif +#ifndef Tk_PhotoPutBlock +#define Tk_PhotoPutBlock \ + (tkStubsPtr->tk_PhotoPutBlock) /* 266 */ +#endif +#ifndef Tk_PhotoPutZoomedBlock +#define Tk_PhotoPutZoomedBlock \ + (tkStubsPtr->tk_PhotoPutZoomedBlock) /* 267 */ +#endif +#ifndef Tk_PhotoSetSize +#define Tk_PhotoSetSize \ + (tkStubsPtr->tk_PhotoSetSize) /* 268 */ +#endif #endif /* defined(USE_TK_STUBS) && !defined(USE_TK_STUB_PROCS) */ diff --git a/generic/tkImgGIF.c b/generic/tkImgGIF.c index 1f4a79b..c6d04d6 100644 --- a/generic/tkImgGIF.c +++ b/generic/tkImgGIF.c @@ -29,7 +29,7 @@ * | provided "as is" without express or implied warranty. | * +-------------------------------------------------------------------+ * - * RCS: @(#) $Id: tkImgGIF.c,v 1.24 2003/02/20 15:28:40 dkf Exp $ + * RCS: @(#) $Id: tkImgGIF.c,v 1.25 2003/03/06 15:05:31 dkf Exp $ */ /* @@ -309,7 +309,10 @@ FileReadGIF(interp, chan, fileName, format, imageHandle, destX, destY, return TCL_OK; } - Tk_PhotoExpand(imageHandle, destX + width, destY + height); + if (Tk_PhotoExpand(interp, imageHandle, + destX + width, destY + height) != TCL_OK) { + return TCL_ERROR; + } block.width = width; block.height = height; @@ -474,8 +477,10 @@ FileReadGIF(interp, chan, fileName, format, imageHandle, destX, destY, break; } - Tk_PhotoPutBlock(imageHandle, &block, destX, destY, width, height, - TK_PHOTO_COMPOSITE_SET); + if (Tk_PhotoPutBlock(interp, imageHandle, &block, destX, destY, + width, height, TK_PHOTO_COMPOSITE_SET) != TCL_OK) { + goto error; + } noerror: /* diff --git a/generic/tkImgPPM.c b/generic/tkImgPPM.c index 9715cf4..2abe1fd 100644 --- a/generic/tkImgPPM.c +++ b/generic/tkImgPPM.c @@ -13,7 +13,7 @@ * Department of Computer Science, * Australian National University. * - * RCS: @(#) $Id: tkImgPPM.c,v 1.10 2002/06/14 13:35:48 dkf Exp $ + * RCS: @(#) $Id: tkImgPPM.c,v 1.11 2003/03/06 15:05:35 dkf Exp $ */ #define USE_OLD_IMAGE @@ -189,7 +189,10 @@ FileReadPPM(interp, chan, fileName, formatString, imageHandle, destX, destY, block.width = width; block.pitch = block.pixelSize * fileWidth; - Tk_PhotoExpand(imageHandle, destX + width, destY + height); + if (Tk_PhotoExpand(interp, imageHandle, + destX + width, destY + height) != TCL_OK) { + return TCL_ERROR; + } if (srcY > 0) { Tcl_Seek(chan, (Tcl_WideInt)(srcY * block.pitch), SEEK_CUR); @@ -228,8 +231,11 @@ FileReadPPM(interp, chan, fileName, formatString, imageHandle, destX, destY, } } block.height = nLines; - Tk_PhotoPutBlock(imageHandle, &block, destX, destY, width, nLines, - TK_PHOTO_COMPOSITE_SET); + if (Tk_PhotoPutBlock(interp, imageHandle, &block, destX, destY, + width, nLines, TK_PHOTO_COMPOSITE_SET) != TCL_OK) { + ckfree((char *) pixelPtr); + return TCL_ERROR; + } destY += nLines; } diff --git a/generic/tkImgPhoto.c b/generic/tkImgPhoto.c index 8379f1d..3849556 100644 --- a/generic/tkImgPhoto.c +++ b/generic/tkImgPhoto.c @@ -16,7 +16,7 @@ * Department of Computer Science, * Australian National University. * - * RCS: @(#) $Id: tkImgPhoto.c,v 1.36 2002/10/18 00:48:22 hobbs Exp $ + * RCS: @(#) $Id: tkImgPhoto.c,v 1.37 2003/03/06 15:05:36 dkf Exp $ */ #include "tkInt.h" @@ -877,11 +877,13 @@ ImgPhotoCmd(clientData, interp, objc, objv) + options.fromY * block.pitch; block.width = options.fromX2 - options.fromX; block.height = options.fromY2 - options.fromY; - Tk_PhotoPutZoomedBlock((Tk_PhotoHandle) masterPtr, &block, + if (Tk_PhotoPutZoomedBlock(interp, (Tk_PhotoHandle) masterPtr, &block, options.toX, options.toY, options.toX2 - options.toX, options.toY2 - options.toY, options.zoomX, options.zoomY, options.subsampleX, options.subsampleY, - options.compositingRule); + options.compositingRule) != TCL_OK) { + return TCL_ERROR; + } break; @@ -1125,9 +1127,13 @@ ImgPhotoCmd(clientData, interp, objc, objv) block.offset[1] = 1; block.offset[2] = 2; block.offset[3] = 0; - Tk_PhotoPutBlock((ClientData)masterPtr, &block, + if (Tk_PhotoPutBlock(interp, (ClientData)masterPtr, &block, options.toX, options.toY, options.toX2 - options.toX, - options.toY2 - options.toY, TK_PHOTO_COMPOSITE_SET); + options.toY2 - options.toY, + TK_PHOTO_COMPOSITE_SET) != TCL_OK) { + ckfree((char *) block.pixelPtr); + return TCL_ERROR; + } ckfree((char *) block.pixelPtr); break; @@ -3962,16 +3968,21 @@ Tk_FindPhoto(interp, imageName) * This procedure is called to put image data into a photo image. * * Results: - * None. + * A standard Tcl result code. * * Side effects: * The image data is stored. The image may be expanded. * The Tk image code is informed that the image has changed. + * If the result code is TCL_ERROR, an error message will be placed + * in the interpreter (if non-NULL). * - *---------------------------------------------------------------------- */ + *---------------------------------------------------------------------- + */ -void -Tk_PhotoPutBlock(handle, blockPtr, x, y, width, height, compRule) +int +Tk_PhotoPutBlock(interp, handle, blockPtr, x, y, width, height, compRule) + Tcl_Interp *interp; /* Interpreter for passing back error + * messages, or NULL. */ Tk_PhotoHandle handle; /* Opaque handle for the photo image * to be updated. */ register Tk_PhotoImageBlock *blockPtr; @@ -4004,7 +4015,7 @@ Tk_PhotoPutBlock(handle, blockPtr, x, y, width, height, compRule) height = masterPtr->userHeight - y; } if ((width <= 0) || (height <= 0)) { - return; + return TCL_OK; } xEnd = x + width; @@ -4012,7 +4023,12 @@ Tk_PhotoPutBlock(handle, blockPtr, x, y, width, height, compRule) if ((xEnd > masterPtr->width) || (yEnd > masterPtr->height)) { if (ImgPhotoSetSize(masterPtr, MAX(xEnd, masterPtr->width), MAX(yEnd, masterPtr->height)) == TCL_ERROR) { - panic(TK_PHOTO_ALLOC_FAILURE_MESSAGE); + if (interp != NULL) { + Tcl_ResetResult(interp); + Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), + TK_PHOTO_ALLOC_FAILURE_MESSAGE, (char *) NULL); + } + return TCL_ERROR; } } @@ -4233,8 +4249,9 @@ Tk_PhotoPutBlock(handle, blockPtr, x, y, width, height, compRule) * Tell the core image code that this image has changed. */ - Tk_ImageChanged(masterPtr->tkMaster, x, y, width, height, masterPtr->width, - masterPtr->height); + Tk_ImageChanged(masterPtr->tkMaster, x, y, width, height, + masterPtr->width, masterPtr->height); + return TCL_OK; } /* @@ -4255,9 +4272,11 @@ Tk_PhotoPutBlock(handle, blockPtr, x, y, width, height, compRule) *---------------------------------------------------------------------- */ -void -Tk_PhotoPutZoomedBlock(handle, blockPtr, x, y, width, height, zoomX, zoomY, - subsampleX, subsampleY, compRule) +int +Tk_PhotoPutZoomedBlock(interp, handle, blockPtr, x, y, width, height, + zoomX, zoomY, subsampleX, subsampleY, compRule) + Tcl_Interp *interp; /* Interpreter for passing back error + * messages, or NULL. */ Tk_PhotoHandle handle; /* Opaque handle for the photo image * to be updated. */ register Tk_PhotoImageBlock *blockPtr; @@ -4286,14 +4305,14 @@ Tk_PhotoPutZoomedBlock(handle, blockPtr, x, y, width, height, zoomX, zoomY, XRectangle rect; if (zoomX==1 && zoomY==1 && subsampleX==1 && subsampleY==1) { - Tk_PhotoPutBlock(handle, blockPtr, x, y, width, height, compRule); - return; + return Tk_PhotoPutBlock(interp, handle, blockPtr, x, y, width, height, + compRule); } masterPtr = (PhotoMaster *) handle; if (zoomX <= 0 || zoomY <= 0) { - return; + return TCL_OK; } if ((masterPtr->userWidth != 0) && ((x + width) > masterPtr->userWidth)) { width = masterPtr->userWidth - x; @@ -4303,7 +4322,7 @@ Tk_PhotoPutZoomedBlock(handle, blockPtr, x, y, width, height, zoomX, zoomY, height = masterPtr->userHeight - y; } if (width <= 0 || height <= 0) { - return; + return TCL_OK; } xEnd = x + width; @@ -4312,7 +4331,12 @@ Tk_PhotoPutZoomedBlock(handle, blockPtr, x, y, width, height, zoomX, zoomY, int sameSrc = (blockPtr->pixelPtr == masterPtr->pix32); if (ImgPhotoSetSize(masterPtr, MAX(xEnd, masterPtr->width), MAX(yEnd, masterPtr->height)) == TCL_ERROR) { - panic(TK_PHOTO_ALLOC_FAILURE_MESSAGE); + if (interp != NULL) { + Tcl_ResetResult(interp); + Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), + TK_PHOTO_ALLOC_FAILURE_MESSAGE, (char *) NULL); + } + return TCL_ERROR; } if (sameSrc) { blockPtr->pixelPtr = masterPtr->pix32; @@ -4518,6 +4542,7 @@ Tk_PhotoPutZoomedBlock(handle, blockPtr, x, y, width, height, zoomX, zoomY, Tk_ImageChanged(masterPtr->tkMaster, x, y, width, height, masterPtr->width, masterPtr->height); + return TCL_OK; } /* @@ -5024,8 +5049,10 @@ Tk_PhotoBlank(handle) *---------------------------------------------------------------------- */ -void -Tk_PhotoExpand(handle, width, height) +int +Tk_PhotoExpand(interp, handle, width, height) + Tcl_Interp *interp; /* Interpreter for passing back error + * messages, or NULL. */ Tk_PhotoHandle handle; /* Handle for the image to be expanded. */ int width, height; /* Desired minimum dimensions of the image. */ { @@ -5042,11 +5069,17 @@ Tk_PhotoExpand(handle, width, height) if ((width != masterPtr->width) || (height != masterPtr->height)) { if (ImgPhotoSetSize(masterPtr, MAX(width, masterPtr->width), MAX(height, masterPtr->height)) == TCL_ERROR) { - panic(TK_PHOTO_ALLOC_FAILURE_MESSAGE); + if (interp != NULL) { + Tcl_ResetResult(interp); + Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), + TK_PHOTO_ALLOC_FAILURE_MESSAGE, (char *) NULL); + } + return TCL_ERROR; } Tk_ImageChanged(masterPtr->tkMaster, 0, 0, 0, 0, masterPtr->width, masterPtr->height); } + return TCL_OK; } /* @@ -5100,8 +5133,10 @@ Tk_PhotoGetSize(handle, widthPtr, heightPtr) *---------------------------------------------------------------------- */ -void -Tk_PhotoSetSize(handle, width, height) +int +Tk_PhotoSetSize(interp, handle, width, height) + Tcl_Interp *interp; /* Interpreter for passing back error + * messages, or NULL. */ Tk_PhotoHandle handle; /* Handle for the image whose size is to * be set. */ int width, height; /* New dimensions for the image. */ @@ -5114,10 +5149,16 @@ Tk_PhotoSetSize(handle, width, height) masterPtr->userHeight = height; if (ImgPhotoSetSize(masterPtr, ((width > 0) ? width: masterPtr->width), ((height > 0) ? height: masterPtr->height)) == TCL_ERROR) { - panic(TK_PHOTO_ALLOC_FAILURE_MESSAGE); + if (interp != NULL) { + Tcl_ResetResult(interp); + Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), + TK_PHOTO_ALLOC_FAILURE_MESSAGE, (char *) NULL); + } + return TCL_ERROR; } Tk_ImageChanged(masterPtr->tkMaster, 0, 0, 0, 0, masterPtr->width, masterPtr->height); + return TCL_OK; } /* @@ -5613,7 +5654,9 @@ ImgPhotoPostscript(clientData, interp, tkwin, psInfo, * * These backward-compatability functions just exist to fill slots in * stubs table. For the behaviour of *_NoComposite, refer to the - * corresponding function without the extra suffix. + * corresponding function without the extra suffix, except that the + * compositing rule is always "overlay" and the function always panics + * on memory-allocation failure. * *---------------------------------------------------------------------- */ @@ -5623,8 +5666,10 @@ Tk_PhotoPutBlock_NoComposite(handle, blockPtr, x, y, width, height) Tk_PhotoImageBlock *blockPtr; int x, y, width, height; { - Tk_PhotoPutBlock(handle, blockPtr, x, y, width, height, - TK_PHOTO_COMPOSITE_OVERLAY); + if (Tk_PhotoPutBlock(NULL, handle, blockPtr, x, y, width, height, + TK_PHOTO_COMPOSITE_OVERLAY) != TCL_OK) { + panic(TK_PHOTO_ALLOC_FAILURE_MESSAGE); + } } void @@ -5634,6 +5679,69 @@ Tk_PhotoPutZoomedBlock_NoComposite(handle, blockPtr, x, y, width, height, Tk_PhotoImageBlock *blockPtr; int x, y, width, height, zoomX, zoomY, subsampleX, subsampleY; { - Tk_PhotoPutZoomedBlock(handle, blockPtr, x, y, width, height, - zoomX, zoomY, subsampleX, subsampleY, TK_PHOTO_COMPOSITE_OVERLAY); + if (Tk_PhotoPutZoomedBlock(NULL, handle, blockPtr, x, y, width, height, + zoomX, zoomY, subsampleX, subsampleY, + TK_PHOTO_COMPOSITE_OVERLAY) != TCL_OK) { + panic(TK_PHOTO_ALLOC_FAILURE_MESSAGE); + } +} + +/* + *---------------------------------------------------------------------- + * + * Tk_PhotoExpand_Panic, Tk_PhotoPutBlock_Panic, + * Tk_PhotoPutZoomedBlock_Panic, Tk_PhotoSetSize_Panic + * + * Backward compatability functions for preserving the old behaviour + * (i.e. panic on memory allocation failure) so that extensions do not + * need to be significantly updated to take account of TIP #116. These + * call the new interface (i.e. the interface without the extra suffix), + * but panic if an error condition is returned. + * + *---------------------------------------------------------------------- + */ + +void +Tk_PhotoExpand_Panic(handle, width, height) + Tk_PhotoHandle handle; + int width, height; +{ + if (Tk_PhotoExpand(NULL, handle, width, height) != TCL_OK) { + panic(TK_PHOTO_ALLOC_FAILURE_MESSAGE); + } +} + +void +Tk_PhotoPutBlock_Panic(handle, blockPtr, x, y, width, height, compRule) + Tk_PhotoHandle handle; + Tk_PhotoImageBlock *blockPtr; + int x, y, width, height, compRule; +{ + if (Tk_PhotoPutBlock(NULL, handle, blockPtr, x, y, width, height, + compRule) != TCL_OK) { + panic(TK_PHOTO_ALLOC_FAILURE_MESSAGE); + } +} + +void +Tk_PhotoPutZoomedBlock_Panic(handle, blockPtr, x, y, width, height, + zoomX, zoomY, subsampleX, subsampleY, compRule) + Tk_PhotoHandle handle; + register Tk_PhotoImageBlock *blockPtr; + int x, y, width, height, zoomX, zoomY, subsampleX, subsampleY, compRule; +{ + if (Tk_PhotoPutZoomedBlock(NULL, handle, blockPtr, x, y, width, height, + zoomX, zoomY, subsampleX, subsampleY, compRule) != TCL_OK) { + panic(TK_PHOTO_ALLOC_FAILURE_MESSAGE); + } +} + +void +Tk_PhotoSetSize_Panic(handle, width, height) + Tk_PhotoHandle handle; + int width, height; +{ + if (Tk_PhotoSetSize(NULL, handle, width, height) != TCL_OK) { + panic(TK_PHOTO_ALLOC_FAILURE_MESSAGE); + } } diff --git a/generic/tkStubInit.c b/generic/tkStubInit.c index 259baf3..30877a2 100644 --- a/generic/tkStubInit.c +++ b/generic/tkStubInit.c @@ -8,7 +8,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkStubInit.c,v 1.41 2003/01/22 14:33:00 dkf Exp $ + * RCS: @(#) $Id: tkStubInit.c,v 1.42 2003/03/06 15:05:40 dkf Exp $ */ #include "tkInt.h" @@ -1010,9 +1010,9 @@ TkStubs tkStubs = { Tk_PhotoPutZoomedBlock_NoComposite, /* 145 */ Tk_PhotoGetImage, /* 146 */ Tk_PhotoBlank, /* 147 */ - Tk_PhotoExpand, /* 148 */ + Tk_PhotoExpand_Panic, /* 148 */ Tk_PhotoGetSize, /* 149 */ - Tk_PhotoSetSize, /* 150 */ + Tk_PhotoSetSize_Panic, /* 150 */ Tk_PointToChar, /* 151 */ Tk_PostscriptFontName, /* 152 */ Tk_PreserveColormap, /* 153 */ @@ -1108,8 +1108,8 @@ TkStubs tkStubs = { Tk_SetInternalBorderEx, /* 243 */ Tk_SetMinimumRequestSize, /* 244 */ Tk_SetCaretPos, /* 245 */ - Tk_PhotoPutBlock, /* 246 */ - Tk_PhotoPutZoomedBlock, /* 247 */ + Tk_PhotoPutBlock_Panic, /* 246 */ + Tk_PhotoPutZoomedBlock_Panic, /* 247 */ Tk_CollapseMotionEvents, /* 248 */ Tk_RegisterStyleEngine, /* 249 */ Tk_GetStyleEngine, /* 250 */ @@ -1127,6 +1127,10 @@ TkStubs tkStubs = { Tk_GetElementBox, /* 262 */ Tk_GetElementBorderWidth, /* 263 */ Tk_DrawElement, /* 264 */ + Tk_PhotoExpand, /* 265 */ + Tk_PhotoPutBlock, /* 266 */ + Tk_PhotoPutZoomedBlock, /* 267 */ + Tk_PhotoSetSize, /* 268 */ }; /* !END!: Do not edit above this line. */ |