⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tkbitmap.c

📁 MPICH是MPI的重要研究,提供了一系列的接口函数,为并行计算的实现提供了编程环境.
💻 C
📖 第 1 页 / 共 2 页
字号:
/*  * tkBitmap.c -- * *	This file maintains a database of read-only bitmaps for the Tk *	toolkit.  This allows bitmaps to be shared between widgets and *	also avoids interactions with the X server. * * Copyright (c) 1990-1993 The Regents of the University of California. * All rights reserved. * * Permission is hereby granted, without written agreement and without * license or royalty fees, to use, copy, modify, and distribute this * software and its documentation for any purpose, provided that the * above copyright notice and the following two paragraphs appear in * all copies of this software. *  * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. */#define DEBUG 0#include "tkConfig.h"#include "tk.h"/* * The includes below are for pre-defined bitmaps. */#include "bitmaps/error"#include "bitmaps/gray25"#include "bitmaps/gray50"#include "bitmaps/hourglass"#include "bitmaps/info"#include "bitmaps/questhead"#include "bitmaps/question"#include "bitmaps/warning"/* * One of the following data structures exists for each bitmap that is * currently in use.  Each structure is indexed with both "idTable" and * "nameTable". */typedef struct {    Pixmap bitmap;		/* X identifier for bitmap.  None means this				 * bitmap was created by Tk_DefineBitmap				 * and it isn't currently in use. */    unsigned int width, height;	/* Dimensions of bitmap. */    Display *display;		/* Display for which bitmap is valid. */    int refCount;		/* Number of active uses of bitmap. */    Tcl_HashEntry *hashPtr;	/* Entry in nameTable for this structure				 * (needed when deleting). */} TkBitmap;/* * Hash table to map from a textual description of a bitmap to the * TkBitmap record for the bitmap, and key structure used in that * hash table: */static Tcl_HashTable nameTable;typedef struct {    Tk_Uid name;		/* Textual name for desired bitmap. */    Display *display;		/* Display for which bitmap will be used. */} NameKey;/* * Hash table that maps from <display + bitmap id> to the TkBitmap structure * for the bitmap.  This table is used by Tk_FreeBitmap. */static Tcl_HashTable idTable;typedef struct {    Display *display;		/* Display for which bitmap was allocated. */    Pixmap pixmap;		/* X identifier for pixmap. */} IdKey;/* * For each call to Tk_DefineBitmap one of the following structures is * created to hold information about the bitmap. */typedef struct {    char *source;		/* Bits for bitmap. */    unsigned int width, height;	/* Dimensions of bitmap. */} PredefBitmap;/* * Hash table create by Tk_DefineBitmap to map from a name to a * collection of in-core data about a bitmap.  The table is * indexed by the address of the data for the bitmap, and the entries * contain pointers to PredefBitmap structures. */static Tcl_HashTable predefTable;/* * Hash table used by Tk_GetBitmapFromData to map from a collection * of in-core data about a bitmap to a Tk_Uid giving an automatically- * generated name for the bitmap: */static Tcl_HashTable dataTable;typedef struct {    char *source;		/* Bitmap bits. */    unsigned int width, height;	/* Dimensions of bitmap. */} DataKey;static int initialized = 0;	/* 0 means static structures haven't been				 * initialized yet. *//* * Forward declarations for procedures defined in this file: */static void		BitmapInit _ANSI_ARGS_((void));/* *---------------------------------------------------------------------- * * Tk_GetBitmap -- * *	Given a string describing a bitmap, locate (or create if necessary) *	a bitmap that fits the description. * * Results: *	The return value is the X identifer for the desired bitmap *	(i.e. a Pixmap with a single plane), unless string couldn't be *	parsed correctly.  In this case, None is returned and an error *	message is left in interp->result.  The caller should never *	modify the bitmap that is returned, and should eventually call *	Tk_FreeBitmap when the bitmap is no longer needed. * * Side effects: *	The bitmap is added to an internal database with a reference count. *	For each call to this procedure, there should eventually be a call *	to Tk_FreeBitmap, so that the database can be cleaned up when bitmaps *	aren't needed anymore. * *---------------------------------------------------------------------- */PixmapTk_GetBitmap(interp, tkwin, string)    Tcl_Interp *interp;		/* Interpreter to use for error reporting. */    Tk_Window tkwin;		/* Window in which bitmap will be used. */    Tk_Uid string;		/* Description of bitmap.  See manual entry				 * for details on legal syntax. */{    NameKey nameKey;    IdKey idKey;    Tcl_HashEntry *nameHashPtr, *idHashPtr, *predefHashPtr;    register TkBitmap *bitmapPtr;    PredefBitmap *predefPtr;    int new;    Pixmap bitmap;    unsigned int width, height;    int dummy2;    if (!initialized) {	BitmapInit();    }    nameKey.name = string;    nameKey.display = Tk_Display(tkwin);    nameHashPtr = Tcl_CreateHashEntry(&nameTable, (char *) &nameKey, &new);    if (!new) {	bitmapPtr = (TkBitmap *) Tcl_GetHashValue(nameHashPtr);	bitmapPtr->refCount++;	return bitmapPtr->bitmap;    }    /*     * No suitable bitmap exists.  Create a new bitmap from the     * information contained in the string.  If the string starts     * with "@" then the rest of the string is a file name containing     * the bitmap.  Otherwise the string must refer to a bitmap     * defined by a call to Tk_DefineBitmap.     */    if (*string == '@') {	Tcl_DString buffer;	int result;	string = Tcl_TildeSubst(interp, string + 1, &buffer);	if (string == NULL) {	    goto error;	}	result = XReadBitmapFile(nameKey.display,		RootWindowOfScreen(Tk_Screen(tkwin)), string, &width,		&height, &bitmap, &dummy2, &dummy2);	Tcl_DStringFree(&buffer);	if (result != BitmapSuccess) {	    Tcl_AppendResult(interp, "error reading bitmap file \"", string,		    "\"", (char *) NULL);	    goto error;	}    } else {	predefHashPtr = Tcl_FindHashEntry(&predefTable, string);	if (predefHashPtr == NULL) {	    Tcl_AppendResult(interp, "bitmap \"", string,		    "\" not defined", (char *) NULL);	    goto error;	}	predefPtr = (PredefBitmap *) Tcl_GetHashValue(predefHashPtr);	width = predefPtr->width;	height = predefPtr->height;	bitmap = XCreateBitmapFromData(nameKey.display,		DefaultRootWindow(nameKey.display), predefPtr->source,		width, height);    }    /*     * Add information about this bitmap to our database.     */    bitmapPtr = (TkBitmap *) ckalloc(sizeof(TkBitmap));    bitmapPtr->bitmap = bitmap;    bitmapPtr->width = width;    bitmapPtr->height = height;    bitmapPtr->display = nameKey.display;    bitmapPtr->refCount = 1;    bitmapPtr->hashPtr = nameHashPtr;    idKey.display = nameKey.display;    idKey.pixmap = bitmap;    idHashPtr = Tcl_CreateHashEntry(&idTable, (char *) &idKey,	    &new);    if (!new) {	panic("bitmap already registered in Tk_GetBitmap");    }    Tcl_SetHashValue(nameHashPtr, bitmapPtr);    Tcl_SetHashValue(idHashPtr, bitmapPtr);    return bitmapPtr->bitmap;    error:    Tcl_DeleteHashEntry(nameHashPtr);    return None;}/* *---------------------------------------------------------------------- * * Tk_DefineBitmap -- * *	This procedure associates a textual name with a binary bitmap *	description, so that the name may be used to refer to the *	bitmap in future calls to Tk_GetBitmap. * * Results: *	A standard Tcl result.  If an error occurs then TCL_ERROR is *	returned and a message is left in interp->result. * * Side effects: *	"Name" is entered into the bitmap table and may be used from *	here on to refer to the given bitmap. * *---------------------------------------------------------------------- */intTk_DefineBitmap(interp, name, source, width, height)    Tcl_Interp *interp;		/* Interpreter to use for error reporting. */    Tk_Uid name;		/* Name to use for bitmap.  Must not already				 * be defined as a bitmap. */    char *source;		/* Address of bits for bitmap. */    unsigned int width;		/* Width of bitmap. */    unsigned int height;	/* Height of bitmap. */{    int new;    Tcl_HashEntry *predefHashPtr;    PredefBitmap *predefPtr;    if (!initialized) {	BitmapInit();    }    predefHashPtr = Tcl_CreateHashEntry(&predefTable, name, &new);    if (!new) {        Tcl_AppendResult(interp, "bitmap \"", name,		"\" is already defined", (char *) NULL);	return TCL_ERROR;    }    predefPtr = (PredefBitmap *) ckalloc(sizeof(PredefBitmap));    predefPtr->source = source;    predefPtr->width = width;    predefPtr->height = height;    Tcl_SetHashValue(predefHashPtr, predefPtr);    return TCL_OK;}/* *-------------------------------------------------------------- * * Tk_NameOfBitmap -- * *	Given a bitmap, return a textual string identifying the *	bitmap. * * Results: *	The return value is the string name associated with bitmap. * * Side effects: *	None. * *-------------------------------------------------------------- */Tk_UidTk_NameOfBitmap(display, bitmap)    Display *display;			/* Display for which bitmap was					 * allocated. */    Pixmap bitmap;			/* Bitmap whose name is wanted. */{    IdKey idKey;    Tcl_HashEntry *idHashPtr;    TkBitmap *bitmapPtr;    if (!initialized) {	unknown:	panic("Tk_NameOfBitmap received unknown bitmap argument");    }    idKey.display = display;    idKey.pixmap = bitmap;    idHashPtr = Tcl_FindHashEntry(&idTable, (char *) &idKey);    if (idHashPtr == NULL) {	goto unknown;    }    bitmapPtr = (TkBitmap *) Tcl_GetHashValue(idHashPtr);    return ((NameKey *) bitmapPtr->hashPtr->key.words)->name;}/* *-------------------------------------------------------------- * * Tk_SizeOfBitmap -- * *	Given a bitmap managed by this module, returns the width *	and height of the bitmap. *

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -