4
4
* This file implements bitmap items for canvas widgets.
6
6
* Copyright (c) 1992-1994 The Regents of the University of California.
7
* Copyright (c) 1994-1995 Sun Microsystems, Inc.
7
* Copyright (c) 1994-1997 Sun Microsystems, Inc.
9
9
* See the file "license.terms" for information on usage and redistribution
10
10
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
12
* RCS: @(#) $Id: tkCanvBmap.c,v 1.2 1998/09/14 18:23:04 stanton Exp $
12
* RCS: @(#) $Id: tkCanvBmap.c,v 1.7.2.1 2003/04/18 21:56:47 hobbs Exp $
95
95
static int BitmapCoords _ANSI_ARGS_((Tcl_Interp *interp,
96
Tk_Canvas canvas, Tk_Item *itemPtr, int argc,
96
Tk_Canvas canvas, Tk_Item *itemPtr, int objc,
97
Tcl_Obj *CONST objv[]));
98
98
static int BitmapToArea _ANSI_ARGS_((Tk_Canvas canvas,
99
99
Tk_Item *itemPtr, double *rectPtr));
100
100
static double BitmapToPoint _ANSI_ARGS_((Tk_Canvas canvas,
104
104
static void ComputeBitmapBbox _ANSI_ARGS_((Tk_Canvas canvas,
105
105
BitmapItem *bmapPtr));
106
106
static int ConfigureBitmap _ANSI_ARGS_((Tcl_Interp *interp,
107
Tk_Canvas canvas, Tk_Item *itemPtr, int argc,
108
char **argv, int flags));
109
static int CreateTkBitmap _ANSI_ARGS_((Tcl_Interp *interp,
107
Tk_Canvas canvas, Tk_Item *itemPtr, int objc,
108
Tcl_Obj *CONST objv[], int flags));
109
static int TkcCreateBitmap _ANSI_ARGS_((Tcl_Interp *interp,
110
110
Tk_Canvas canvas, struct Tk_Item *itemPtr,
111
int argc, char **argv));
111
int objc, Tcl_Obj *CONST objv[]));
112
112
static void DeleteBitmap _ANSI_ARGS_((Tk_Canvas canvas,
113
113
Tk_Item *itemPtr, Display *display));
114
114
static void DisplayBitmap _ANSI_ARGS_((Tk_Canvas canvas,
128
128
Tk_ItemType tkBitmapType = {
129
129
"bitmap", /* name */
130
130
sizeof(BitmapItem), /* itemSize */
131
CreateTkBitmap, /* createProc */
131
TkcCreateBitmap, /* createProc */
132
132
configSpecs, /* configSpecs */
133
133
ConfigureBitmap, /* configureProc */
134
134
BitmapCoords, /* coordProc */
135
135
DeleteBitmap, /* deleteProc */
136
136
DisplayBitmap, /* displayProc */
137
TK_ITEM_VISITOR_SUPPORT|TK_CONFIG_OBJS,/* flags */
137
TK_CONFIG_OBJS, /* flags */
138
138
BitmapToPoint, /* pointProc */
139
139
BitmapToArea, /* areaProc */
140
140
BitmapToPostscript, /* postscriptProc */
146
146
(Tk_ItemInsertProc *) NULL, /* insertProc */
147
147
(Tk_ItemDCharsProc *) NULL, /* dTextProc */
148
148
(Tk_ItemType *) NULL, /* nextPtr */
149
(Tk_ItemBboxProc *) ComputeBitmapBbox,/* bboxProc */
150
Tk_Offset(Tk_VisitorType, visitBitmap), /* acceptProc */
151
(Tk_ItemGetCoordProc *) NULL, /* getCoordProc */
152
(Tk_ItemSetCoordProc *) NULL /* setCoordProc */
156
152
*--------------------------------------------------------------
160
156
* This procedure is invoked to create a new bitmap
161
157
* item in a canvas.
176
CreateTkBitmap(interp, canvas, itemPtr, argc, argv)
172
TkcCreateBitmap(interp, canvas, itemPtr, objc, objv)
177
173
Tcl_Interp *interp; /* Interpreter for error reporting. */
178
174
Tk_Canvas canvas; /* Canvas to hold new item. */
179
175
Tk_Item *itemPtr; /* Record to hold new item; header
180
176
* has been initialized by caller. */
181
int argc; /* Number of arguments in argv. */
182
char **argv; /* Arguments describing rectangle. */
177
int objc; /* Number of arguments in objv. */
178
Tcl_Obj *CONST objv[]; /* Arguments describing rectangle. */
184
180
BitmapItem *bmapPtr = (BitmapItem *) itemPtr;
190
char *arg = Tcl_GetStringFromObj(objv[1], NULL);
191
if (((argc>1) && (arg[0] == '-')
192
&& (arg[1] >= 'a') && (arg[1] <= 'z'))) {
200
Tcl_AppendResult(interp, "wrong # args: should be \"",
201
Tk_PathName(Tk_CanvasTkwin(canvas)), " create ",
202
itemPtr->typePtr->name, " x y ?options?\"",
184
panic("canvas did not pass any coords\n");
224
204
* Process the arguments to fill in the item record.
205
* Only 1 (list) or 2 (x y) coords are allowed.
227
if ((BitmapCoords(interp, canvas, itemPtr, i, argv) != TCL_OK)) {
211
char *arg = Tcl_GetString(objv[1]);
213
if ((arg[0] == '-') && (arg[1] >= 'a') && (arg[1] <= 'z')) {
217
if (BitmapCoords(interp, canvas, itemPtr, i, objv) != TCL_OK) {
230
if (ConfigureBitmap(interp, canvas, itemPtr, argc-i, argv+i, 0) == TCL_OK) {
220
if (ConfigureBitmap(interp, canvas, itemPtr, objc-i, objv+i, 0)
258
BitmapCoords(interp, canvas, itemPtr, argc, argv)
249
BitmapCoords(interp, canvas, itemPtr, objc, objv)
259
250
Tcl_Interp *interp; /* Used for error reporting. */
260
251
Tk_Canvas canvas; /* Canvas containing item. */
261
252
Tk_Item *itemPtr; /* Item whose coordinates are to be
262
253
* read or modified. */
263
int argc; /* Number of coordinates supplied in
265
char **argv; /* Array of coordinates: x1, y1,
254
int objc; /* Number of coordinates supplied in
256
Tcl_Obj *CONST objv[]; /* Array of coordinates: x1, y1,
268
259
BitmapItem *bmapPtr = (BitmapItem *) itemPtr;
269
char x[TCL_DOUBLE_SPACE];
272
262
Tcl_Obj *obj = Tcl_NewObj();
273
263
Tcl_Obj *subobj = Tcl_NewDoubleObj(bmapPtr->x);
274
264
Tcl_ListObjAppendElement(interp, obj, subobj);
275
265
subobj = Tcl_NewDoubleObj(bmapPtr->y);
276
266
Tcl_ListObjAppendElement(interp, obj, subobj);
277
267
Tcl_SetObjResult(interp, obj);
278
} else if (argc <3) {
280
if (Tcl_ListObjGetElements(interp, objv[0], &argc, &argv) != TCL_OK) {
268
} else if (objc < 3) {
270
if (Tcl_ListObjGetElements(interp, objv[0], &objc,
271
(Tcl_Obj ***) &objv) != TCL_OK) {
281
272
return TCL_ERROR;
282
} else if (argc != 2) {
283
sprintf(x,"%d",argc);
284
Tcl_AppendResult(interp, "wrong # coordinates: expected 2, got ",
273
} else if (objc != 2) {
274
char buf[64 + TCL_INTEGER_SPACE];
276
sprintf(buf, "wrong # coordinates: expected 2, got %d", objc);
277
Tcl_SetResult(interp, buf, TCL_VOLATILE);
286
278
return TCL_ERROR;
289
if ((Tk_CanvasGetCoordFromObj(interp, canvas, objv[0], &bmapPtr->x) != TCL_OK)
290
|| (Tk_CanvasGetCoordFromObj(interp, canvas, objv[1], &bmapPtr->y)
281
if ((Tk_CanvasGetCoordFromObj(interp, canvas, objv[0],
282
&bmapPtr->x) != TCL_OK)
283
|| (Tk_CanvasGetCoordFromObj(interp, canvas, objv[1],
284
&bmapPtr->y) != TCL_OK)) {
292
285
return TCL_ERROR;
294
287
ComputeBitmapBbox(canvas, bmapPtr);
296
sprintf(x,"%d",argc);
297
Tcl_AppendResult(interp, "wrong # coordinates: expected 0 or 2, got ",
289
char buf[64 + TCL_INTEGER_SPACE];
291
sprintf(buf, "wrong # coordinates: expected 0 or 2, got %d", objc);
292
Tcl_SetResult(interp, buf, TCL_VOLATILE);
299
293
return TCL_ERROR;
305
299
*--------------------------------------------------------------
323
ConfigureBitmap(interp, canvas, itemPtr, argc, argv, flags)
317
ConfigureBitmap(interp, canvas, itemPtr, objc, objv, flags)
324
318
Tcl_Interp *interp; /* Used for error reporting. */
325
319
Tk_Canvas canvas; /* Canvas containing itemPtr. */
326
320
Tk_Item *itemPtr; /* Bitmap item to reconfigure. */
327
int argc; /* Number of elements in argv. */
328
char **argv; /* Arguments describing things to configure. */
321
int objc; /* Number of elements in objv. */
322
Tcl_Obj *CONST objv[]; /* Arguments describing things to configure. */
329
323
int flags; /* Flags to pass to Tk_ConfigureWidget. */
331
325
BitmapItem *bmapPtr = (BitmapItem *) itemPtr;
341
335
tkwin = Tk_CanvasTkwin(canvas);
342
if (Tk_ConfigureWidget(interp, tkwin, configSpecs, argc, argv,
343
(char *) bmapPtr, flags|TK_CONFIG_OBJS) != TCL_OK) {
336
if (TCL_OK != Tk_ConfigureWidget(interp, tkwin, configSpecs, objc,
337
objv, (char *) bmapPtr, flags|TK_CONFIG_OBJS)) {
344
338
return TCL_ERROR;
928
922
if (bmapPtr->bgColor != NULL) {
930
924
"%.15g %.15g moveto %d 0 rlineto 0 %d rlineto %d %s\n",
931
x, y, width, height, -width,"0 rlineto closepath");
925
x, y, width, height, -width, "0 rlineto closepath");
932
926
Tcl_AppendResult(interp, buffer, (char *) NULL);
933
927
if (Tk_CanvasPsColor(interp, canvas, bmapPtr->bgColor) != TCL_OK) {
934
928
return TCL_ERROR;