|
|
1.1 ! root 1: /* ! 2: * tkCanvBmap.c -- ! 3: * ! 4: * This file implements bitmap items for canvas widgets. ! 5: * ! 6: * Copyright 1992 Regents of the University of California. ! 7: * Permission to use, copy, modify, and distribute this ! 8: * software and its documentation for any purpose and without ! 9: * fee is hereby granted, provided that the above copyright ! 10: * notice appear in all copies. The University of California ! 11: * makes no representations about the suitability of this ! 12: * software for any purpose. It is provided "as is" without ! 13: * express or implied warranty. ! 14: */ ! 15: ! 16: #ifndef lint ! 17: static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkCanvBmap.c,v 1.4 92/08/24 09:24:11 ouster Exp $ SPRITE (Berkeley)"; ! 18: #endif ! 19: ! 20: #include <stdio.h> ! 21: #include <math.h> ! 22: #include "tkint.h" ! 23: #include "tkcanvas.h" ! 24: ! 25: /* ! 26: * The structure below defines the record for each rectangle/oval item. ! 27: */ ! 28: ! 29: typedef struct BitmapItem { ! 30: Tk_Item header; /* Generic stuff that's the same for all ! 31: * types. MUST BE FIRST IN STRUCTURE. */ ! 32: double x, y; /* Coordinates of positioning point for ! 33: * bitmap. */ ! 34: Tk_Anchor anchor; /* Where to anchor bitmap relative to ! 35: * (x,y). */ ! 36: Pixmap bitmap; /* Bitmap to display in window. */ ! 37: XColor *fgColor; /* Foreground color to use for bitmap. */ ! 38: XColor *bgColor; /* Background color to use for bitmap. */ ! 39: GC gc; /* Graphics context to use for drawing ! 40: * bitmap on screen. */ ! 41: } BitmapItem; ! 42: ! 43: /* ! 44: * Information used for parsing configuration specs: ! 45: */ ! 46: ! 47: static Tk_ConfigSpec configSpecs[] = { ! 48: {TK_CONFIG_ANCHOR, "-anchor", (char *) NULL, (char *) NULL, ! 49: "center", Tk_Offset(BitmapItem, anchor), TK_CONFIG_DONT_SET_DEFAULT}, ! 50: {TK_CONFIG_COLOR, "-background", (char *) NULL, (char *) NULL, ! 51: (char *) NULL, Tk_Offset(BitmapItem, bgColor), TK_CONFIG_NULL_OK}, ! 52: #if defined(USE_XPM3) ! 53: {TK_CONFIG_PIXMAP, "-bitmap", (char *) NULL, (char *) NULL, ! 54: (char *) NULL, Tk_Offset(BitmapItem, bitmap), TK_CONFIG_NULL_OK}, ! 55: #else ! 56: {TK_CONFIG_BITMAP, "-bitmap", (char *) NULL, (char *) NULL, ! 57: (char *) NULL, Tk_Offset(BitmapItem, bitmap), TK_CONFIG_NULL_OK}, ! 58: #endif ! 59: {TK_CONFIG_COLOR, "-foreground", (char *) NULL, (char *) NULL, ! 60: "black", Tk_Offset(BitmapItem, fgColor), 0}, ! 61: {TK_CONFIG_CUSTOM, "-tags", (char *) NULL, (char *) NULL, ! 62: (char *) NULL, 0, TK_CONFIG_NULL_OK, &tkCanvasTagsOption}, ! 63: {TK_CONFIG_END, (char *) NULL, (char *) NULL, (char *) NULL, ! 64: (char *) NULL, 0, 0} ! 65: }; ! 66: ! 67: /* ! 68: * Prototypes for procedures defined in this file: ! 69: */ ! 70: ! 71: static int BitmapCoords _ANSI_ARGS_((Tk_Canvas *canvasPtr, ! 72: Tk_Item *itemPtr, int argc, char **argv)); ! 73: static int BitmapToArea _ANSI_ARGS_((Tk_Canvas *canvasPtr, ! 74: Tk_Item *itemPtr, double *rectPtr)); ! 75: static double BitmapToPoint _ANSI_ARGS_((Tk_Canvas *canvasPtr, ! 76: Tk_Item *itemPtr, double *coordPtr)); ! 77: static void ComputeBitmapBbox _ANSI_ARGS_((Tk_Canvas *canvasPtr, ! 78: BitmapItem *bmapPtr)); ! 79: static int ConfigureBitmap _ANSI_ARGS_(( ! 80: Tk_Canvas *canvasPtr, Tk_Item *itemPtr, int argc, ! 81: char **argv, int flags)); ! 82: static int CreateBitmap _ANSI_ARGS_((Tk_Canvas *canvasPtr, ! 83: struct Tk_Item *itemPtr, int argc, char **argv)); ! 84: static void DeleteBitmap _ANSI_ARGS_((Tk_Item *itemPtr)); ! 85: static void DisplayBitmap _ANSI_ARGS_((Tk_Canvas *canvasPtr, ! 86: Tk_Item *itemPtr, Drawable dst)); ! 87: static void ScaleBitmap _ANSI_ARGS_((Tk_Canvas *canvasPtr, ! 88: Tk_Item *itemPtr, double originX, double originY, ! 89: double scaleX, double scaleY)); ! 90: static void TranslateBitmap _ANSI_ARGS_((Tk_Canvas *canvasPtr, ! 91: Tk_Item *itemPtr, double deltaX, double deltaY)); ! 92: ! 93: /* ! 94: * The structures below defines the rectangle and oval item types ! 95: * by means of procedures that can be invoked by generic item code. ! 96: */ ! 97: ! 98: Tk_ItemType TkBitmapType = { ! 99: "bitmap", /* name */ ! 100: sizeof(BitmapItem), /* itemSize */ ! 101: CreateBitmap, /* createProc */ ! 102: configSpecs, /* configSpecs */ ! 103: ConfigureBitmap, /* configureProc */ ! 104: BitmapCoords, /* coordProc */ ! 105: DeleteBitmap, /* deleteProc */ ! 106: DisplayBitmap, /* displayProc */ ! 107: 0, /* alwaysRedraw */ ! 108: BitmapToPoint, /* pointProc */ ! 109: BitmapToArea, /* areaProc */ ! 110: (Tk_ItemPostscriptProc *) NULL, /* postscriptProc */ ! 111: ScaleBitmap, /* scaleProc */ ! 112: TranslateBitmap, /* translateProc */ ! 113: (Tk_ItemIndexProc *) NULL, /* indexProc */ ! 114: (Tk_ItemCursorProc *) NULL, /* cursorProc */ ! 115: (Tk_ItemSelectionProc *) NULL, /* selectionProc */ ! 116: (Tk_ItemInsertProc *) NULL, /* insertProc */ ! 117: (Tk_ItemDCharsProc *) NULL, /* dTextProc */ ! 118: (Tk_ItemType *) NULL /* nextPtr */ ! 119: }; ! 120: ! 121: /* ! 122: *-------------------------------------------------------------- ! 123: * ! 124: * CreateBitmap -- ! 125: * ! 126: * This procedure is invoked to create a new bitmap ! 127: * item in a canvas. ! 128: * ! 129: * Results: ! 130: * A standard Tcl return value. If an error occurred in ! 131: * creating the item, then an error message is left in ! 132: * canvasPtr->interp->result; in this case itemPtr is ! 133: * left uninitialized, so it can be safely freed by the ! 134: * caller. ! 135: * ! 136: * Side effects: ! 137: * A new bitmap item is created. ! 138: * ! 139: *-------------------------------------------------------------- ! 140: */ ! 141: ! 142: static int ! 143: CreateBitmap(canvasPtr, itemPtr, argc, argv) ! 144: register Tk_Canvas *canvasPtr; /* Canvas to hold new item. */ ! 145: Tk_Item *itemPtr; /* Record to hold new item; header ! 146: * has been initialized by caller. */ ! 147: int argc; /* Number of arguments in argv. */ ! 148: char **argv; /* Arguments describing rectangle. */ ! 149: { ! 150: register BitmapItem *bmapPtr = (BitmapItem *) itemPtr; ! 151: ! 152: if (argc < 2) { ! 153: Tcl_AppendResult(canvasPtr->interp, "wrong # args: should be \"", ! 154: Tk_PathName(canvasPtr->tkwin), "\" create ", ! 155: itemPtr->typePtr->name, " x y ?options?", ! 156: (char *) NULL); ! 157: return TCL_ERROR; ! 158: } ! 159: ! 160: /* ! 161: * Initialize item's record. ! 162: */ ! 163: ! 164: bmapPtr->anchor = TK_ANCHOR_CENTER; ! 165: bmapPtr->bitmap = None; ! 166: bmapPtr->fgColor = NULL; ! 167: bmapPtr->bgColor = NULL; ! 168: bmapPtr->gc = None; ! 169: ! 170: /* ! 171: * Process the arguments to fill in the item record. ! 172: */ ! 173: ! 174: if ((TkGetCanvasCoord(canvasPtr, argv[0], &bmapPtr->x) != TCL_OK) ! 175: || (TkGetCanvasCoord(canvasPtr, argv[1], ! 176: &bmapPtr->y) != TCL_OK)) { ! 177: return TCL_ERROR; ! 178: } ! 179: ! 180: if (ConfigureBitmap(canvasPtr, itemPtr, argc-2, argv+2, 0) != TCL_OK) { ! 181: DeleteBitmap(itemPtr); ! 182: return TCL_ERROR; ! 183: } ! 184: return TCL_OK; ! 185: } ! 186: ! 187: /* ! 188: *-------------------------------------------------------------- ! 189: * ! 190: * BitmapCoords -- ! 191: * ! 192: * This procedure is invoked to process the "coords" widget ! 193: * command on bitmap items. See the user documentation for ! 194: * details on what it does. ! 195: * ! 196: * Results: ! 197: * Returns TCL_OK or TCL_ERROR, and sets canvasPtr->interp->result. ! 198: * ! 199: * Side effects: ! 200: * The coordinates for the given item may be changed. ! 201: * ! 202: *-------------------------------------------------------------- ! 203: */ ! 204: ! 205: static int ! 206: BitmapCoords(canvasPtr, itemPtr, argc, argv) ! 207: register Tk_Canvas *canvasPtr; /* Canvas containing item. */ ! 208: Tk_Item *itemPtr; /* Item whose coordinates are to be ! 209: * read or modified. */ ! 210: int argc; /* Number of coordinates supplied in ! 211: * argv. */ ! 212: char **argv; /* Array of coordinates: x1, y1, ! 213: * x2, y2, ... */ ! 214: { ! 215: register BitmapItem *bmapPtr = (BitmapItem *) itemPtr; ! 216: ! 217: if (argc == 0) { ! 218: sprintf(canvasPtr->interp->result, "%g %g", bmapPtr->x, bmapPtr->y); ! 219: } else if (argc == 2) { ! 220: if ((TkGetCanvasCoord(canvasPtr, argv[0], &bmapPtr->x) != TCL_OK) ! 221: || (TkGetCanvasCoord(canvasPtr, argv[1], ! 222: &bmapPtr->y) != TCL_OK)) { ! 223: return TCL_ERROR; ! 224: } ! 225: ComputeBitmapBbox(canvasPtr, bmapPtr); ! 226: } else { ! 227: sprintf(canvasPtr->interp->result, ! 228: "wrong # coordinates: expected 0 or 2, got %d", ! 229: argc); ! 230: return TCL_ERROR; ! 231: } ! 232: return TCL_OK; ! 233: } ! 234: ! 235: /* ! 236: *-------------------------------------------------------------- ! 237: * ! 238: * ConfigureBitmap -- ! 239: * ! 240: * This procedure is invoked to configure various aspects ! 241: * of a bitmap item, such as its anchor position. ! 242: * ! 243: * Results: ! 244: * A standard Tcl result code. If an error occurs, then ! 245: * an error message is left in canvasPtr->interp->result. ! 246: * ! 247: * Side effects: ! 248: * Configuration information may be set for itemPtr. ! 249: * ! 250: *-------------------------------------------------------------- ! 251: */ ! 252: ! 253: static int ! 254: ConfigureBitmap(canvasPtr, itemPtr, argc, argv, flags) ! 255: Tk_Canvas *canvasPtr; /* Canvas containing itemPtr. */ ! 256: Tk_Item *itemPtr; /* Bitmap item to reconfigure. */ ! 257: int argc; /* Number of elements in argv. */ ! 258: char **argv; /* Arguments describing things to configure. */ ! 259: int flags; /* Flags to pass to Tk_ConfigureWidget. */ ! 260: { ! 261: register BitmapItem *bmapPtr = (BitmapItem *) itemPtr; ! 262: XGCValues gcValues; ! 263: GC newGC; ! 264: ! 265: if (Tk_ConfigureWidget(canvasPtr->interp, canvasPtr->tkwin, ! 266: configSpecs, argc, argv, (char *) bmapPtr, flags) != TCL_OK) { ! 267: return TCL_ERROR; ! 268: } ! 269: ! 270: /* ! 271: * A few of the options require additional processing, such as those ! 272: * that determine the graphics context. ! 273: */ ! 274: ! 275: gcValues.foreground = bmapPtr->fgColor->pixel; ! 276: if (bmapPtr->bgColor != NULL) { ! 277: gcValues.background = bmapPtr->bgColor->pixel; ! 278: } else { ! 279: gcValues.background = canvasPtr->bgColor->pixel; ! 280: } ! 281: newGC = Tk_GetGC(canvasPtr->tkwin, GCForeground|GCBackground, &gcValues); ! 282: if (bmapPtr->gc != None) { ! 283: Tk_FreeGC(bmapPtr->gc); ! 284: } ! 285: bmapPtr->gc = newGC; ! 286: ! 287: ComputeBitmapBbox(canvasPtr, bmapPtr); ! 288: ! 289: return TCL_OK; ! 290: } ! 291: ! 292: /* ! 293: *-------------------------------------------------------------- ! 294: * ! 295: * DeleteBitmap -- ! 296: * ! 297: * This procedure is called to clean up the data structure ! 298: * associated with a bitmap item. ! 299: * ! 300: * Results: ! 301: * None. ! 302: * ! 303: * Side effects: ! 304: * Resources associated with itemPtr are released. ! 305: * ! 306: *-------------------------------------------------------------- ! 307: */ ! 308: ! 309: static void ! 310: DeleteBitmap(itemPtr) ! 311: Tk_Item *itemPtr; /* Item that is being deleted. */ ! 312: { ! 313: register BitmapItem *bmapPtr = (BitmapItem *) itemPtr; ! 314: ! 315: if (bmapPtr->bitmap != None) { ! 316: #if defined(USE_XPM3) ! 317: Tk_FreePixmap(bmapPtr->bitmap); ! 318: #else ! 319: Tk_FreeBitmap(bmapPtr->bitmap); ! 320: #endif ! 321: } ! 322: if (bmapPtr->fgColor != NULL) { ! 323: Tk_FreeColor(bmapPtr->fgColor); ! 324: } ! 325: if (bmapPtr->bgColor != NULL) { ! 326: Tk_FreeColor(bmapPtr->bgColor); ! 327: } ! 328: if (bmapPtr->gc != NULL) { ! 329: Tk_FreeGC(bmapPtr->gc); ! 330: } ! 331: } ! 332: ! 333: /* ! 334: *-------------------------------------------------------------- ! 335: * ! 336: * ComputeBitmapBbox -- ! 337: * ! 338: * This procedure is invoked to compute the bounding box of ! 339: * all the pixels that may be drawn as part of a bitmap item. ! 340: * This procedure is where the child bitmap's placement is ! 341: * computed. ! 342: * ! 343: * Results: ! 344: * None. ! 345: * ! 346: * Side effects: ! 347: * The fields x1, y1, x2, and y2 are updated in the header ! 348: * for itemPtr. ! 349: * ! 350: *-------------------------------------------------------------- ! 351: */ ! 352: ! 353: /* ARGSUSED */ ! 354: static void ! 355: ComputeBitmapBbox(canvasPtr, bmapPtr) ! 356: Tk_Canvas *canvasPtr; /* Canvas that contains item. */ ! 357: register BitmapItem *bmapPtr; /* Item whose bbox is to be ! 358: * recomputed. */ ! 359: { ! 360: unsigned int width, height; ! 361: int x, y; ! 362: ! 363: x = bmapPtr->x + 0.5; ! 364: y = bmapPtr->y + 0.5; ! 365: ! 366: if (bmapPtr->bitmap == None) { ! 367: bmapPtr->header.x1 = bmapPtr->header.x2 = x; ! 368: bmapPtr->header.y1 = bmapPtr->header.y2 = y; ! 369: return; ! 370: } ! 371: ! 372: /* ! 373: * Compute location and size of bitmap, using anchor information. ! 374: */ ! 375: ! 376: #if defined(USE_XPM3) ! 377: Tk_SizeOfPixmap(bmapPtr->bitmap, &width, &height); ! 378: #else ! 379: Tk_SizeOfBitmap(bmapPtr->bitmap, &width, &height); ! 380: #endif ! 381: switch (bmapPtr->anchor) { ! 382: case TK_ANCHOR_N: ! 383: x -= width/2; ! 384: break; ! 385: case TK_ANCHOR_NE: ! 386: x -= width; ! 387: break; ! 388: case TK_ANCHOR_E: ! 389: x -= width; ! 390: y -= height/2; ! 391: break; ! 392: case TK_ANCHOR_SE: ! 393: x -= width; ! 394: y -= height; ! 395: break; ! 396: case TK_ANCHOR_S: ! 397: x -= width/2; ! 398: y -= height; ! 399: break; ! 400: case TK_ANCHOR_SW: ! 401: y -= height; ! 402: break; ! 403: case TK_ANCHOR_W: ! 404: y -= height/2; ! 405: break; ! 406: case TK_ANCHOR_NW: ! 407: break; ! 408: case TK_ANCHOR_CENTER: ! 409: x -= width/2; ! 410: y -= height/2; ! 411: break; ! 412: } ! 413: ! 414: /* ! 415: * Store the information in the item header. ! 416: */ ! 417: ! 418: bmapPtr->header.x1 = x; ! 419: bmapPtr->header.y1 = y; ! 420: bmapPtr->header.x2 = x + width; ! 421: bmapPtr->header.y2 = y + height; ! 422: } ! 423: ! 424: /* ! 425: *-------------------------------------------------------------- ! 426: * ! 427: * DisplayBitmap -- ! 428: * ! 429: * This procedure is invoked to draw a bitmap item in a given ! 430: * drawable. ! 431: * ! 432: * Results: ! 433: * None. ! 434: * ! 435: * Side effects: ! 436: * ItemPtr is drawn in drawable using the transformation ! 437: * information in canvasPtr. ! 438: * ! 439: *-------------------------------------------------------------- ! 440: */ ! 441: ! 442: static void ! 443: DisplayBitmap(canvasPtr, itemPtr, drawable) ! 444: register Tk_Canvas *canvasPtr; /* Canvas that contains item. */ ! 445: Tk_Item *itemPtr; /* Item to be displayed. */ ! 446: Drawable drawable; /* Pixmap or window in which to draw ! 447: * item. */ ! 448: { ! 449: register BitmapItem *bmapPtr = (BitmapItem *) itemPtr; ! 450: ! 451: if (bmapPtr->bitmap != None) { ! 452: #if defined(USE_XPM3) ! 453: XCopyArea(Tk_Display(canvasPtr->tkwin), bmapPtr->bitmap, drawable, ! 454: bmapPtr->gc, 0, 0, ! 455: (unsigned int) bmapPtr->header.x2 - bmapPtr->header.x1, ! 456: (unsigned int) bmapPtr->header.y2 - bmapPtr->header.y1, ! 457: bmapPtr->header.x1 - canvasPtr->drawableXOrigin, ! 458: bmapPtr->header.y1 - canvasPtr->drawableYOrigin); ! 459: #else ! 460: XCopyPlane(Tk_Display(canvasPtr->tkwin), bmapPtr->bitmap, drawable, ! 461: bmapPtr->gc, 0, 0, ! 462: (unsigned int) bmapPtr->header.x2 - bmapPtr->header.x1, ! 463: (unsigned int) bmapPtr->header.y2 - bmapPtr->header.y1, ! 464: bmapPtr->header.x1 - canvasPtr->drawableXOrigin, ! 465: bmapPtr->header.y1 - canvasPtr->drawableYOrigin, 1); ! 466: #endif ! 467: } ! 468: } ! 469: ! 470: /* ! 471: *-------------------------------------------------------------- ! 472: * ! 473: * BitmapToPoint -- ! 474: * ! 475: * Computes the distance from a given point to a given ! 476: * rectangle, in canvas units. ! 477: * ! 478: * Results: ! 479: * The return value is 0 if the point whose x and y coordinates ! 480: * are coordPtr[0] and coordPtr[1] is inside the bitmap. If the ! 481: * point isn't inside the bitmap then the return value is the ! 482: * distance from the point to the bitmap. ! 483: * ! 484: * Side effects: ! 485: * None. ! 486: * ! 487: *-------------------------------------------------------------- ! 488: */ ! 489: ! 490: /* ARGSUSED */ ! 491: static double ! 492: BitmapToPoint(canvasPtr, itemPtr, coordPtr) ! 493: Tk_Canvas *canvasPtr; /* Canvas containing item. */ ! 494: Tk_Item *itemPtr; /* Item to check against point. */ ! 495: double *coordPtr; /* Pointer to x and y coordinates. */ ! 496: { ! 497: register BitmapItem *bmapPtr = (BitmapItem *) itemPtr; ! 498: double x1, x2, y1, y2, xDiff, yDiff; ! 499: ! 500: x1 = bmapPtr->header.x1; ! 501: y1 = bmapPtr->header.y1; ! 502: x2 = bmapPtr->header.x2; ! 503: y2 = bmapPtr->header.y2; ! 504: ! 505: /* ! 506: * Point is outside rectangle. ! 507: */ ! 508: ! 509: if (coordPtr[0] < x1) { ! 510: xDiff = x1 - coordPtr[0]; ! 511: } else if (coordPtr[0] > x2) { ! 512: xDiff = coordPtr[0] - x2; ! 513: } else { ! 514: xDiff = 0; ! 515: } ! 516: ! 517: if (coordPtr[1] < y1) { ! 518: yDiff = y1 - coordPtr[1]; ! 519: } else if (coordPtr[1] > y2) { ! 520: yDiff = coordPtr[1] - y2; ! 521: } else { ! 522: yDiff = 0; ! 523: } ! 524: ! 525: return hypot(xDiff, yDiff); ! 526: } ! 527: ! 528: /* ! 529: *-------------------------------------------------------------- ! 530: * ! 531: * BitmapToArea -- ! 532: * ! 533: * This procedure is called to determine whether an item ! 534: * lies entirely inside, entirely outside, or overlapping ! 535: * a given rectangle. ! 536: * ! 537: * Results: ! 538: * -1 is returned if the item is entirely outside the area ! 539: * given by rectPtr, 0 if it overlaps, and 1 if it is entirely ! 540: * inside the given area. ! 541: * ! 542: * Side effects: ! 543: * None. ! 544: * ! 545: *-------------------------------------------------------------- ! 546: */ ! 547: ! 548: /* ARGSUSED */ ! 549: static int ! 550: BitmapToArea(canvasPtr, itemPtr, rectPtr) ! 551: Tk_Canvas *canvasPtr; /* Canvas containing item. */ ! 552: Tk_Item *itemPtr; /* Item to check against rectangle. */ ! 553: double *rectPtr; /* Pointer to array of four coordinates ! 554: * (x1, y1, x2, y2) describing rectangular ! 555: * area. */ ! 556: { ! 557: register BitmapItem *bmapPtr = (BitmapItem *) itemPtr; ! 558: ! 559: if ((rectPtr[2] <= bmapPtr->header.x1) ! 560: || (rectPtr[0] >= bmapPtr->header.x2) ! 561: || (rectPtr[3] <= bmapPtr->header.y1) ! 562: || (rectPtr[1] >= bmapPtr->header.y2)) { ! 563: return -1; ! 564: } ! 565: if ((rectPtr[0] <= bmapPtr->header.x1) ! 566: && (rectPtr[1] <= bmapPtr->header.y1) ! 567: && (rectPtr[2] >= bmapPtr->header.x2) ! 568: && (rectPtr[3] >= bmapPtr->header.y2)) { ! 569: return 1; ! 570: } ! 571: return 0; ! 572: } ! 573: ! 574: /* ! 575: *-------------------------------------------------------------- ! 576: * ! 577: * ScaleBitmap -- ! 578: * ! 579: * This procedure is invoked to rescale a rectangle or oval ! 580: * item. ! 581: * ! 582: * Results: ! 583: * None. ! 584: * ! 585: * Side effects: ! 586: * The rectangle or oval referred to by itemPtr is rescaled ! 587: * so that the following transformation is applied to all ! 588: * point coordinates: ! 589: * x' = originX + scaleX*(x-originX) ! 590: * y' = originY + scaleY*(y-originY) ! 591: * ! 592: *-------------------------------------------------------------- ! 593: */ ! 594: ! 595: static void ! 596: ScaleBitmap(canvasPtr, itemPtr, originX, originY, scaleX, scaleY) ! 597: Tk_Canvas *canvasPtr; /* Canvas containing rectangle. */ ! 598: Tk_Item *itemPtr; /* Rectangle to be scaled. */ ! 599: double originX, originY; /* Origin about which to scale rect. */ ! 600: double scaleX; /* Amount to scale in X direction. */ ! 601: double scaleY; /* Amount to scale in Y direction. */ ! 602: { ! 603: register BitmapItem *bmapPtr = (BitmapItem *) itemPtr; ! 604: ! 605: bmapPtr->x = originX + scaleX*(bmapPtr->x - originX); ! 606: bmapPtr->y = originY + scaleY*(bmapPtr->y - originY); ! 607: ComputeBitmapBbox(canvasPtr, bmapPtr); ! 608: } ! 609: ! 610: /* ! 611: *-------------------------------------------------------------- ! 612: * ! 613: * TranslateBitmap -- ! 614: * ! 615: * This procedure is called to move a rectangle or oval by a ! 616: * given amount. ! 617: * ! 618: * Results: ! 619: * None. ! 620: * ! 621: * Side effects: ! 622: * The position of the rectangle or oval is offset by ! 623: * (xDelta, yDelta), and the bounding box is updated in the ! 624: * generic part of the item structure. ! 625: * ! 626: *-------------------------------------------------------------- ! 627: */ ! 628: ! 629: static void ! 630: TranslateBitmap(canvasPtr, itemPtr, deltaX, deltaY) ! 631: Tk_Canvas *canvasPtr; /* Canvas containing item. */ ! 632: Tk_Item *itemPtr; /* Item that is being moved. */ ! 633: double deltaX, deltaY; /* Amount by which item is to be ! 634: * moved. */ ! 635: { ! 636: register BitmapItem *bmapPtr = (BitmapItem *) itemPtr; ! 637: ! 638: bmapPtr->x += deltaX; ! 639: bmapPtr->y += deltaY; ! 640: ComputeBitmapBbox(canvasPtr, bmapPtr); ! 641: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.