|
|
1.1 root 1: /* $Header: maskbits.c,v 1.2 87/09/07 19:04:44 rws Exp $ */
2: /***********************************************************
3: Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts,
4: and the Massachusetts Institute of Technology, Cambridge, Massachusetts.
5:
6: All Rights Reserved
7:
8: Permission to use, copy, modify, and distribute this software and its
9: documentation for any purpose and without fee is hereby granted,
10: provided that the above copyright notice appear in all copies and that
11: both that copyright notice and this permission notice appear in
12: supporting documentation, and that the names of Digital or MIT not be
13: used in advertising or publicity pertaining to distribution of the
14: software without specific, written prior permission.
15:
16: DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
17: ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
18: DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
19: ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
20: WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
21: ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
22: SOFTWARE.
23:
24: ******************************************************************/
25: #include "maskbits.h"
26: #include "servermd.h"
27:
28: /*
29: these tables are used by several macros in the mfb code.
30:
31: the vax numbers everything left to right, so bit indices on the
32: screen match bit indices in longwords. the pc-rt and Sun number
33: bits on the screen the way they would be written on paper,
34: (i.e. msb to the left), and so a bit index n on the screen is
35: bit index 32-n in a longword
36:
37: see also maskbits.h
38: */
39:
40: #if (BITMAP_BIT_ORDER == MSBFirst)
41: /* NOTE:
42: the first element in starttab could be 0xffffffff. making it 0
43: lets us deal with a full first word in the middle loop, rather
44: than having to do the multiple reads and masks that we'd
45: have to do if we thought it was partial.
46: */
47: int starttab[32] =
48: {
49: 0x00000000,
50: 0x7FFFFFFF,
51: 0x3FFFFFFF,
52: 0x1FFFFFFF,
53: 0x0FFFFFFF,
54: 0x07FFFFFF,
55: 0x03FFFFFF,
56: 0x01FFFFFF,
57: 0x00FFFFFF,
58: 0x007FFFFF,
59: 0x003FFFFF,
60: 0x001FFFFF,
61: 0x000FFFFF,
62: 0x0007FFFF,
63: 0x0003FFFF,
64: 0x0001FFFF,
65: 0x0000FFFF,
66: 0x00007FFF,
67: 0x00003FFF,
68: 0x00001FFF,
69: 0x00000FFF,
70: 0x000007FF,
71: 0x000003FF,
72: 0x000001FF,
73: 0x000000FF,
74: 0x0000007F,
75: 0x0000003F,
76: 0x0000001F,
77: 0x0000000F,
78: 0x00000007,
79: 0x00000003,
80: 0x00000001
81: };
82:
83: int endtab[32] =
84: {
85: 0x00000000,
86: 0x80000000,
87: 0xC0000000,
88: 0xE0000000,
89: 0xF0000000,
90: 0xF8000000,
91: 0xFC000000,
92: 0xFE000000,
93: 0xFF000000,
94: 0xFF800000,
95: 0xFFC00000,
96: 0xFFE00000,
97: 0xFFF00000,
98: 0xFFF80000,
99: 0xFFFC0000,
100: 0xFFFE0000,
101: 0xFFFF0000,
102: 0xFFFF8000,
103: 0xFFFFC000,
104: 0xFFFFE000,
105: 0xFFFFF000,
106: 0xFFFFF800,
107: 0xFFFFFC00,
108: 0xFFFFFE00,
109: 0xFFFFFF00,
110: 0xFFFFFF80,
111: 0xFFFFFFC0,
112: 0xFFFFFFE0,
113: 0xFFFFFFF0,
114: 0xFFFFFFF8,
115: 0xFFFFFFFC,
116: 0xFFFFFFFE
117: };
118:
119: /* a hack, for now, since the entries for 0 need to be all
120: 1 bits, not all zeros.
121: this means the code DOES NOT WORK for segments of length
122: 0 (which is only a problem in the horizontal line code.)
123: */
124: int startpartial[32] =
125: {
126: 0xFFFFFFFF,
127: 0x7FFFFFFF,
128: 0x3FFFFFFF,
129: 0x1FFFFFFF,
130: 0x0FFFFFFF,
131: 0x07FFFFFF,
132: 0x03FFFFFF,
133: 0x01FFFFFF,
134: 0x00FFFFFF,
135: 0x007FFFFF,
136: 0x003FFFFF,
137: 0x001FFFFF,
138: 0x000FFFFF,
139: 0x0007FFFF,
140: 0x0003FFFF,
141: 0x0001FFFF,
142: 0x0000FFFF,
143: 0x00007FFF,
144: 0x00003FFF,
145: 0x00001FFF,
146: 0x00000FFF,
147: 0x000007FF,
148: 0x000003FF,
149: 0x000001FF,
150: 0x000000FF,
151: 0x0000007F,
152: 0x0000003F,
153: 0x0000001F,
154: 0x0000000F,
155: 0x00000007,
156: 0x00000003,
157: 0x00000001
158: };
159:
160: int endpartial[32] =
161: {
162: 0xFFFFFFFF,
163: 0x80000000,
164: 0xC0000000,
165: 0xE0000000,
166: 0xF0000000,
167: 0xF8000000,
168: 0xFC000000,
169: 0xFE000000,
170: 0xFF000000,
171: 0xFF800000,
172: 0xFFC00000,
173: 0xFFE00000,
174: 0xFFF00000,
175: 0xFFF80000,
176: 0xFFFC0000,
177: 0xFFFE0000,
178: 0xFFFF0000,
179: 0xFFFF8000,
180: 0xFFFFC000,
181: 0xFFFFE000,
182: 0xFFFFF000,
183: 0xFFFFF800,
184: 0xFFFFFC00,
185: 0xFFFFFE00,
186: 0xFFFFFF00,
187: 0xFFFFFF80,
188: 0xFFFFFFC0,
189: 0xFFFFFFE0,
190: 0xFFFFFFF0,
191: 0xFFFFFFF8,
192: 0xFFFFFFFC,
193: 0xFFFFFFFE
194: };
195: #else /* LSBFirst */
196: /* NOTE:
197: the first element in starttab could be 0xffffffff. making it 0
198: lets us deal with a full first word in the middle loop, rather
199: than having to do the multiple reads and masks that we'd
200: have to do if we thought it was partial.
201: */
202: int starttab[32] =
203: {
204: 0x00000000,
205: 0xFFFFFFFE,
206: 0xFFFFFFFC,
207: 0xFFFFFFF8,
208: 0xFFFFFFF0,
209: 0xFFFFFFE0,
210: 0xFFFFFFC0,
211: 0xFFFFFF80,
212: 0xFFFFFF00,
213: 0xFFFFFE00,
214: 0xFFFFFC00,
215: 0xFFFFF800,
216: 0xFFFFF000,
217: 0xFFFFE000,
218: 0xFFFFC000,
219: 0xFFFF8000,
220: 0xFFFF0000,
221: 0xFFFE0000,
222: 0xFFFC0000,
223: 0xFFF80000,
224: 0xFFF00000,
225: 0xFFE00000,
226: 0xFFC00000,
227: 0xFF800000,
228: 0xFF000000,
229: 0xFE000000,
230: 0xFC000000,
231: 0xF8000000,
232: 0xF0000000,
233: 0xE0000000,
234: 0xC0000000,
235: 0x80000000
236: };
237:
238: int endtab[32] =
239: {
240: 0x00000000,
241: 0x00000001,
242: 0x00000003,
243: 0x00000007,
244: 0x0000000F,
245: 0x0000001F,
246: 0x0000003F,
247: 0x0000007F,
248: 0x000000FF,
249: 0x000001FF,
250: 0x000003FF,
251: 0x000007FF,
252: 0x00000FFF,
253: 0x00001FFF,
254: 0x00003FFF,
255: 0x00007FFF,
256: 0x0000FFFF,
257: 0x0001FFFF,
258: 0x0003FFFF,
259: 0x0007FFFF,
260: 0x000FFFFF,
261: 0x001FFFFF,
262: 0x003FFFFF,
263: 0x007FFFFF,
264: 0x00FFFFFF,
265: 0x01FFFFFF,
266: 0x03FFFFFF,
267: 0x07FFFFFF,
268: 0x0FFFFFFF,
269: 0x1FFFFFFF,
270: 0x3FFFFFFF,
271: 0x7FFFFFFF
272: };
273:
274: /* a hack, for now, since the entries for 0 need to be all
275: 1 bits, not all zeros.
276: this means the code DOES NOT WORK for segments of length
277: 0 (which is only a problem in the horizontal line code.)
278: */
279: int startpartial[32] =
280: {
281: 0xFFFFFFFF,
282: 0xFFFFFFFE,
283: 0xFFFFFFFC,
284: 0xFFFFFFF8,
285: 0xFFFFFFF0,
286: 0xFFFFFFE0,
287: 0xFFFFFFC0,
288: 0xFFFFFF80,
289: 0xFFFFFF00,
290: 0xFFFFFE00,
291: 0xFFFFFC00,
292: 0xFFFFF800,
293: 0xFFFFF000,
294: 0xFFFFE000,
295: 0xFFFFC000,
296: 0xFFFF8000,
297: 0xFFFF0000,
298: 0xFFFE0000,
299: 0xFFFC0000,
300: 0xFFF80000,
301: 0xFFF00000,
302: 0xFFE00000,
303: 0xFFC00000,
304: 0xFF800000,
305: 0xFF000000,
306: 0xFE000000,
307: 0xFC000000,
308: 0xF8000000,
309: 0xF0000000,
310: 0xE0000000,
311: 0xC0000000,
312: 0x80000000
313: };
314:
315: int endpartial[32] =
316: {
317: 0xFFFFFFFF,
318: 0x00000001,
319: 0x00000003,
320: 0x00000007,
321: 0x0000000F,
322: 0x0000001F,
323: 0x0000003F,
324: 0x0000007F,
325: 0x000000FF,
326: 0x000001FF,
327: 0x000003FF,
328: 0x000007FF,
329: 0x00000FFF,
330: 0x00001FFF,
331: 0x00003FFF,
332: 0x00007FFF,
333: 0x0000FFFF,
334: 0x0001FFFF,
335: 0x0003FFFF,
336: 0x0007FFFF,
337: 0x000FFFFF,
338: 0x001FFFFF,
339: 0x003FFFFF,
340: 0x007FFFFF,
341: 0x00FFFFFF,
342: 0x01FFFFFF,
343: 0x03FFFFFF,
344: 0x07FFFFFF,
345: 0x0FFFFFFF,
346: 0x1FFFFFFF,
347: 0x3FFFFFFF,
348: 0x7FFFFFFF
349: };
350: #endif
351:
352:
353: /* used for masking bits in bresenham lines
354: mask[n] is used to mask out all but bit n in a longword (n is a
355: screen position).
356: rmask[n] is used to mask out the single bit at position n (n
357: is a screen posiotion.)
358: */
359:
360: #if (BITMAP_BIT_ORDER == MSBFirst)
361: int mask[] =
362: {
363: 1<<31, 1<<30, 1<<29, 1<<28, 1<<27, 1<<26, 1<<25, 1<<24,
364: 1<<23, 1<<22, 1<<21, 1<<20, 1<<19, 1<<18, 1<<17, 1<<16,
365: 1<<15, 1<<14, 1<<13, 1<<12, 1<<11, 1<<10, 1<<9, 1<<8,
366: 1<<7, 1<<6, 1<<5, 1<<4, 1<<3, 1<<2, 1<<1, 1<<0
367: };
368: int rmask[] =
369: {
370: 0xffffffff ^ (1<<31), 0xffffffff ^ (1<<30), 0xffffffff ^ (1<<29),
371: 0xffffffff ^ (1<<28), 0xffffffff ^ (1<<27), 0xffffffff ^ (1<<26),
372: 0xffffffff ^ (1<<25), 0xffffffff ^ (1<<24), 0xffffffff ^ (1<<23),
373: 0xffffffff ^ (1<<22), 0xffffffff ^ (1<<21), 0xffffffff ^ (1<<20),
374: 0xffffffff ^ (1<<19), 0xffffffff ^ (1<<18), 0xffffffff ^ (1<<17),
375: 0xffffffff ^ (1<<16), 0xffffffff ^ (1<<15), 0xffffffff ^ (1<<14),
376: 0xffffffff ^ (1<<13), 0xffffffff ^ (1<<12), 0xffffffff ^ (1<<11),
377: 0xffffffff ^ (1<<10), 0xffffffff ^ (1<<9), 0xffffffff ^ (1<<8),
378: 0xffffffff ^ (1<<7), 0xffffffff ^ (1<<6), 0xffffffff ^ (1<<5),
379: 0xffffffff ^ (1<<4), 0xffffffff ^ (1<<3), 0xffffffff ^ (1<<2),
380: 0xffffffff ^ (1<<1), 0xffffffff ^ (1<<0)
381: };
382: #else /* LSBFirst */
383: int mask[] =
384: {
385: 1<<0, 1<<1, 1<<2, 1<<3, 1<<4, 1<<5, 1<<6, 1<<7,
386: 1<<8, 1<<9, 1<<10, 1<<11, 1<<12, 1<<13, 1<<14, 1<<15,
387: 1<<16, 1<<17, 1<<18, 1<<19, 1<<20, 1<<21, 1<<22, 1<<23,
388: 1<<24, 1<<25, 1<<26, 1<<27, 1<<28, 1<<29, 1<<30, 1<<31
389: };
390: int rmask[] =
391: {
392: 0xffffffff ^ (1<<0), 0xffffffff ^ (1<<1), 0xffffffff ^ (1<<2),
393: 0xffffffff ^ (1<<3), 0xffffffff ^ (1<<4), 0xffffffff ^ (1<<5),
394: 0xffffffff ^ (1<<6), 0xffffffff ^ (1<<7), 0xffffffff ^ (1<<8),
395: 0xffffffff ^ (1<<9), 0xffffffff ^ (1<<10), 0xffffffff ^ (1<<11),
396: 0xffffffff ^ (1<<12), 0xffffffff ^ (1<<13), 0xffffffff ^ (1<<14),
397: 0xffffffff ^ (1<<15), 0xffffffff ^ (1<<16), 0xffffffff ^ (1<<17),
398: 0xffffffff ^ (1<<18), 0xffffffff ^ (1<<19), 0xffffffff ^ (1<<20),
399: 0xffffffff ^ (1<<21), 0xffffffff ^ (1<<22), 0xffffffff ^ (1<<23),
400: 0xffffffff ^ (1<<24), 0xffffffff ^ (1<<25), 0xffffffff ^ (1<<26),
401: 0xffffffff ^ (1<<27), 0xffffffff ^ (1<<28), 0xffffffff ^ (1<<29),
402: 0xffffffff ^ (1<<30), 0xffffffff ^ (1<<31)
403: };
404: #endif
405:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.