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