Annotation of 43BSDTahoe/new/X/libis/bitpix.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  *     $Source: /u1/X/libis/RCS/bitpix.c,v $
                      3:  *     $Header: bitpix.c,v 1.1 86/11/17 14:33:09 swick Rel $
                      4:  */
                      5: 
                      6: #ifndef lint
                      7: static char *rcsid_bitpix_c = "$Header: bitpix.c,v 1.1 86/11/17 14:33:09 swick Rel $";
                      8: #endif lint
                      9: 
                     10: #include "is-copyright.h"
                     11: 
                     12: /*
                     13:  *
                     14:  *     StoreBitmap     Creates a bitmap
                     15:  *     FreeBitmap      Frees the storage taken by a bitmap
                     16:  *     CharBitmap      Creates a bitmap from a font character
                     17:  *     StorePixmap     Creates a pixmap
                     18:  *     FreePixmap      Frees the storage taken by a pixmap
                     19:  *     MakePixmap      Create a pixmap from a bitmap
                     20:  *     PixmapSave      Save a region of the screen
                     21:  *     PixmapGet       Read a region of the screen
                     22:  *
                     23:  *     Copyright (c) 1986, Integrated Solutions, Inc.
                     24:  */
                     25: 
                     26: #include "Xis.h"
                     27: #include <errno.h>
                     28: 
                     29: extern int errno;
                     30: extern char *malloc();
                     31: 
                     32: DEVICE *CurrentDevice;
                     33: 
                     34: PIXMAP *MakePixmap();
                     35: 
                     36: /*
                     37:  *     StoreBitmap
                     38:  *
                     39:  *     Store "data" of dimensions ("width, height") in BITMAP data
                     40:  *     structure.
                     41:  *
                     42:  *     WARNING: Bits are put into "X" order
                     43:  */
                     44: BITMAP *StoreBitmap(width, height, data)
                     45: int    width, height;
                     46: char   *data;
                     47: {
                     48:     register BITMAP *bm;
                     49:     register RASTER *r;
                     50:     int size;
                     51: 
                     52:     if ((bm = (BITMAP *) malloc(sizeof (BITMAP))) == NULL) {
                     53:        return (NULL);
                     54:     }
                     55:     bm->width = width;
                     56:     bm->height = height;
                     57:     bm->refcnt = 1;
                     58: 
                     59:     if ((r = (RASTER *) malloc(sizeof(RASTER))) == NULL) {
                     60:        free((caddr_t) bm);
                     61:        return (NULL);
                     62:     }
                     63:     bm->data = (caddr_t) r;
                     64: 
                     65:     size = BitmapSize(width, height);
                     66:     if ((r->address = (short *) malloc(size)) == NULL) {
                     67:        free((RASTER *) bm->data);
                     68:        free((caddr_t) bm);
                     69:        return (NULL);
                     70:     }
                     71: 
                     72:     if (data != NULL) {
                     73:        bcopy((char *)data, r->address, size);
                     74:        SwapShorts((short *) r->address, size);
                     75:        SwapBits((short *) r->address, size);
                     76:     }
                     77:     r->width = ((width+15) >>4) << 1;
                     78: 
                     79: #ifdef DEBUG
                     80: if (debug & D_Bitmaps)
                     81:     printf("0x%x = StoreBitmap(width=%d, height=%d, data=0x%x)\n",
                     82:        bm, width, height, data);
                     83: #endif DEBUG
                     84: 
                     85:     return (bm);
                     86: }
                     87: 
                     88: /*
                     89:  *     FreeBitmap
                     90:  *
                     91:  *     Free bitmap data and bitmap structure.
                     92:  */
                     93: FreeBitmap(bitmap)
                     94: register BITMAP        *bitmap;
                     95: {
                     96: 
                     97: #ifdef DEBUG
                     98: if (debug & D_Bitmaps)
                     99:     printf("FreeBitmap(bitmap=0x%x)\n", bitmap);
                    100: #endif DEBUG
                    101: 
                    102:     free (((RASTER *) bitmap->data)->address);
                    103:     free ((caddr_t) bitmap->data);
                    104:     free ((caddr_t) bitmap);
                    105: }
                    106: 
                    107: /*
                    108:  *     CharBitmap
                    109:  *
                    110:  *     Copies a character bitmap from a font
                    111:  */
                    112: BITMAP *CharBitmap(c, font)
                    113: unsigned       c;
                    114: register FONT  *font;
                    115: {
                    116:     int width;
                    117:     register BITMAP *bm;
                    118: 
                    119: #ifdef DEBUG
                    120: if (debug & D_Bitmaps)
                    121:     printf("CharBitmap(c='%c', font=0x%x)\n", c, font);
                    122: #endif DEBUG
                    123: 
                    124:     if (c < font->first || c > font->last) {
                    125:        errno = EINVAL;
                    126:        return (NULL);
                    127:     }
                    128: 
                    129:     if (font->fixed)
                    130:        width = font->avg_width;
                    131:     else
                    132:        width = FDATA(font)->widths[c - font->first];
                    133: 
                    134:     if (width == 0) {
                    135:        errno = EINVAL;
                    136:        return (NULL);
                    137:     }
                    138: 
                    139:     bm = (BITMAP *) Xalloc(sizeof (BITMAP));
                    140:     bm->width = width;
                    141:     bm->height = font->height;
                    142:     bm->refcnt = 1;
                    143:     if ((bm->data = (caddr_t)malloc(BitmapSize(width, bm->height))) == NULL) {
                    144:        free((caddr_t) bm);
                    145:        errno = ENOMEM;
                    146:        return (NULL);
                    147:     }
                    148: 
                    149:     CopyText ((caddr_t) &c, 1, font, bm);
                    150:     return (bm);
                    151: }
                    152: 
                    153: /*
                    154:  *     StorePixmap
                    155:  *
                    156:  *     Create a pixmap
                    157:  */
                    158: PIXMAP *StorePixmap(width, height, format, data)
                    159: int    width, height, format;
                    160: char   *data;
                    161: {
                    162:     register PIXMAP *pm;
                    163:     register RASTER *r;
                    164:     int size, i;
                    165: 
                    166: #ifdef DEBUG
                    167: if (debug & D_Pixmaps)
                    168:     printf("StorePixmap(width=%d, height=%d, format=%d, data=0x%x)\n",
                    169:        width, height, format, data);
                    170: #endif DEBUG
                    171: 
                    172:     if (format != XYFormat /* 0 */) {
                    173:        return (NULL);
                    174:     }
                    175:     if ((pm = (PIXMAP *) malloc(sizeof(PIXMAP))) == NULL) {
                    176:        return (NULL);
                    177:     }
                    178:     pm->width = width;
                    179:     pm->height = height;
                    180:     if (width == TILE_WIDTH && height == TILE_HEIGHT)
                    181:        pm->tile = CanBeTiled;
                    182:     else
                    183:        pm->tile = CannotBeTiled;
                    184:     pm->kind = XYFORMAT | CurrentDevice->planes;
                    185:     pm->refcnt = 1;
                    186: 
                    187:     if ((r = (RASTER *) malloc(sizeof(RASTER)*CurrentDevice->planes)) == NULL) {
                    188:        free((caddr_t) pm);
                    189:        return (NULL);
                    190:     }
                    191:     pm->data = (caddr_t) r;
                    192:     size = BitmapSize(width, height);
                    193: 
                    194:     for (i=0; i < CurrentDevice->planes; i++, r++) {
                    195: 
                    196:        if ((r->address = (short *) malloc(size)) == NULL) {
                    197:            while (i--)
                    198:                free((caddr_t) ((--r)->address));
                    199:            free((caddr_t) pm->data);
                    200:            free((caddr_t) pm);
                    201:            return (NULL);
                    202:        }
                    203: 
                    204:        if (data != NULL) {
                    205:            bcopy((char *)data, r->address, size);
                    206:            data += size;
                    207:            SwapShorts((short *) r->address, size);
                    208:            SwapBits((short *) r->address, size);
                    209:        }
                    210: 
                    211:        r->width = ((width+15) >>4) << 1;
                    212:     }
                    213: 
                    214:     return (pm);
                    215: }
                    216: 
                    217: /* FreePixmap
                    218:  *
                    219:  *     Frees the storage consumed by the pixmap.
                    220:  */
                    221: FreePixmap(pixmap)
                    222: register PIXMAP        *pixmap;
                    223: {
                    224:     register RASTER*   r = (RASTER *)pixmap->data;
                    225:     register int       i;
                    226: 
                    227: #ifdef DEBUG
                    228: if (debug & D_Pixmaps)
                    229:     printf("FreePixmap(pixmap=0x%x)\n", pixmap);
                    230: #endif DEBUG
                    231: 
                    232:     for (i=0; i < (pixmap->kind & 0xf); i++, r++)
                    233:        free((caddr_t) r->address);
                    234:     free((caddr_t) pixmap->data);
                    235:     free((caddr_t) pixmap);
                    236: }
                    237: 
                    238: /*
                    239:  *     MakePixmap
                    240:  *
                    241:  *     Make pixmap from bitmap
                    242:  */
                    243: static PIXMAP constpix[] = {
                    244:     /* width, height, refcnt, tile, kind, *data */
                    245:     {1, 1, 1, CanBeTiled, CONSTANT | 4,        (caddr_t) 0},
                    246:     {1, 1, 1, CanBeTiled, CONSTANT | 4, (caddr_t) 1},
                    247:     {1, 1, 1, CanBeTiled, CONSTANT | 4, (caddr_t) 2},
                    248:     {1, 1, 1, CanBeTiled, CONSTANT | 4, (caddr_t) 3},
                    249:     {1, 1, 1, CanBeTiled, CONSTANT | 4, (caddr_t) 4},
                    250:     {1, 1, 1, CanBeTiled, CONSTANT | 4, (caddr_t) 5},
                    251:     {1, 1, 1, CanBeTiled, CONSTANT | 4, (caddr_t) 6},
                    252:     {1, 1, 1, CanBeTiled, CONSTANT | 4, (caddr_t) 7},
                    253:     {1, 1, 1, CanBeTiled, CONSTANT | 4, (caddr_t) 8},
                    254:     {1, 1, 1, CanBeTiled, CONSTANT | 4, (caddr_t) 9},
                    255:     {1, 1, 1, CanBeTiled, CONSTANT | 4, (caddr_t) 10},
                    256:     {1, 1, 1, CanBeTiled, CONSTANT | 4, (caddr_t) 11},
                    257:     {1, 1, 1, CanBeTiled, CONSTANT | 4, (caddr_t) 12},
                    258:     {1, 1, 1, CanBeTiled, CONSTANT | 4, (caddr_t) 13},
                    259:     {1, 1, 1, CanBeTiled, CONSTANT | 4, (caddr_t) 14},
                    260:     {1, 1, 1, CanBeTiled, CONSTANT | 4, (caddr_t) 15},
                    261: };
                    262: 
                    263: PIXMAP *MakePixmap(xymask, fore, back)
                    264: register BITMAP        *xymask;
                    265: int            fore, back;
                    266: {
                    267:     register PIXMAP *pm = NULL;
                    268:     register RASTER* r;
                    269:     register int i, size;
                    270: #ifdef DEBUG
                    271: int            sfore=fore, sback=back;
                    272: #endif DEBUG
                    273: 
                    274:     if (xymask == NULL) {
                    275:        pm = &constpix[fore & 0xf];
                    276:        pm->refcnt++;
                    277: #ifdef DEBUG
                    278: if (debug & D_Pixmaps)
                    279:     printf("0x%x = MakePixmap(xymask=0x%x, fore=%d, back=%d)\n",
                    280:        pm, xymask, fore, back);
                    281: #endif DEBUG
                    282:        return (pm);
                    283:     }
                    284: 
                    285:     pm = (PIXMAP *) Xalloc(sizeof(PIXMAP));
                    286:     pm->width = xymask->width;
                    287:     pm->height = xymask->height;
                    288:     pm->refcnt = 1;
                    289:     if (xymask->width == TILE_WIDTH && xymask->height == TILE_HEIGHT)
                    290:        pm->tile = CanBeTiled;
                    291:     else
                    292:        pm->tile = CannotBeTiled;
                    293:     pm->kind = XYFORMAT | CurrentDevice->planes;
                    294:     r = (RASTER *) Xalloc(sizeof(RASTER) * CurrentDevice->planes);
                    295:     pm->data = (caddr_t) r;
                    296: 
                    297:     for (i=0; i < CurrentDevice->planes; i++, r++) {
                    298: 
                    299:        size = BitmapSize(pm->width, pm->height);
                    300:        r->address = (short *) Xalloc(size);
                    301:        r->width = ((pm->width+15) >> 4) << 1;
                    302: 
                    303:        if (fore & 1) {
                    304:            if (back & 1) {
                    305:                /* foreground and background are 1 */
                    306:                /* set to ~0; mask does not matter */
                    307:                register short *d, *limitd;
                    308:                d = r->address;
                    309:                limitd = d + (size>>1);
                    310:                for ( ; d < limitd; )
                    311:                    *d++ = ~0;
                    312:            } else {
                    313:                /* foreground is 1 and background is 0 */
                    314:                /* set to mask */
                    315:                bcopy(((RASTER *)(xymask->data))->address, r->address, size);
                    316:            }
                    317:        } else {
                    318:            if (back & 1) {
                    319:                /* foreground is 0 and background is 1 */
                    320:                /* set to inverted mask */
                    321:                register short *s, *d, *limitd;
                    322:                s = ((RASTER *)(xymask->data))->address;
                    323:                d = r->address;
                    324:                limitd = d + (size>>1);
                    325:                for ( ; d < limitd; )
                    326:                    *d++ = ~*s++;
                    327:            } else {
                    328:                /* foreground and background are 0 */
                    329:                /* set to 0; mask does not matter */
                    330:                register short *d, *limitd;
                    331:                d = r->address;
                    332:                limitd = d + (size>>1);
                    333:                for ( ; d < limitd; )
                    334:                    *d++ = 0;
                    335:            }
                    336:        }
                    337:        fore >>= 1;
                    338:        back >>= 1;
                    339:     }
                    340: 
                    341: #ifdef DEBUG
                    342: if (debug & D_Pixmaps)
                    343:     printf("0x%x = MakePixmap(xymask=0x%x, fore=%d, back=%d)\n",
                    344:        pm, xymask, sfore, sback);
                    345: #endif DEBUG
                    346: 
                    347:     return (pm);
                    348: }
                    349: 
                    350: /*
                    351:  *     PixmapSave
                    352:  *
                    353:  *     Save a region of the screen
                    354:  */
                    355: PIXMAP *PixmapSave(srcx, srcy, width, height)
                    356: register int   srcx, srcy, width, height;
                    357: {
                    358:     register PIXMAP    *pm = NULL;
                    359:     register RASTER     *r;
                    360:     register int       i;
                    361:     CLIP               bounds;
                    362: 
                    363: #ifdef DEBUG
                    364: if (debug & D_Pixmaps)
                    365:     printf("PixmapSave(srcx=%d, srcy=%d, width=%d, height=%d)\n",
                    366:        srcx, srcy, width, height);
                    367: #endif DEBUG
                    368: 
                    369:     bounds.top = srcy;
                    370:     bounds.left = srcx;
                    371:     bounds.width = width;
                    372:     bounds.height = height;
                    373:     pm = (PIXMAP *) Xalloc(sizeof(PIXMAP));
                    374:     pm->width = width;
                    375:     pm->height = height;
                    376:     pm->refcnt = 1;
                    377:     if (width == TILE_WIDTH && height == TILE_HEIGHT)
                    378:        pm->tile = CanBeTiled;
                    379:     else
                    380:        pm->tile = CannotBeTiled;
                    381:     pm->kind = XYFORMAT | CurrentDevice->planes;
                    382:     r = (RASTER *) Xalloc(sizeof(RASTER) * CurrentDevice->planes);
                    383:     pm->data = (caddr_t) r;
                    384: 
                    385:     for (i=0; i < CurrentDevice->planes; r++, i++) {
                    386:        r->address = (short *) Xalloc(BitmapSize(width, height));
                    387:        r->width = ((width+15) >> 4) << 1;
                    388:     }
                    389:     CheckCursor(bounds);
                    390:     GIP_RasterOp(GIPcopy,
                    391:        &ScreenPixmap, srcx, srcy,
                    392:        pm, 0, 0,
                    393:        (BITMAP *)NULL, 0, 0,
                    394:        width, height,
                    395:        ~0);
                    396:     RestoreCursor();
                    397:     return (pm);
                    398: }
                    399: 
                    400: /*
                    401:  *     PixmapGet
                    402:  *
                    403:  *
                    404:  */
                    405: PixmapGet(srcx, srcy, width, height, client, format, swapit)
                    406: int    srcx, srcy, width, height, client, format, swapit;
                    407: {
                    408:     PIXMAP             *pm;
                    409:     register RASTER    *r;
                    410:     register int       size = BitmapSize(width, height);
                    411:     register int       i;
                    412: 
                    413: #ifdef DEBUG
                    414: if (debug & D_Pixmaps)
                    415:     printf("PixmapGet(srcx=%d, srcy=%d, width=%d, height=%d, client=%d, format=%d, swapit=%d)\n",
                    416:        srcx, srcy, width, height, client, format, swapit);
                    417: #endif DEBUG
                    418: 
                    419:     pm = PixmapSave(srcx, srcy, width, height);
                    420: 
                    421:     r = (RASTER *) pm->data;
                    422:     for (i=0; i< CurrentDevice->planes; i++, r++) {
                    423:        SwapBits(r->address, size);
                    424:        if (!swapit) /* our bitmaps need swapping just VAX (un)normal */
                    425:            Swap_shorts((short *) r->address, size >> 1);
                    426:        Write(client, r->address, size);
                    427:     }
                    428:     /* Pad amount written to 32-bit boundary */
                    429:     if ((size*CurrentDevice->planes)%4) {
                    430:        Write(client, r->address, 4 - ((size*CurrentDevice->planes)%4));
                    431:     }
                    432: 
                    433:     FreePixmap(pm);
                    434: }

unix.superglobalmegacorp.com

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