|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - downloadIndex: ┃ T b ┃
Length: 10111 (0x277f) Types: TextFile Names: »bitpix.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─ ⟦526ad3590⟧ »EUUGD11/gnu-31mar87/X.V10.R4.tar.Z« └─⟦2109abc41⟧ └─ ⟦this⟧ »./X.V10R4/libis/bitpix.c«
/* * $Source: /u1/X/libis/RCS/bitpix.c,v $ * $Header: bitpix.c,v 1.1 86/11/17 14:33:09 swick Rel $ */ #ifndef lint static char *rcsid_bitpix_c = "$Header: bitpix.c,v 1.1 86/11/17 14:33:09 swick Rel $"; #endif lint #include "is-copyright.h" /* * * StoreBitmap Creates a bitmap * FreeBitmap Frees the storage taken by a bitmap * CharBitmap Creates a bitmap from a font character * StorePixmap Creates a pixmap * FreePixmap Frees the storage taken by a pixmap * MakePixmap Create a pixmap from a bitmap * PixmapSave Save a region of the screen * PixmapGet Read a region of the screen * * Copyright (c) 1986, Integrated Solutions, Inc. */ #include "Xis.h" #include <errno.h> extern int errno; extern char *malloc(); DEVICE *CurrentDevice; PIXMAP *MakePixmap(); /* * StoreBitmap * * Store "data" of dimensions ("width, height") in BITMAP data * structure. * * WARNING: Bits are put into "X" order */ BITMAP *StoreBitmap(width, height, data) int width, height; char *data; { register BITMAP *bm; register RASTER *r; int size; if ((bm = (BITMAP *) malloc(sizeof (BITMAP))) == NULL) { return (NULL); } bm->width = width; bm->height = height; bm->refcnt = 1; if ((r = (RASTER *) malloc(sizeof(RASTER))) == NULL) { free((caddr_t) bm); return (NULL); } bm->data = (caddr_t) r; size = BitmapSize(width, height); if ((r->address = (short *) malloc(size)) == NULL) { free((RASTER *) bm->data); free((caddr_t) bm); return (NULL); } if (data != NULL) { bcopy((char *)data, r->address, size); SwapShorts((short *) r->address, size); SwapBits((short *) r->address, size); } r->width = ((width+15) >>4) << 1; #ifdef DEBUG if (debug & D_Bitmaps) printf("0x%x = StoreBitmap(width=%d, height=%d, data=0x%x)\n", bm, width, height, data); #endif DEBUG return (bm); } /* * FreeBitmap * * Free bitmap data and bitmap structure. */ FreeBitmap(bitmap) register BITMAP *bitmap; { #ifdef DEBUG if (debug & D_Bitmaps) printf("FreeBitmap(bitmap=0x%x)\n", bitmap); #endif DEBUG free (((RASTER *) bitmap->data)->address); free ((caddr_t) bitmap->data); free ((caddr_t) bitmap); } /* * CharBitmap * * Copies a character bitmap from a font */ BITMAP *CharBitmap(c, font) unsigned c; register FONT *font; { int width; register BITMAP *bm; #ifdef DEBUG if (debug & D_Bitmaps) printf("CharBitmap(c='%c', font=0x%x)\n", c, font); #endif DEBUG if (c < font->first || c > font->last) { errno = EINVAL; return (NULL); } if (font->fixed) width = font->avg_width; else width = FDATA(font)->widths[c - font->first]; if (width == 0) { errno = EINVAL; return (NULL); } bm = (BITMAP *) Xalloc(sizeof (BITMAP)); bm->width = width; bm->height = font->height; bm->refcnt = 1; if ((bm->data = (caddr_t)malloc(BitmapSize(width, bm->height))) == NULL) { free((caddr_t) bm); errno = ENOMEM; return (NULL); } CopyText ((caddr_t) &c, 1, font, bm); return (bm); } /* * StorePixmap * * Create a pixmap */ PIXMAP *StorePixmap(width, height, format, data) int width, height, format; char *data; { register PIXMAP *pm; register RASTER *r; int size, i; #ifdef DEBUG if (debug & D_Pixmaps) printf("StorePixmap(width=%d, height=%d, format=%d, data=0x%x)\n", width, height, format, data); #endif DEBUG if (format != XYFormat /* 0 */) { return (NULL); } if ((pm = (PIXMAP *) malloc(sizeof(PIXMAP))) == NULL) { return (NULL); } pm->width = width; pm->height = height; if (width == TILE_WIDTH && height == TILE_HEIGHT) pm->tile = CanBeTiled; else pm->tile = CannotBeTiled; pm->kind = XYFORMAT | CurrentDevice->planes; pm->refcnt = 1; if ((r = (RASTER *) malloc(sizeof(RASTER)*CurrentDevice->planes)) == NULL) { free((caddr_t) pm); return (NULL); } pm->data = (caddr_t) r; size = BitmapSize(width, height); for (i=0; i < CurrentDevice->planes; i++, r++) { if ((r->address = (short *) malloc(size)) == NULL) { while (i--) free((caddr_t) ((--r)->address)); free((caddr_t) pm->data); free((caddr_t) pm); return (NULL); } if (data != NULL) { bcopy((char *)data, r->address, size); data += size; SwapShorts((short *) r->address, size); SwapBits((short *) r->address, size); } r->width = ((width+15) >>4) << 1; } return (pm); } /* FreePixmap * * Frees the storage consumed by the pixmap. */ FreePixmap(pixmap) register PIXMAP *pixmap; { register RASTER* r = (RASTER *)pixmap->data; register int i; #ifdef DEBUG if (debug & D_Pixmaps) printf("FreePixmap(pixmap=0x%x)\n", pixmap); #endif DEBUG for (i=0; i < (pixmap->kind & 0xf); i++, r++) free((caddr_t) r->address); free((caddr_t) pixmap->data); free((caddr_t) pixmap); } /* * MakePixmap * * Make pixmap from bitmap */ static PIXMAP constpix[] = { /* width, height, refcnt, tile, kind, *data */ {1, 1, 1, CanBeTiled, CONSTANT | 4, (caddr_t) 0}, {1, 1, 1, CanBeTiled, CONSTANT | 4, (caddr_t) 1}, {1, 1, 1, CanBeTiled, CONSTANT | 4, (caddr_t) 2}, {1, 1, 1, CanBeTiled, CONSTANT | 4, (caddr_t) 3}, {1, 1, 1, CanBeTiled, CONSTANT | 4, (caddr_t) 4}, {1, 1, 1, CanBeTiled, CONSTANT | 4, (caddr_t) 5}, {1, 1, 1, CanBeTiled, CONSTANT | 4, (caddr_t) 6}, {1, 1, 1, CanBeTiled, CONSTANT | 4, (caddr_t) 7}, {1, 1, 1, CanBeTiled, CONSTANT | 4, (caddr_t) 8}, {1, 1, 1, CanBeTiled, CONSTANT | 4, (caddr_t) 9}, {1, 1, 1, CanBeTiled, CONSTANT | 4, (caddr_t) 10}, {1, 1, 1, CanBeTiled, CONSTANT | 4, (caddr_t) 11}, {1, 1, 1, CanBeTiled, CONSTANT | 4, (caddr_t) 12}, {1, 1, 1, CanBeTiled, CONSTANT | 4, (caddr_t) 13}, {1, 1, 1, CanBeTiled, CONSTANT | 4, (caddr_t) 14}, {1, 1, 1, CanBeTiled, CONSTANT | 4, (caddr_t) 15}, }; PIXMAP *MakePixmap(xymask, fore, back) register BITMAP *xymask; int fore, back; { register PIXMAP *pm = NULL; register RASTER* r; register int i, size; #ifdef DEBUG int sfore=fore, sback=back; #endif DEBUG if (xymask == NULL) { pm = &constpix[fore & 0xf]; pm->refcnt++; #ifdef DEBUG if (debug & D_Pixmaps) printf("0x%x = MakePixmap(xymask=0x%x, fore=%d, back=%d)\n", pm, xymask, fore, back); #endif DEBUG return (pm); } pm = (PIXMAP *) Xalloc(sizeof(PIXMAP)); pm->width = xymask->width; pm->height = xymask->height; pm->refcnt = 1; if (xymask->width == TILE_WIDTH && xymask->height == TILE_HEIGHT) pm->tile = CanBeTiled; else pm->tile = CannotBeTiled; pm->kind = XYFORMAT | CurrentDevice->planes; r = (RASTER *) Xalloc(sizeof(RASTER) * CurrentDevice->planes); pm->data = (caddr_t) r; for (i=0; i < CurrentDevice->planes; i++, r++) { size = BitmapSize(pm->width, pm->height); r->address = (short *) Xalloc(size); r->width = ((pm->width+15) >> 4) << 1; if (fore & 1) { if (back & 1) { /* foreground and background are 1 */ /* set to ~0; mask does not matter */ register short *d, *limitd; d = r->address; limitd = d + (size>>1); for ( ; d < limitd; ) *d++ = ~0; } else { /* foreground is 1 and background is 0 */ /* set to mask */ bcopy(((RASTER *)(xymask->data))->address, r->address, size); } } else { if (back & 1) { /* foreground is 0 and background is 1 */ /* set to inverted mask */ register short *s, *d, *limitd; s = ((RASTER *)(xymask->data))->address; d = r->address; limitd = d + (size>>1); for ( ; d < limitd; ) *d++ = ~*s++; } else { /* foreground and background are 0 */ /* set to 0; mask does not matter */ register short *d, *limitd; d = r->address; limitd = d + (size>>1); for ( ; d < limitd; ) *d++ = 0; } } fore >>= 1; back >>= 1; } #ifdef DEBUG if (debug & D_Pixmaps) printf("0x%x = MakePixmap(xymask=0x%x, fore=%d, back=%d)\n", pm, xymask, sfore, sback); #endif DEBUG return (pm); } /* * PixmapSave * * Save a region of the screen */ PIXMAP *PixmapSave(srcx, srcy, width, height) register int srcx, srcy, width, height; { register PIXMAP *pm = NULL; register RASTER *r; register int i; CLIP bounds; #ifdef DEBUG if (debug & D_Pixmaps) printf("PixmapSave(srcx=%d, srcy=%d, width=%d, height=%d)\n", srcx, srcy, width, height); #endif DEBUG bounds.top = srcy; bounds.left = srcx; bounds.width = width; bounds.height = height; pm = (PIXMAP *) Xalloc(sizeof(PIXMAP)); pm->width = width; pm->height = height; pm->refcnt = 1; if (width == TILE_WIDTH && height == TILE_HEIGHT) pm->tile = CanBeTiled; else pm->tile = CannotBeTiled; pm->kind = XYFORMAT | CurrentDevice->planes; r = (RASTER *) Xalloc(sizeof(RASTER) * CurrentDevice->planes); pm->data = (caddr_t) r; for (i=0; i < CurrentDevice->planes; r++, i++) { r->address = (short *) Xalloc(BitmapSize(width, height)); r->width = ((width+15) >> 4) << 1; } CheckCursor(bounds); GIP_RasterOp(GIPcopy, &ScreenPixmap, srcx, srcy, pm, 0, 0, (BITMAP *)NULL, 0, 0, width, height, ~0); RestoreCursor(); return (pm); } /* * PixmapGet * * */ PixmapGet(srcx, srcy, width, height, client, format, swapit) int srcx, srcy, width, height, client, format, swapit; { PIXMAP *pm; register RASTER *r; register int size = BitmapSize(width, height); register int i; #ifdef DEBUG if (debug & D_Pixmaps) printf("PixmapGet(srcx=%d, srcy=%d, width=%d, height=%d, client=%d, format=%d, swapit=%d)\n", srcx, srcy, width, height, client, format, swapit); #endif DEBUG pm = PixmapSave(srcx, srcy, width, height); r = (RASTER *) pm->data; for (i=0; i< CurrentDevice->planes; i++, r++) { SwapBits(r->address, size); if (!swapit) /* our bitmaps need swapping just VAX (un)normal */ Swap_shorts((short *) r->address, size >> 1); Write(client, r->address, size); } /* Pad amount written to 32-bit boundary */ if ((size*CurrentDevice->planes)%4) { Write(client, r->address, 4 - ((size*CurrentDevice->planes)%4)); } FreePixmap(pm); }