static void BaseCleanup(void *recordPtr) { Base *basePtr = recordPtr; if (basePtr->base.textVariableTrace) Ttk_UntraceVariable(basePtr->base.textVariableTrace); if (basePtr->base.imageSpec) TtkFreeImageSpec(basePtr->base.imageSpec); }
static int BaseConfigure(Tcl_Interp *interp, void *recordPtr, int mask) { Base *basePtr = recordPtr; Tcl_Obj *textVarName = basePtr->base.textVariableObj; Ttk_TraceHandle *vt = 0; Ttk_ImageSpec *imageSpec = NULL; if (textVarName != NULL && *Tcl_GetString(textVarName) != '\0') { vt = Ttk_TraceVariable(interp,textVarName,TextVariableChanged,basePtr); if (!vt) return TCL_ERROR; } if (basePtr->base.imageObj) { imageSpec = TtkGetImageSpec( interp, basePtr->core.tkwin, basePtr->base.imageObj); if (!imageSpec) { goto error; } } if (TtkCoreConfigure(interp, recordPtr, mask) != TCL_OK) { error: if (imageSpec) TtkFreeImageSpec(imageSpec); if (vt) Ttk_UntraceVariable(vt); return TCL_ERROR; } if (basePtr->base.textVariableTrace) { Ttk_UntraceVariable(basePtr->base.textVariableTrace); } basePtr->base.textVariableTrace = vt; if (basePtr->base.imageSpec) { TtkFreeImageSpec(basePtr->base.imageSpec); } basePtr->base.imageSpec = imageSpec; if (mask & STATE_CHANGED) { TtkCheckStateOption(&basePtr->core, basePtr->base.stateObj); } return TCL_OK; }
static void FreeImageData(void *clientData) { ImageData *imageData = clientData; if (imageData->imageSpec) { TtkFreeImageSpec(imageData->imageSpec); } #if TILE_07_COMPAT if (imageData->imageMap) { Tcl_DecrRefCount(imageData->imageMap); } #endif ckfree(clientData); }
static int ImageSetup( ImageElement *image, Tk_Window tkwin, Ttk_State state) { if (!image->imageObj) { return 0; } image->imageSpec = TtkGetImageSpec(NULL, tkwin, image->imageObj); if (!image->imageSpec) { return 0; } image->tkimg = TtkSelectImage(image->imageSpec, state); if (!image->tkimg) { TtkFreeImageSpec(image->imageSpec); return 0; } Tk_SizeOfImage(image->tkimg, &image->width, &image->height); return 1; }
static void ImageCleanup(ImageElement *image) { TtkFreeImageSpec(image->imageSpec); }
/* TtkGetImageSpec -- * Constructs a Ttk_ImageSpec * from a Tcl_Obj *. * Result must be released using TtkFreeImageSpec. * * TODO: Need a variant of this that takes a user-specified ImageChanged proc */ Ttk_ImageSpec * TtkGetImageSpec(Tcl_Interp *interp, Tk_Window tkwin, Tcl_Obj *objPtr) { Ttk_ImageSpec *imageSpec = 0; int i = 0, n = 0, objc; Tcl_Obj **objv; imageSpec = (Ttk_ImageSpec *)ckalloc(sizeof(*imageSpec)); imageSpec->baseImage = 0; imageSpec->mapCount = 0; imageSpec->states = 0; imageSpec->images = 0; if (Tcl_ListObjGetElements(interp, objPtr, &objc, &objv) != TCL_OK) { goto error; } if ((objc % 2) != 1) { if (interp) { Tcl_SetResult(interp, "image specification must contain an odd number of elements", TCL_STATIC); } goto error; } n = (objc - 1) / 2; imageSpec->states = (Ttk_StateSpec*)ckalloc(n * sizeof(Ttk_StateSpec)); imageSpec->images = (Tk_Image*)ckalloc(n * sizeof(Tk_Image *)); /* Get base image: */ imageSpec->baseImage = Tk_GetImage( interp, tkwin, Tcl_GetString(objv[0]), NullImageChanged, NULL); if (!imageSpec->baseImage) { goto error; } /* Extract state and image specifications: */ for (i = 0; i < n; ++i) { Tcl_Obj *stateSpec = objv[2*i + 1]; const char *imageName = Tcl_GetString(objv[2*i + 2]); Ttk_StateSpec state; if (Ttk_GetStateSpecFromObj(interp, stateSpec, &state) != TCL_OK) { goto error; } imageSpec->states[i] = state; imageSpec->images[i] = Tk_GetImage( interp, tkwin, imageName, NullImageChanged, NULL); if (imageSpec->images[i] == NULL) { goto error; } imageSpec->mapCount = i+1; } return imageSpec; error: TtkFreeImageSpec(imageSpec); return NULL; }