Annotation of 43BSDTahoe/new/X/libibm/libsrc/bitpix.c, revision 1.1

1.1     ! root        1: #ifndef lint
        !             2: static char *rcsid_bitpix_c = "$Header: bitpix.c,v 10.1 86/11/19 10:40:11 jg Exp $";
        !             3: #endif lint
        !             4: /* Copyright 1985 Massachusetts Institute of Technology */
        !             5: 
        !             6: /* bitpix.c - Routines to cache bitmaps and pixmaps
        !             7:  *
        !             8:  *      StoreBitmap     Creates a bitmap
        !             9:  *      FreeBitmap      Frees the storage taken by a bitmap
        !            10:  *      CharBitmap      Creates a bitmap from a font character
        !            11:  *      StorePixmap     Creates a pixmap
        !            12:  *      FreePixmap      Frees the storage taken by a pixmap
        !            13:  *      MakePixmap      Create a pixmap from a bitmap
        !            14:  *      PixmapSave      Save a region of the screen
        !            15:  *      PixmapGet       Read a region of the screen
        !            16:  *
        !            17:  *     Changes and additions by:
        !            18:  *
        !            19:  *             Scott Bates
        !            20:  *             Brown University
        !            21:  *             IRIS, Box 1946
        !            22:  *                     Providence, RI 02912
        !            23:  *
        !            24:  *
        !            25:  *             Copyright (c) 1986 Brown University
        !            26:  *
        !            27:  * Permission to use, copy, modify and distribute this software and its
        !            28:  * documentation for any purpose and without fee is hereby granted, provided
        !            29:  * that the above copyright notice appear in all copies, and that both
        !            30:  * that copyright notice and this permission notice appear in supporting
        !            31:  * documentation, and that the name of Brown University not be used in
        !            32:  * advertising or publicity pertaining to distribution of the software
        !            33:  * without specific, written prior permission. Brown University makes no
        !            34:  * representations about the suitability of this software for any purpose.
        !            35:  * It is provided "as-is" without express or implied warranty.
        !            36:  */
        !            37: 
        !            38: #include "private.h"
        !            39: #include "bitblt.h"
        !            40: 
        !            41: /*
        !            42:  * Create bitmap from client supplied data
        !            43:  */
        !            44: 
        !            45: BITMAP *StoreBitmap (width, height, data)
        !            46:         register width, height;
        !            47:         char *data;
        !            48: {
        !            49:         register BITMAP *bm;
        !            50:         register size = BitmapSize(width, height);
        !            51: 
        !            52: #ifdef TRACE_X
        !            53:        fprintf(stderr, "In StoreBitmap\n");
        !            54:        fflush(stderr);
        !            55: #endif TRACE_X
        !            56: 
        !            57:        /*
        !            58:         * Allocate space for bitmap structure
        !            59:         */
        !            60: 
        !            61:         bm = (BITMAP *) Xalloc (sizeof (BITMAP));
        !            62: 
        !            63:        /*
        !            64:         * Fill in bitmap structure
        !            65:         */
        !            66: 
        !            67:         bm->width = width;
        !            68:         bm->height = height;
        !            69:         bm->refcnt = 1;
        !            70: 
        !            71:        /*
        !            72:         * Allocated space to hold bitimage data
        !            73:         */
        !            74: 
        !            75:         if ((bm->data = (caddr_t) malloc (size)) == NULL) {
        !            76:             free ((caddr_t) bm);
        !            77:             return (NULL);
        !            78:         }
        !            79: 
        !            80:        /*
        !            81:         * Copy image data to newly allocated area and reverse bits
        !            82:         * in each short of the image. The image data is in vax 
        !            83:         * bit order and must be reversed for this hardware.
        !            84:         */
        !            85: 
        !            86:         bcopy (data, bm->data, size);
        !            87:        ReverseShortBits((u_short *) bm->data, size >> 1);
        !            88: 
        !            89:        /*
        !            90:         * Return pointer to bitmap
        !            91:         */
        !            92: 
        !            93:         return (bm);
        !            94: }
        !            95: 
        !            96: /*
        !            97:  * Free bitmap structure and bit image data
        !            98:  */
        !            99: 
        !           100: FreeBitmap (bitmap)
        !           101:         register BITMAP *bitmap;
        !           102: {
        !           103: 
        !           104: #ifdef TRACE_X
        !           105:        fprintf(stderr, "In FreeBitmap\n");
        !           106:        fflush(stderr);
        !           107: #endif TRACE_X
        !           108: 
        !           109:         free ((caddr_t) bitmap->data);
        !           110:         free ((caddr_t) bitmap);
        !           111: }
        !           112: 
        !           113: /*
        !           114:  * Create character bitmap from font character
        !           115:  */
        !           116: 
        !           117: BITMAP *CharBitmap (c, font)
        !           118:         u_char c;
        !           119:         register FONT *font;
        !           120: {
        !           121:         register width;
        !           122:        register size;
        !           123:         register BITMAP *bm;
        !           124: 
        !           125: #ifdef TRACE_X
        !           126:        fprintf(stderr, "In CharBitmap\n");
        !           127:        fflush(stderr);
        !           128: #endif TRACE_X
        !           129: 
        !           130:        /*
        !           131:         * Test for valid character
        !           132:         */
        !           133: 
        !           134:         if (c < font->first || c > font->last) {
        !           135:             errno = EINVAL;
        !           136:             return (NULL);
        !           137:         }
        !           138: 
        !           139:        /*
        !           140:         * Determine width of character
        !           141:         */
        !           142: 
        !           143:         if (font->fixed)
        !           144:             width = font->avg_width;
        !           145:         else
        !           146:             width = FDATA(font)->widths[c];
        !           147: 
        !           148:        /*
        !           149:         * Validate width
        !           150:         */
        !           151: 
        !           152:         if (width == 0) {
        !           153:             errno = EINVAL;
        !           154:             return (NULL);
        !           155:         }
        !           156: 
        !           157:        /* 
        !           158:         * Allocate space for bitmap structure
        !           159:         */
        !           160: 
        !           161:         bm = (BITMAP *) Xalloc (sizeof (BITMAP));
        !           162: 
        !           163:        /*
        !           164:         * Fill in bitmap structure
        !           165:         */
        !           166: 
        !           167:         bm->width = width;
        !           168:         bm->height = font->height;
        !           169:         bm->refcnt = 1;
        !           170: 
        !           171:        /*
        !           172:         * Allocate space to hold bit image of character
        !           173:         */
        !           174: 
        !           175:        size = BitmapSize(width, bm->height);
        !           176:         if ((bm->data = (caddr_t) malloc (size)) == NULL) {
        !           177:             free ((caddr_t) bm);
        !           178:             errno = ENOMEM;
        !           179:             return (NULL);
        !           180:         }
        !           181: 
        !           182:        /*
        !           183:         * Copy bit image of character to newly allocated area
        !           184:         * and return pointer to character bitmap
        !           185:         */
        !           186: 
        !           187:         CopyText ((caddr_t) &c, 1, font, bm);
        !           188:         return (bm);
        !           189: }
        !           190: 
        !           191: /*
        !           192:  * Create pixmap from client supplied data
        !           193:  */
        !           194: 
        !           195: /*ARGSUSED*/
        !           196: PIXMAP *StorePixmap (width, height, format, data)
        !           197:         int width, height, format;
        !           198:         char *data;
        !           199: {
        !           200:         register BITMAP *bm;
        !           201:         register PIXMAP *pm;
        !           202: 
        !           203: #ifdef TRACE_X
        !           204:        fprintf(stderr, "In StorePixmap\n");
        !           205:        fflush(stderr);
        !           206: #endif TRACE_X
        !           207: 
        !           208:        /*
        !           209:         * Create bitmap from the bit image data supplied.
        !           210:         */
        !           211: 
        !           212:         if ((bm = StoreBitmap (width, height, data)) == NULL) {
        !           213:             return (NULL);
        !           214:        }
        !           215: 
        !           216:        /*
        !           217:         * Reset reference count so bitmap will be deallocated 
        !           218:         * correctly by FreePixmap 
        !           219:         */
        !           220:         
        !           221:         bm->refcnt = 0;
        !           222: 
        !           223:        /*
        !           224:         * Make pixmap from bitmap
        !           225:         */
        !           226: 
        !           227:         if (pm = MakePixmap (bm, 1, 0))
        !           228:             return (pm);
        !           229: 
        !           230:        /*
        !           231:         * If unable to make pixmap free the bitmap
        !           232:         */
        !           233: 
        !           234:         FreeBitmap (bm);
        !           235:         return (NULL);
        !           236: }
        !           237: 
        !           238: /*
        !           239:  * Free pixmap resources
        !           240:  */
        !           241: 
        !           242: FreePixmap (pm)
        !           243:         register PIXMAP *pm;
        !           244: {
        !           245:         register BITMAP *bm;
        !           246: 
        !           247: #ifdef TRACE_X
        !           248:        fprintf(stderr, "In FreePixmap\n");
        !           249:        fflush(stderr);
        !           250: #endif TRACE_X
        !           251: 
        !           252:        /*
        !           253:         * If a bitmap is associated with this pixmap and its
        !           254:         * reference count is equal to zero free it. Otherwise 
        !           255:         * decrement its reference count and return.
        !           256:         */
        !           257: 
        !           258:         if (pm->kind & BitmapPixmap) {
        !           259:             bm = PDATA(pm);
        !           260:             if (--bm->refcnt == 0)
        !           261:                 FreeBitmap (bm);
        !           262:         }
        !           263: 
        !           264:        /*
        !           265:         * Free pixmap structure
        !           266:         */
        !           267: 
        !           268:         free ((caddr_t) pm);
        !           269: }
        !           270: 
        !           271: /*
        !           272:  * Make a pixmap from a bitmap
        !           273:  */
        !           274: 
        !           275: PIXMAP *MakePixmap (xymask, fore, back)
        !           276:         register BITMAP *xymask;
        !           277:         register fore, back;
        !           278: {
        !           279:         register PIXMAP *pm;
        !           280: 
        !           281: #ifdef TRACE_X
        !           282:        fprintf(stderr, "In MakePixmap\n");
        !           283:        fflush(stderr);
        !           284: #endif TRACE_X
        !           285: 
        !           286:        /*
        !           287:         * If no bitmap was supplied or the foreground and
        !           288:         * background colors are the same then pixmap is
        !           289:         * a constant pixmap (either all white or all black)
        !           290:         */
        !           291: 
        !           292:         if (xymask == NULL || !((fore ^ back) & 1)) {
        !           293:                if (fore & 1)
        !           294:                        pm = &constpix1;
        !           295:                else
        !           296:                        pm = &constpix0;
        !           297:                pm->refcnt++;
        !           298:                return (pm);
        !           299:         }
        !           300: 
        !           301:        /*
        !           302:         * Allocate space for pixmap structure
        !           303:         */
        !           304: 
        !           305:         pm = (PIXMAP *) Xalloc (sizeof (PIXMAP));
        !           306: 
        !           307:        /*
        !           308:         * Fill in pixmap structure. Indicate that a bitmap is
        !           309:         * associated with this pixmap (BitmapPixmap).
        !           310:         */
        !           311: 
        !           312:         pm->width = xymask->width;
        !           313:         pm->height = xymask->height;
        !           314:         pm->refcnt = 1;
        !           315:         pm->kind = BitmapPixmap;
        !           316:         pm->data = (caddr_t) xymask;
        !           317: 
        !           318:        /*
        !           319:         * Increment reference count of bitmap
        !           320:         */
        !           321: 
        !           322:         xymask->refcnt++;
        !           323: 
        !           324:        /*
        !           325:         * Indicate if pixmap can be used as a tile
        !           326:         */
        !           327: 
        !           328:         if (xymask->width == TILE_WIDTH && xymask->height == TILE_HEIGHT) {
        !           329:             pm->tile = CanBeTiled;
        !           330:         } else {
        !           331:             pm->tile = CannotBeTiled;
        !           332:         }
        !           333: 
        !           334:        /*
        !           335:         * Indicate if bit image needs to be inverted when displayed
        !           336:         */
        !           337: 
        !           338:         if (back & 1)
        !           339:             pm->kind |= InvertFlag;
        !           340: 
        !           341:        /*
        !           342:         * Return pointer to pixmap
        !           343:         */
        !           344: 
        !           345:         return (pm);
        !           346: }
        !           347: 
        !           348: /*
        !           349:  * Save rectangular screen image
        !           350:  */
        !           351: 
        !           352: PIXMAP *PixmapSave (srcx, srcy, width, height)
        !           353:         register srcx, srcy, width, height;
        !           354: {
        !           355:        register Blt_Rectangle *source = &SrcRect;
        !           356:        register Blt_Rectangle *dest = &DstRect;
        !           357:         register BITMAP *bm;
        !           358:         PIXMAP *pm;
        !           359: 
        !           360: #ifdef TRACE_X
        !           361:        fprintf(stderr, "In PixmapSave\n");
        !           362:        fflush(stderr);
        !           363: #endif TRACE_X
        !           364: 
        !           365:        /*
        !           366:         * Allocate space for bitmap structure
        !           367:         */
        !           368: 
        !           369:         bm = (BITMAP *) Xalloc (sizeof (BITMAP));
        !           370: 
        !           371: 
        !           372:        /*
        !           373:         * Fill in bitmap structure
        !           374:         */
        !           375: 
        !           376:         bm->width = width;
        !           377:         bm->height = height;
        !           378:         bm->refcnt = 0;
        !           379: 
        !           380:        /*
        !           381:         * Allocate space to hold screen image
        !           382:         */
        !           383: 
        !           384:         if ((bm->data = 
        !           385:                 (caddr_t) malloc (BitmapSize(width, height))) == NULL) {
        !           386:             free ((caddr_t) bm);
        !           387:             return (NULL);
        !           388:         }
        !           389: 
        !           390:        /*
        !           391:         * Fill in source and destination rectangles
        !           392:         */
        !           393: 
        !           394:        FillInRect(srcx, srcy, width, height, source);
        !           395:        FillInRect(0, 0, width, height, dest);
        !           396: 
        !           397:        /*
        !           398:         * Copy screen image to allocated area
        !           399:         */
        !           400: 
        !           401:         CopyBits ((u_short *) pbm.data, pbm.width, pbm.height, source,
        !           402:                   (u_short *) bm->data, width, height, dest,
        !           403:                  NILMASK, NIL, NIL, GXcopy, NIL, NILCLIP);
        !           404: 
        !           405:        /*
        !           406:         * Make pixmap from bitmap and return pointer to pixmap
        !           407:         */
        !           408: 
        !           409:         if (pm = MakePixmap (bm, 1, 0))
        !           410:             return (pm);
        !           411: 
        !           412:        /*
        !           413:         * If unable to make pixmap free bitmap
        !           414:         */
        !           415: 
        !           416:         FreeBitmap (bm);
        !           417:         return (NULL);
        !           418: }
        !           419: 
        !           420: /*
        !           421:  * Pass rectangular screen image to client
        !           422:  */
        !           423: 
        !           424: /*ARGSUSED*/
        !           425: PixmapGet (srcx, srcy, width, height, client, format, swapit)
        !           426:         int srcx, srcy, width, height, client, format;
        !           427: {
        !           428:         register PIXMAP *pm;
        !           429:         register BITMAP *bm;
        !           430:         register size = BitmapSize(width, height);
        !           431: 
        !           432: #ifdef TRACE_X
        !           433:        fprintf(stderr, "In PixmapGet\n");
        !           434:        fflush(stderr);
        !           435: #endif TRACE_X
        !           436: 
        !           437:        /*
        !           438:         * Save screen image 
        !           439:         */
        !           440: 
        !           441:         pm = PixmapSave (srcx, srcy, width, height);
        !           442: 
        !           443:        /*
        !           444:         * Reverse the bits in each short of the image. The image
        !           445:         * is in IBM bit order and needs to be in VAX bit order when
        !           446:         * given to clients.
        !           447:         */
        !           448: 
        !           449:         bm = (BITMAP *) pm->data;
        !           450:        ReverseShortBits((u_short *) bm->data, size >> 1);
        !           451: 
        !           452:        /*
        !           453:         * Swap shorts of image if required by client
        !           454:         */
        !           455: 
        !           456:         if (swapit)
        !           457:                 Swap_shorts ((short *) bm->data, size >> 1 );
        !           458: 
        !           459:        /*
        !           460:         * Write screen image to client. Image size must be padded 
        !           461:         * to 32 bit boundary.
        !           462:         */
        !           463: 
        !           464:        Write (client, bm->data, size);
        !           465:        if (size % 4) {
        !           466:                Write(client, bm->data, 4 - (size % 4));
        !           467:        }
        !           468: 
        !           469:        /*
        !           470:         * Free pixmap and return
        !           471:         */
        !           472: 
        !           473:         FreePixmap(pm);
        !           474: }

unix.superglobalmegacorp.com

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