|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.