Annotation of 43BSD/contrib/X/libvs100/bitpix.c, revision 1.1.1.1

1.1       root        1: /* $Header: bitpix.c,v 10.3 86/02/01 15:46:25 tony Rel $ */
                      2: /* Routines to cache bitmaps and pixmaps in the frame buffer memory:
                      3:  *
                      4:  *     StoreBitmap     Creates a bitmap
                      5:  *     FreeBitmap      Frees the storage taken by a bitmap
                      6:  *     CharBitmap      Creates a bitmap from a font character
                      7:  *     StorePixmap     Creates a pixmap
                      8:  *     FreePixmap      Frees the storage taken by a pixmap
                      9:  *     MakePixmap      Create a pixmap from a bitmap
                     10:  *     PixmapSave      Save a region of the screen
                     11:  *     PixmapGet       Read a region of the screen
                     12:  *
                     13:  */
                     14: 
                     15: /****************************************************************************
                     16:  *                                                                         *
                     17:  *  Copyright (c) 1983, 1984 by                                                    *
                     18:  *  DIGITAL EQUIPMENT CORPORATION, Maynard, Massachusetts.                 *
                     19:  *  All rights reserved.                                                   *
                     20:  *                                                                         *
                     21:  *  This software is furnished on an as-is basis and may be used and copied *
                     22:  *  only with inclusion of the above copyright notice. This software or any *
                     23:  *  other copies thereof may be provided or otherwise made available to     *
                     24:  *  others only for non-commercial purposes.  No title to or ownership of   *
                     25:  *  the software is hereby transferred.                                            *
                     26:  *                                                                         *
                     27:  *  The information in this software is  subject to change without notice   *
                     28:  *  and  should  not  be  construed as  a commitment by DIGITAL EQUIPMENT   *
                     29:  *  CORPORATION.                                                           *
                     30:  *                                                                         *
                     31:  *  DIGITAL assumes no responsibility for the use  or  reliability of its   *
                     32:  *  software on equipment which is not supplied by DIGITAL.                *
                     33:  *                                                                         *
                     34:  *                                                                         *
                     35:  ****************************************************************************/
                     36: 
                     37: #include "vs100.h"
                     38: #include <errno.h>
                     39: 
                     40: extern int errno;
                     41: extern BitMap screen;
                     42: extern int VSReloc;
                     43: 
                     44: char *Xalloc(), *AllocateSpace();
                     45: VSArea *VSAlloc();
                     46: PIXMAP *MakePixmap();
                     47: 
                     48: BITMAP *StoreBitmap (width, height, data)
                     49:        int width, height;
                     50:        char *data;
                     51: {
                     52:        register BITMAP *bm;
                     53:        int size;
                     54: 
                     55:        bm = (BITMAP *) Xalloc (sizeof (BITMAP));
                     56:        bm->width = width;
                     57:        bm->height = height;
                     58:        bm->refcnt = 1;
                     59: 
                     60:        size = BitmapSize(width, height);
                     61:        if ((bm->data = (caddr_t) VSAlloc (size, BITMAP_TYPE)) == NULL) {
                     62:            free ((caddr_t) bm);
                     63:            return (NULL);
                     64:        }
                     65:        if (MoveBufferDown (data, BDATA(bm)->vsPtr, size)) {
                     66:            FreeBitmap (bm);
                     67:            return (NULL);
                     68:        }
                     69:        return (bm);
                     70: }
                     71: 
                     72: FreeBitmap (bitmap)
                     73:        register BITMAP *bitmap;
                     74: {
                     75:        VSFree (BDATA(bitmap));
                     76:        free ((caddr_t) bitmap);
                     77: }
                     78: 
                     79: BITMAP *CharBitmap (c, font)
                     80:        unsigned c;
                     81:        register FONT *font;
                     82: {
                     83:        int width;
                     84:        register BITMAP *bm;
                     85: 
                     86:        if (c < font->first || c > font->last) {
                     87:            errno = EINVAL;
                     88:            return (NULL);
                     89:        }
                     90:        if (font->fixed)
                     91:            width = font->avg_width;
                     92:        else
                     93:            width = FDATA(font)->widths[c - font->first];
                     94:        if (width == 0) {
                     95:            errno = EINVAL;
                     96:            return (NULL);
                     97:        }
                     98:        bm = (BITMAP *) Xalloc (sizeof (BITMAP));
                     99:        bm->width = width;
                    100:        bm->height = font->height;
                    101:        bm->refcnt = 1;
                    102:        if ((bm->data = (caddr_t) VSAlloc (BitmapSize(width, bm->height),
                    103:                                           BITMAP_TYPE)) == NULL) {
                    104:            free ((caddr_t) bm);
                    105:            errno = ENOMEM;
                    106:            return (NULL);
                    107:        }
                    108: 
                    109:        CopyText ((caddr_t) &c, 1, font, bm);
                    110:        return (bm);
                    111: }
                    112: 
                    113: /*ARGSUSED*/
                    114: PIXMAP *StorePixmap (width, height, format, data)
                    115:        int width, height, format;
                    116:        char *data;
                    117: {
                    118:        register BITMAP *bm;
                    119:        register PIXMAP *pm;
                    120: 
                    121:        bm = (BITMAP *) StoreBitmap (width, height, data);
                    122:        if (bm == NULL)
                    123:            return (NULL);
                    124:        bm->refcnt = 0;
                    125:        if (pm = MakePixmap (bm, 1, 0))
                    126:            return (pm);
                    127:        FreeBitmap (bm);
                    128:        return (NULL);
                    129: }
                    130: 
                    131: FreePixmap (pixmap)
                    132:        register PIXMAP *pixmap;
                    133: {
                    134: #ifdef HTCROCK
                    135:        register TilePriv *tp;
                    136: #endif
                    137:        register BITMAP *bm;
                    138: 
                    139:        if (pixmap->kind) {
                    140: #ifdef HTCROCK
                    141:            if (pixmap->kind & 2) {
                    142:                tp = TDATA(pixmap);
                    143:                bm = tp->bitmap;
                    144:                free ((caddr_t) tp);
                    145:            } else
                    146: #endif
                    147:            bm = PDATA(pixmap);
                    148:            if (--bm->refcnt == 0)
                    149:                FreeBitmap (bm);
                    150:        }
                    151:        free ((caddr_t) pixmap);
                    152: }
                    153: 
                    154: PIXMAP constpix0 = {1, 1, 1, 1, 0, (caddr_t) 0};
                    155: PIXMAP constpix1 = {1, 1, 1, 1, 0, (caddr_t) 1};
                    156: 
                    157: PIXMAP *MakePixmap (xymask, fore, back)
                    158:        register BITMAP *xymask;
                    159:        int fore, back;
                    160: {
                    161: #ifdef HTCROCK
                    162:        register TilePriv *tp;
                    163: #endif
                    164:        register PIXMAP *pm;
                    165: 
                    166:        if (xymask == NULL || !((fore ^ back) & 1)) {
                    167:            if (fore & 1)
                    168:                pm = &constpix1;
                    169:            else
                    170:                pm = &constpix0;
                    171:            pm->refcnt++;
                    172:            return (pm);
                    173:        }
                    174: 
                    175:        pm = (PIXMAP *) Xalloc (sizeof (PIXMAP));
                    176:        pm->width = xymask->width;
                    177:        pm->height = xymask->height;
                    178:        pm->refcnt = 1;
                    179:        xymask->refcnt++;
                    180:        if (xymask->width == 16 && xymask->height == 16) {
                    181:            pm->tile = 1;
                    182:            pm->kind = 2;
                    183: #ifdef HTCROCK
                    184:            tp = (TilePriv *) Xalloc (sizeof (TilePriv));
                    185:            tp->bitmap = xymask;
                    186:            pm->data = (caddr_t) tp;
                    187:            if (MoveBufferUp (BDATA(xymask)->vsPtr, (char *) tp->data, 32)) {
                    188:                FreePixmap (pm);
                    189:                return (NULL);
                    190:            }
                    191: #else
                    192:            pm->data = (caddr_t) xymask;
                    193: #endif
                    194:        } else {
                    195:            pm->tile = 0;
                    196:            pm->kind = 1;
                    197:            pm->data = (caddr_t) xymask;
                    198:        }
                    199:        if (back & 1)
                    200:            pm->kind |= 0x10;
                    201:        return (pm);
                    202: }
                    203: 
                    204: PIXMAP *PixmapSave (srcx, srcy, width, height)
                    205:        int srcx, srcy, width, height;
                    206: {
                    207:        register BITMAP *bm;
                    208:        PIXMAP *pm;
                    209:        register CopyAreaPacket *cap;
                    210: #define        h ((PacketHeader *) cap->cap_head)
                    211: #define src ((SubBitmap *) cap->cap_source.image)
                    212: #define dst ((SubBitmap *) cap->cap_destImage)
                    213: #define        size ((Extent *) cap->cap_maskSize)
                    214: 
                    215:        bm = (BITMAP *) Xalloc (sizeof (BITMAP));
                    216:        bm->width = width;
                    217:        bm->height = height;
                    218:        bm->refcnt = 0;
                    219: 
                    220:        if ((bm->data = (caddr_t) VSAlloc (BitmapSize(width, height),
                    221:                                           BITMAP_TYPE)) == NULL) {
                    222:            free ((caddr_t) bm);
                    223:            return (NULL);
                    224:        }
                    225: 
                    226:        cap = (CopyAreaPacket *) AllocateSpace (sizeof (CopyAreaPacket));
                    227:        if (cap == NULL) {
                    228:            FreeBitmap (bm);
                    229:            return (NULL);
                    230:        }
                    231: 
                    232:        h->ph_copyMod.m_mask = 0;
                    233:        h->ph_copyMod.m_map = 0;
                    234:        h->ph_copyMod.m_clipping = 0;
                    235:        h->ph_copyMod.m_source = 1;
                    236:        h->ph_opcode = COPY_AREA;
                    237:        *(long *) h->ph_next = NULL;
                    238: 
                    239:        *(BitMap *) src->sb_base = screen;
                    240:        src->sb_x = srcx;
                    241:        src->sb_y = srcy;
                    242:        size->e_height = height;
                    243:        size->e_width = width;
                    244: 
                    245:        *(caddr_t *)dst->sb_address = BDATA(bm)->vsPtr;
                    246:        dst->sb_height = height;
                    247:        dst->sb_width = width;
                    248:        dst->sb_bitsPerPixel = 1;
                    249:        dst->sb_x = dst->sb_y = 0;
                    250: 
                    251:        WritePacket ((caddr_t) cap);
                    252: 
                    253:        if (pm = MakePixmap (bm, 1, 0))
                    254:            return (pm);
                    255:        FreeBitmap (bm);
                    256:        return (NULL);
                    257: #undef h
                    258: #undef src
                    259: #undef dst
                    260: #undef size
                    261: }
                    262: 
                    263: /*ARGSUSED*/
                    264: PixmapGet (srcx, srcy, width, height, client, format, swapit)
                    265:        int srcx, srcy, width, height, client, format, swapit;
                    266: {
                    267:        int slop, width1, num, bytes;
                    268:        char padding[2];
                    269:        register CopyAreaPacket *cap;
                    270: #define        h ((PacketHeader *) cap->cap_head)
                    271: #define src ((SubBitmap *) cap->cap_source.image)
                    272: #define dst ((SubBitmap *) cap->cap_destImage)
                    273: #define        size ((Extent *) cap->cap_maskSize)
                    274: 
                    275:        width1 = BitmapSize(width, 1);
                    276:        slop = (width1 * height) & 2;
                    277:        num = VBUFSIZE / width1;
                    278:        while (height) {
                    279:            if (height < num)
                    280:                num = height;
                    281:            bytes = num * width1;
                    282:            cap = (CopyAreaPacket *) AllocateSpace (sizeof (CopyAreaPacket) +
                    283:                                                    bytes);
                    284:            if (cap == NULL)
                    285:                return;
                    286:            h->ph_copyMod.m_mask = 0;
                    287:            h->ph_copyMod.m_map = 0;
                    288:            h->ph_copyMod.m_clipping = 0;
                    289:            h->ph_copyMod.m_source = 1;
                    290:            h->ph_opcode = COPY_AREA;
                    291:            *(long *) h->ph_next = NULL;
                    292: 
                    293:            *(BitMap *) src->sb_base = screen;
                    294:            src->sb_x = srcx;
                    295:            src->sb_y = srcy;
                    296:            size->e_height = num;
                    297:            size->e_width = width;
                    298: 
                    299:            *(caddr_t *)dst->sb_address = (caddr_t) cap +
                    300:                                          sizeof (CopyAreaPacket) +
                    301:                                          VSReloc;
                    302:            dst->sb_height = num;
                    303:            dst->sb_width = width;
                    304:            dst->sb_bitsPerPixel = 1;
                    305:            dst->sb_x = dst->sb_y = 0;
                    306: 
                    307:            WritePacket ((caddr_t) cap);
                    308:            SynchWrites ();
                    309:            if (swapit)
                    310:                Swap_shorts ((short *) ((caddr_t) cap + sizeof (CopyAreaPacket)),
                    311:                             bytes >> 1);
                    312:            Write (client, (caddr_t) cap + sizeof (CopyAreaPacket), bytes);
                    313:            height -= num;
                    314:            srcy += num;
                    315:        }
                    316:        if (slop)
                    317:            Write (client, padding, slop);
                    318: #undef h
                    319: #undef src
                    320: #undef dst
                    321: #undef size
                    322: }

unix.superglobalmegacorp.com

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