Annotation of micropolis/src/tk/tkcvbmap.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.