|
|
1.1 root 1: /***********************************************************
2: Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts,
3: and the Massachusetts Institute of Technology, Cambridge, Massachusetts.
4:
5: All Rights Reserved
6:
7: Permission to use, copy, modify, and distribute this software and its
8: documentation for any purpose and without fee is hereby granted,
9: provided that the above copyright notice appear in all copies and that
10: both that copyright notice and this permission notice appear in
11: supporting documentation, and that the names of Digital or MIT not be
12: used in advertising or publicity pertaining to distribution of the
13: software without specific, written prior permission.
14:
15: DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
16: ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
17: DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
18: ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
19: WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
20: ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
21: SOFTWARE.
22:
23: ******************************************************************/
24: /* $Header: mfbbres.c,v 1.11 87/09/11 07:48:29 toddb Exp $ */
25: #include "X.h"
26: #include "misc.h"
27: #include "mfb.h"
28: #include "maskbits.h"
29:
30: /* Solid bresenham line */
31: /* NOTES
32: e2 is used less often than e1, so it's not in a register
33: */
34:
35: mfbBresS(rop, addrl, nlwidth, signdx, signdy, axis, x1, y1, e, e1, e2, len)
36: int rop; /* a reduced rasterop */
37: register int *addrl; /* pointer to base of bitmap */
38: int nlwidth; /* width in longwords of bitmap */
39: int signdx, signdy; /* signs of directions */
40: int axis; /* major axis (Y_AXIS or X_AXIS) */
41: int x1, y1; /* initial point */
42: register int e; /* error accumulator */
43: register int e1; /* bresenham increments */
44: int e2;
45: register int len; /* length of line */
46: {
47:
48: register int yinc; /* increment to next scanline */
49: register int addrb; /* bitmask */
50:
51: /* point to longword containing first point */
52: addrl = addrl + (y1 * nlwidth) + (x1 >> 5);
53: addrb = x1&0x1f;
54: yinc = signdy * nlwidth;
55:
56: if (rop == RROP_BLACK)
57: {
58: if (axis == X_AXIS)
59: {
60: if (signdx > 0)
61: {
62: while(len--)
63: {
64: *addrl &= rmask[addrb];
65: if (e < 0)
66: e += e1;
67: else
68: {
69: addrl += yinc;
70: e += e2;
71: }
72: if (addrb == 31)
73: {
74: addrb = -1;
75: addrl++;
76: }
77: addrb++;
78: }
79: }
80: else
81: {
82: while(len--)
83: {
84: *addrl &= rmask[addrb];
85: if (e <= 0)
86: e += e1;
87: else
88: {
89: addrl += yinc;
90: e += e2;
91: }
92: if (addrb == 0)
93: {
94: addrb = 32;
95: addrl--;
96: }
97: addrb--;
98: }
99: }
100: } /* if X_AXIS */
101: else
102: {
103: if (signdx > 0)
104: {
105: while(len--)
106: {
107: *addrl &= rmask[addrb];
108: if (e < 0)
109: e += e1;
110: else
111: {
112: if (addrb == 31)
113: {
114: addrb = -1;
115: addrl++;
116: }
117: addrb++;
118: e += e2;
119: }
120: addrl += yinc;
121: }
122: }
123: else
124: {
125: while(len--)
126: {
127: *addrl &= rmask[addrb];
128: if (e <= 0)
129: e += e1;
130: else
131: {
132: if (addrb == 0)
133: {
134: addrb = 32;
135: addrl--;
136: }
137: addrb--;
138: e += e2;
139: }
140: addrl += yinc;
141: }
142: }
143: } /* else Y_AXIS */
144: }
145: else if (rop == RROP_WHITE)
146: {
147: if (axis == X_AXIS)
148: {
149: if (signdx > 0)
150: {
151: while(len--)
152: {
153: *addrl |= mask[addrb];
154: if (e < 0)
155: e += e1;
156: else
157: {
158: addrl += yinc;
159: e += e2;
160: }
161: if (addrb == 31)
162: {
163: addrb = -1;
164: addrl++;
165: }
166: addrb++;
167: }
168: }
169: else
170: {
171: while(len--)
172: {
173: *addrl |= mask[addrb];
174: if (e <= 0)
175: e += e1;
176: else
177: {
178: addrl += yinc;
179: e += e2;
180: }
181: if (addrb == 0)
182: {
183: addrb = 32;
184: addrl--;
185: }
186: addrb--;
187: }
188: }
189: } /* if X_AXIS */
190: else
191: {
192: if (signdx > 0)
193: {
194: while(len--)
195: {
196: *addrl |= mask[addrb];
197: if (e < 0)
198: e += e1;
199: else
200: {
201: if (addrb == 31)
202: {
203: addrb = -1;
204: addrl++;
205: }
206: addrb++;
207: e += e2;
208: }
209: addrl += yinc;
210: }
211: }
212: else
213: {
214: while(len--)
215: {
216: *addrl |= mask[addrb];
217: if (e <= 0)
218: e += e1;
219: else
220: {
221: if (addrb == 0)
222: {
223: addrb = 32;
224: addrl--;
225: }
226: addrb--;
227: e += e2;
228: }
229: addrl += yinc;
230: }
231: }
232: } /* else Y_AXIS */
233: }
234: else if (rop == RROP_INVERT)
235: {
236: if (axis == X_AXIS)
237: {
238: if (signdx > 0)
239: {
240: while(len--)
241: {
242: *addrl ^= mask[addrb];
243: if (e < 0)
244: e += e1;
245: else
246: {
247: addrl += yinc;
248: e += e2;
249: }
250: if (addrb == 31)
251: {
252: addrb = -1;
253: addrl++;
254: }
255: addrb++;
256: }
257: }
258: else
259: {
260: while(len--)
261: {
262: *addrl ^= mask[addrb];
263: if (e <= 0)
264: e += e1;
265: else
266: {
267: addrl += yinc;
268: e += e2;
269: }
270: if (addrb == 0)
271: {
272: addrb = 32;
273: addrl--;
274: }
275: addrb--;
276: }
277: }
278: } /* if X_AXIS */
279: else
280: {
281: if (signdx > 0)
282: {
283: while(len--)
284: {
285: *addrl ^= mask[addrb];
286: if (e < 0)
287: e += e1;
288: else
289: {
290: if (addrb == 31)
291: {
292: addrb = -1;
293: addrl++;
294: }
295: addrb++;
296: e += e2;
297: }
298: addrl += yinc;
299: }
300: }
301: else
302: {
303: while(len--)
304: {
305: *addrl ^= mask[addrb];
306: if (e <= 0)
307: e += e1;
308: else
309: {
310: if (addrb == 0)
311: {
312: addrb = 32;
313: addrl--;
314: }
315: addrb--;
316: e += e2;
317: }
318: addrl += yinc;
319: }
320: }
321: } /* else Y_AXIS */
322: }
323: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.