|
|
1.1 root 1: /*
2: * _line - draw a line from x0 to x1
3: * assumes already clipped, so no checking, just GO!
4: * the line is closed w.r.t. the endpoints
5: */
6: /*
7: * From ACM Nov 1973 V16, #11, I thought, but look in Newman & Sproull
8: */
9: #define LINE_C /* This file "owns" the header file line.h */
10: #define LEFT 1024 /* line will be drawn right to left */
11: #include <jerq.h>
12: #include <line.h>
13: _line(b, x0, x1, fun)
14: register Bitmap *b;
15: Point x0, x1;
16: Code fun;
17: {
18: register d, yincr;
19: short deltax, deltay;
20: short /*unsigned*/ x, y;
21: register UWord bit;
22: register Word *screenp;
23: register long screenincr;
24: register d1;
25: int d2;
26: register count;
27: Point temp;
28:
29: if(Jxmajor==0){
30: if(x0.y>x1.y){
31: temp=x0;
32: x0=x1;
33: x1=temp;
34: }
35: if(x0.x>x1.x)
36: fun|=LEFT;
37: }
38: else if(x0.x>x1.x){
39: temp=x0;
40: x0=x1;
41: x1=temp;
42: }
43: x=x0.x;
44: y=x0.y;
45: deltax=x1.x-x;
46: deltay=x1.y-y;
47: yincr=(deltay>0)? 1 : -1;
48: screenp=addr(b,x0);
49: screenincr=yincr*(int)b->width; /* signed product please */
50: bit=LASTBIT<<(WORDSIZE-1-(x&WORDMASK)); /* don't sign extend */
51: deltax=abs(deltax);
52: deltay=abs(deltay);
53: if(Jxmajor==0)
54: goto Steepline;
55: count=deltax+1; /* so we can say --count (faster) */
56: if(deltay==0){ /* easy and fast */
57: y=x+count; /* sorry about overusing the variables */
58: if(x&WORDMASK){
59: d=topbits[x&WORDMASK];
60: switch(fun){
61: case F_STORE:
62: case F_OR:
63: if((x&~WORDMASK)==(y&~WORDMASK)){ /* same word */
64: d^=topbits[y&WORDMASK];
65: *screenp|=d;
66: return;
67: }
68: *screenp++|=~d;
69: x=(x|WORDMASK)+1;
70: break;
71: case F_CLR:
72: if((x&~WORDMASK)==(y&~WORDMASK)){ /* same word */
73: d^=topbits[y&WORDMASK];
74: *screenp&=~d;
75: return;
76: }
77: *screenp++&=d;
78: x=(x|WORDMASK)+1;
79: break;
80: case F_XOR:
81: if((x&~WORDMASK)==(y&~WORDMASK)){ /* same word */
82: d^=topbits[y&WORDMASK];
83: *screenp^=d;
84: return;
85: }
86: *screenp++^=~d;
87: x=(x|WORDMASK)+1;
88: break;
89: }
90: }
91: switch(fun){
92: case F_STORE:
93: case F_OR:
94: while((x+=WORDSIZE)<=y)
95: *screenp++=ONES;
96: if(y&WORDMASK)
97: *screenp|=topbits[y&WORDMASK];
98: break;
99: case F_CLR:
100: while((x+=WORDSIZE)<=y)
101: *screenp++=0;
102: if(y&WORDMASK)
103: *screenp&=~topbits[y&WORDMASK];
104: break;
105: case F_XOR:
106: while((x+=WORDSIZE)<=y)
107: *screenp++^=ONES;
108: if(y&WORDMASK)
109: *screenp^=topbits[y&WORDMASK];
110: break;
111: }
112: return;
113: }
114: /* else */
115: d=Jsetdda(x);
116: d1=2*Jdminor;
117: d2=d1-2*Jdmajor;
118: switch(fun){
119: case F_STORE:
120: case F_OR:
121: for(;;){
122: *screenp|=bit;
123: if(--count==0)
124: return;
125: if((bit>>=1)==0){
126: screenp++;
127: bit=FIRSTBIT;
128: }
129: if(d<0)
130: d+=d1;
131: else{
132: d+=d2;
133: screenp+=screenincr;
134: }
135: }
136: case F_CLR:
137: for(;;){
138: *screenp&=~bit;
139: if(--count==0)
140: return;
141: if((bit>>=1)==0){
142: screenp++;
143: bit=FIRSTBIT;
144: }
145: if(d<0)
146: d+=d1;
147: else{
148: d+=d2;
149: screenp+=screenincr;
150: }
151: }
152: case F_XOR:
153: for(;;){
154: *screenp^=bit;
155: if(--count==0)
156: return;
157: if((bit>>=1)==0){
158: screenp++;
159: bit=FIRSTBIT;
160: }
161: if(d<0)
162: d+=d1;
163: else{
164: d+=d2;
165: screenp+=screenincr;
166: }
167: }
168: }
169: Steepline:
170: count=deltay+1;
171: if(deltax==0){ /* easy and fast */
172: switch(fun){
173: case F_STORE:
174: case F_OR:
175: for(;;screenp+=screenincr){
176: *screenp|=bit;
177: if(--count==0)
178: return;
179: }
180: case F_CLR:
181: bit= ~bit;
182: for(;;screenp+=screenincr){
183: *screenp&=bit;
184: if(--count==0)
185: return;
186: }
187: case F_XOR:
188: for(;;screenp+=screenincr){
189: *screenp^=bit;
190: if(--count==0)
191: return;
192: }
193: }
194: }
195: /* else */
196: d=Jsetdda(y);
197: d1=2*Jdminor;
198: d2=d1-2*Jdmajor;
199: switch(fun){
200: case F_STORE:
201: case F_OR:
202: for(;;screenp+=screenincr){
203: *screenp|=bit;
204: if(--count==0)
205: return;
206: if(d<0)
207: d+=d1;
208: else{
209: d+=d2;
210: if((bit>>=1)==0){
211: screenp++;
212: bit=FIRSTBIT;
213: }
214: }
215: }
216: case F_STORE|LEFT:
217: case F_OR|LEFT:
218: for(;;screenp+=screenincr){
219: *screenp|=bit;
220: if(--count==0)
221: return;
222: if(d<0)
223: d+=d1;
224: else{
225: d+=d2;
226: if((bit<<=1)==0){
227: screenp--;
228: bit=LASTBIT;
229: }
230: }
231: }
232: case F_CLR:
233: for(;;screenp+=screenincr){
234: *screenp&=~bit;
235: if(--count==0)
236: return;
237: if(d<0)
238: d+=d1;
239: else{
240: d+=d2;
241: if((bit>>=1)==0){
242: screenp++;
243: bit=FIRSTBIT;
244: }
245: }
246: }
247: case F_CLR|LEFT:
248: for(;;screenp+=screenincr){
249: *screenp&=~bit;
250: if(--count==0)
251: return;
252: if(d<0)
253: d+=d1;
254: else{
255: d+=d2;
256: if((bit<<=1)==0){
257: screenp--;
258: bit=LASTBIT;
259: }
260: }
261: }
262: case F_XOR:
263: for(;;screenp+=screenincr){
264: *screenp^=bit;
265: if(--count==0)
266: return;
267: if(d<0)
268: d+=d1;
269: else{
270: d+=d2;
271: if((bit>>=1)==0){
272: screenp++;
273: bit=FIRSTBIT;
274: }
275: }
276: }
277: case F_XOR|LEFT:
278: for(;;screenp+=screenincr){
279: *screenp^=bit;
280: if(--count==0)
281: return;
282: if(d<0)
283: d+=d1;
284: else{
285: d+=d2;
286: if((bit<<=1)==0){
287: screenp--;
288: bit=LASTBIT;
289: }
290: }
291: }
292: }
293: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.