|
|
1.1 ! root 1: /* $Header: put.c,v 10.3 86/02/01 15:47:24 tony Rel $ */ ! 2: /* put.c Perform a raster operation with a source bitmap ! 3: * ! 4: * PixmapPut Puts a pixmap up on the screen ! 5: * PixmapBitsPut Puts a pixmap up on the screen ! 6: * BitmapBitsPut Puts a pixmap up on the screen ! 7: * ! 8: */ ! 9: ! 10: /**************************************************************************** ! 11: * * ! 12: * Copyright (c) 1983, 1984 by * ! 13: * DIGITAL EQUIPMENT CORPORATION, Maynard, Massachusetts. * ! 14: * All rights reserved. * ! 15: * * ! 16: * This software is furnished on an as-is basis and may be used and copied * ! 17: * only with inclusion of the above copyright notice. This software or any * ! 18: * other copies thereof may be provided or otherwise made available to * ! 19: * others only for non-commercial purposes. No title to or ownership of * ! 20: * the software is hereby transferred. * ! 21: * * ! 22: * The information in this software is subject to change without notice * ! 23: * and should not be construed as a commitment by DIGITAL EQUIPMENT * ! 24: * CORPORATION. * ! 25: * * ! 26: * DIGITAL assumes no responsibility for the use or reliability of its * ! 27: * software on equipment which is not supplied by DIGITAL. * ! 28: * * ! 29: * * ! 30: ****************************************************************************/ ! 31: ! 32: #include "vs100.h" ! 33: ! 34: extern BitMap screen; ! 35: extern int VSReloc; ! 36: extern char FBMap[]; ! 37: extern char SSMap[]; ! 38: ! 39: char *AllocateSpace(), *AllocateCopy(), *Xalloc(); ! 40: ! 41: PixmapPut (src, srcx, srcy, width, height, dstx, dsty, clips, clipcount, ! 42: func, zmask) ! 43: PIXMAP *src; ! 44: int srcx, srcy, width, height, dstx, dsty, clipcount, zmask; ! 45: register int func; ! 46: CLIP *clips; ! 47: { ! 48: register CopyAreaPacket *cap; ! 49: #define h ((PacketHeader *) cap->cap_head) ! 50: #define img ((SubBitmap *) cap->cap_source.image) ! 51: #define pat ((Halftone *) cap->cap_source.pattern) ! 52: #define size ((Extent *) cap->cap_maskSize) ! 53: #define destOff ((Point *) cap->cap_destOffset) ! 54: #define clip ((RectangleList *) cap->cap_clipping.rectList) ! 55: ! 56: if (!(zmask & 1)) { ! 57: DeallocateSpace (); ! 58: return; ! 59: } ! 60: cap = (CopyAreaPacket *) AllocateSpace (sizeof (CopyAreaPacket)); ! 61: if (cap == NULL) return; ! 62: ! 63: func = SSMap[func | (src->kind & 0x10)]; ! 64: h->ph_copyMod.m_mask = 0; ! 65: h->ph_copyMod.m_map = MAPTYPE(func); ! 66: h->ph_opcode = COPY_AREA; ! 67: *(long *) h->ph_next = NULL; ! 68: ! 69: if (src->kind == 0) { ! 70: h->ph_copyMod.m_source = 0; ! 71: cap->cap_source.const = (int) src->data; ! 72: } else { ! 73: h->ph_copyMod.m_source = 1; ! 74: #ifdef HTCROCK ! 75: if (src->kind & 2) ! 76: *(caddr_t *) img->sb_address = BDATA(TDATA(src)->bitmap)->vsPtr; ! 77: else ! 78: #endif ! 79: *(caddr_t *) img->sb_address = BDATA(PDATA(src))->vsPtr; ! 80: img->sb_height = src->height; ! 81: img->sb_width = src->width; ! 82: img->sb_bitsPerPixel = 1; ! 83: img->sb_x = srcx; ! 84: img->sb_y = srcy; ! 85: } ! 86: ! 87: size->e_height = height; ! 88: size->e_width = width; ! 89: ! 90: *(BitMap *) cap->cap_destImage = screen; ! 91: destOff->p_x = dstx; ! 92: destOff->p_y = dsty; ! 93: ! 94: *(long *) cap->cap_map.literal = MAPLIT(func); ! 95: ! 96: if (clipcount == 1) { ! 97: h->ph_copyMod.m_clipping = 1; ! 98: *(CLIP *) cap->cap_clipping.litRect = *clips; ! 99: } else { ! 100: h->ph_copyMod.m_clipping = 2; ! 101: *(caddr_t *) clip->r_first = (caddr_t) clips + VSReloc; ! 102: clip->r_count = clipcount; ! 103: } ! 104: ! 105: WritePacket ((caddr_t) cap); ! 106: #undef h ! 107: #undef img ! 108: #undef pat ! 109: #undef size ! 110: #undef destOff ! 111: #undef clip ! 112: } ! 113: ! 114: ! 115: /*ARGSUSED*/ ! 116: PixmapBitsPut (width, height, format, data, xymask, dstx, dsty, ! 117: clips, clipcount, func, zmask) ! 118: char *data; ! 119: int width, height, format, dstx, dsty, clipcount, zmask; ! 120: BITMAP *xymask; ! 121: CLIP *clips; ! 122: int func; ! 123: { ! 124: BitmapBitsPut (width, height, data, 1, 0, xymask, dstx, dsty, ! 125: clips, clipcount, func, zmask); ! 126: } ! 127: ! 128: ! 129: BitmapBitsPut (width, height, data, fore, back, xymask, dstx, dsty, ! 130: clips, clipcount, func, zmask) ! 131: char *data; ! 132: int width, height, fore, back, dstx, dsty, clipcount, zmask; ! 133: register BITMAP *xymask; ! 134: CLIP *clips; ! 135: register int func; ! 136: { ! 137: register CopyAreaPacket *cap; ! 138: #define h ((PacketHeader *) cap->cap_head) ! 139: #define src ((SubBitmap *) cap->cap_source.image) ! 140: #define pat ((Halftone *) cap->cap_source.pattern) ! 141: #define size ((Extent *) cap->cap_maskSize) ! 142: #define mask ((SubBitmap *) cap->cap_sourceMask) ! 143: #define destOff ((Point *) cap->cap_destOffset) ! 144: #define clip ((RectangleList *) cap->cap_clipping.rectList) ! 145: caddr_t bits; ! 146: char *boxes = NULL; ! 147: CLIP clip1; ! 148: int width1, num, boxbytes, bytes; ! 149: ! 150: if (!(zmask & 1)) { ! 151: DeallocateSpace (); ! 152: return; ! 153: } ! 154: if (fore & 1) ! 155: func += 0x20; ! 156: if (back & 1) ! 157: func += 0x10; ! 158: func = FBMap[func]; ! 159: ! 160: width1 = BitmapSize(width, 1); ! 161: num = VBUFSIZE / width1; ! 162: if (height > num) { ! 163: if (clipcount == 1) { ! 164: clip1 = *clips; ! 165: clips = &clip1; ! 166: } else { ! 167: boxbytes = sizeof (CLIP) * clipcount; ! 168: boxes = Xalloc (boxbytes); ! 169: bcopy ((caddr_t) clips, boxes, boxbytes); ! 170: DeallocateSpace (); ! 171: } ! 172: } ! 173: ! 174: while (height) { ! 175: if (height < num) ! 176: num = height; ! 177: bytes = num * width1; ! 178: if ((bits = (caddr_t) AllocateCopy (data, bytes)) == NULL || ! 179: (boxes && (clips = (CLIP *) AllocateCopy (boxes, boxbytes)) == NULL) || ! 180: (cap = (CopyAreaPacket *) AllocateSpace (sizeof (CopyAreaPacket))) == NULL) ! 181: break; ! 182: ! 183: h->ph_copyMod.m_source = 1; ! 184: h->ph_copyMod.m_mask = xymask ? 1 : 0; ! 185: h->ph_copyMod.m_map = MAPTYPE(func); ! 186: h->ph_opcode = COPY_AREA; ! 187: *(long *) h->ph_next = NULL; ! 188: ! 189: *(caddr_t *) src->sb_address = bits + VSReloc; ! 190: src->sb_height = num; ! 191: src->sb_width = width; ! 192: src->sb_bitsPerPixel = 1; ! 193: src->sb_x = src->sb_y = 0; ! 194: ! 195: if (xymask) { ! 196: *(caddr_t *) mask->sb_address = BDATA(xymask)->vsPtr; ! 197: mask->sb_height = xymask->height; ! 198: mask->sb_width = xymask->width; ! 199: mask->sb_bitsPerPixel = 1; ! 200: mask->sb_x = mask->sb_y = 0; ! 201: } ! 202: size->e_height = num; ! 203: size->e_width = width; ! 204: ! 205: *(BitMap *) cap->cap_destImage = screen; ! 206: destOff->p_x = dstx; ! 207: destOff->p_y = dsty; ! 208: ! 209: *(long *) cap->cap_map.literal = MAPLIT(func); ! 210: ! 211: if (clipcount == 1) { ! 212: h->ph_copyMod.m_clipping = 1; ! 213: *(CLIP *) cap->cap_clipping.litRect = *clips; ! 214: } else { ! 215: h->ph_copyMod.m_clipping = 2; ! 216: *(caddr_t *) clip->r_first = (caddr_t) clips + VSReloc; ! 217: clip->r_count = clipcount; ! 218: } ! 219: ! 220: WritePacket ((caddr_t) cap); ! 221: height -= num; ! 222: dsty += num; ! 223: data += bytes; ! 224: } ! 225: if (boxes) ! 226: free (boxes); ! 227: #undef h ! 228: #undef src ! 229: #undef pat ! 230: #undef size ! 231: #undef mask ! 232: #undef destOff ! 233: #undef clip ! 234: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.