|
|
1.1 root 1: /*
2: * jerq driver
3: */
4:
5: #include <stdio.h>
6: #include <math.h>
7: #include "y.tab.h"
8: #include "pic.h"
9:
10:
11: #define abs(n) (n >= 0 ? n : -(n))
12: #define PI 3.141592654
13: #define PI2 PI/2
14:
15: extern int res;
16: extern int DX; /* step size in x */
17: extern int DY; /* step size in y */
18:
19: extern float hshift; /* how much to move left by for text */
20: extern float vshift; /* how much down */
21:
22: /* scaling stuff, specific to typesetter */
23: /* defined by s command as X0,Y0 to X1,Y1 */
24: /* output dimensions set by -l,-w options to 0,0 to hmax, vmax */
25: /* default output is 6x6 inches */
26:
27: float xscale;
28: float yscale;
29:
30: int hpos = 0; /* current horizontal position in output coordinate system */
31: int vpos = 0; /* current vertical position; 0 is top of page */
32:
33: int X0, Y0; /* left bottom of input */
34: int X1, Y1; /* right top of input */
35: #define CX 0 /* center of jerq screen */
36: #define CY 0
37: #define JERQRES 81
38:
39: int hmax; /* right end of output */
40: int vmax; /* top of output (down is positive) */
41:
42: extern float deltx;
43: extern float delty;
44: extern int xmin, ymin, xmax, ymax, sxmin, symin, sxmax, symax;
45: extern int crop;
46:
47: openpl(s) /* initialize device */
48: char *s; /* residue of .PS invocation line */
49: {
50: hpos = vpos = 0;
51: res = JERQRES;
52: if (delty == 0)
53: delty = deltx; /* -w alone implies -s */
54: hmax = vmax = 8 * res; /* default = 8 x 8 */
55: if (deltx > 0 && delty > 0) { /* have to change default size */
56: if (deltx < 9) /* assume inches were specified */
57: hmax = res * deltx;
58: else
59: hmax = res * 9;
60: if (deltx < 9) /* assume inches were specified */
61: vmax = res * delty;
62: else
63: vmax = res * 9;
64: }
65: if (crop) {
66: if (xmax == xmin)
67: space(xmin, ymin, xmin + ymax-ymin, ymax);
68: else
69: space(xmin, ymin, xmax, ymin + xmax-xmin); /* assumes 1:1 aspect ratio */
70: }
71: else
72: space(sxmin, symin, sxmax, symax);
73: printf("... %d %d %d %d %d %d %d %d\n",
74: (xmin), (ymin), (xmax), (ymax),
75: (sxmin), (symin), (sxmax), (symax));
76: printf("... %du %du %du %du %du %du %du %du\n",
77: xconv(xmin), yconv(ymin), xconv(xmax), yconv(ymax),
78: xconv(sxmin), yconv(symin), xconv(sxmax), yconv(symax));
79: printf(".PS %d %d %s", yconv(ymin), xconv(xmax), s);
80: /* assumes \n comes as part of s */
81: erase();
82: }
83:
84: closepl(type) /* clean up after finished */
85: {
86: printf("S\n");
87: }
88:
89: move(x, y) /* go to position x, y in external coords */
90: int x, y;
91: {
92: hgoto(xconv(x));
93: vgoto(yconv(y));
94: }
95:
96: movehv(h, v) /* go to internal position h, v */
97: int h, v;
98: {
99: hgoto(h);
100: vgoto(v);
101: }
102:
103: hmot(n) /* generate n units of horizontal motion */
104: int n;
105: {
106: hpos += n;
107: }
108:
109: vmot(n) /* generate n units of vertical motion */
110: int n;
111: {
112: vpos += n;
113: }
114:
115: hgoto(n)
116: {
117: hpos = n;
118: }
119:
120: vgoto(n)
121: {
122: vpos = n;
123: }
124:
125: hvflush() /* get to proper point for output */
126: {
127: printf("m %d %d\n", hpos, vpos);
128: }
129:
130: troff(s) /* output troff right here */
131: char *s;
132: {
133: printf("%s\n", s);
134: }
135:
136: label(s, t, nh) /* text s of type t nh half-lines up */
137: char *s;
138: int t, nh;
139: {
140: int x0, y0, x1, y1;
141: int q;
142: char *p;
143:
144: if (t == 'A')
145: nh++;
146: else if (t == 'B')
147: nh--;
148: vpos += nh * 10; /* approx 1/2 line */
149: switch (t) {
150: default:
151: t = ' ';
152: /* FALL THROUGH */
153: case 'L':
154: case 'A':
155: case 'B':
156: case 'C':
157: case 'R':
158: printf("t %d %d %c%s\n", hpos, vpos, t, s);
159: break;
160: }
161: }
162:
163: /* line(x0, y0, x1, y1) /* draw line from x0,y0 to x1,y1 */
164: /* int x0, y0, x1, y1;
165: /* {
166: /* printf("l %d %d %d %d\n", xconv(x0), yconv(y0), xconv(x1), yconv(y1));
167: /* }
168: */
169:
170: arrow(x0, y0, x1, y1, w, h) /* draw arrow (without line), head wid w & len h */
171: {
172: double alpha, rot, hyp;
173: int dx, dy;
174: extern int dbg;
175:
176: rot = atan2( ((double) w) / 2, (double) h );
177: hyp = sqrt( (float) (w/2 * w/2 + h * h) );
178: alpha = atan2((float)(y1-y0), (float)(x1-x0));
179: if (dbg)
180: printf("rot=%f, hyp=%f, alpha=%f\n", rot, hyp, alpha);
181: dx = hyp * cos(alpha + PI + rot) + 0.5;
182: dy = hyp * sin(alpha + PI + rot) + 0.5;
183: if (dbg) printf("dx,dy = %d,%d\n", dx, dy);
184: /* line(x1+dx, y1+dy, x1, y1); */
185: printf("l 2 %d %d %d %d\n",
186: xconv(x1+dx), yconv(y1+dy), xconv(x1), yconv(y1));
187: dx = hyp * cos(alpha + PI - rot) + 0.5;
188: dy = hyp * sin(alpha + PI - rot) + 0.5;
189: if (dbg) printf("dx,dy = %d,%d\n", dx, dy);
190: /* line(x1+dx, y1+dy, x1, y1); */
191: printf("l 2 %d %d %d %d\n",
192: xconv(x1+dx), yconv(y1+dy), xconv(x1), yconv(y1));
193: }
194:
195: box(x0, y0, x1, y1, dotdash, ddval)
196: {
197: printf("b");
198: if (dotdash == DOT)
199: printf(". %d", xsc(ddval));
200: else if (dotdash == DASH)
201: printf("- %d", xsc(ddval));
202: printf(" %d %d %d %d\n", xconv(x0), yconv(y0), xconv(x1), yconv(y1));
203: }
204:
205: circle(x, y, r)
206: {
207: printf("c %d %d %d\n", hpos = xconv(x), vpos = yconv(y), xsc(r));
208: }
209:
210: spline(x, y, n, p, head)
211: int x, y, n, *p, head;
212: {
213: int i, j, dx, dy;
214:
215: printf("~ ");
216: if (head & HEAD1)
217: printf("<");
218: if (head & HEAD2)
219: printf(">");
220: printf(" %d %d %d", n+1, hpos = xconv(x), vpos = yconv(y));
221: for (i = 0; i < 2 * n; i += 2) {
222: x += p[i];
223: y += p[i+1];
224: printf(" %d %d", xconv(x), yconv(y));
225: }
226: printf("\n");
227: }
228:
229: line(x, y, n, p, head, dotdash, ddval)
230: int x, y, n, *p, head;
231: int dotdash, ddval;
232: {
233: int i, j, dx, dy;
234:
235: printf("l "); /* a line */
236: if (head & HEAD1)
237: printf("<");
238: if (head & HEAD2)
239: printf(">");
240: if (dotdash == DOT)
241: printf(". %d", xsc(ddval));
242: else if (dotdash == DASH)
243: printf("- %d", xsc(ddval));
244: printf(" %d %d %d", n+1, hpos = xconv(x), vpos = yconv(y));
245: for (i = 0; i < 2 * n; i += 2) {
246: x += p[i];
247: y += p[i+1];
248: printf(" %d %d", xconv(x), yconv(y));
249: }
250: printf("\n");
251: }
252:
253:
254: ellipse(x, y, r1, r2)
255: {
256: r1 = xsc(r1);
257: r2 = ysc(r2);
258: printf("e %d %d %d %d\n", xconv(x), yconv(y), abs(r1), abs(r2));
259: }
260:
261: arc(x, y, x0, y0, x1, y1) /* draw arc with center x,y */
262: {
263: float r;
264: float dx2, dy2, phi, ht, d;
265: int cx, cy;
266:
267: r = sqrt( (float) (x0-x) * (x0-x) + (float) (y0-y) * (y0-y) );
268: /* decide which radius is really needed: */
269: dx2 = (float)(x1 - x0) / 2;
270: dy2 = (float)(y1 - y0) / 2;
271: phi = atan2(dy2, dx2) + PI2;
272: ht = sqrt(r*r - (dx2*dx2 + dy2*dy2));
273: cx = x0 + dx2 + ht * cos(phi) + 0.5;
274: cy = y0 + dy2 + ht * sin(phi) + 0.5;
275: if (abs(cx-x) >= 5 || abs(cy-y) >= 5)
276: r = -r; /* wrong center was picked */
277: printf("a %d %d %d %d %d %d\n", xconv(x), yconv(y),
278: xconv(x0), yconv(y0), xconv(x1), yconv(y1));
279: }
280:
281: erase() /* get to bottom of frame */
282: {
283: printf("E\n");
284: fflush(stdout);
285: }
286:
287: point(x, y) /* put point at x,y */
288: int x, y;
289: {
290: static char *temp = ".";
291:
292: move(x, y);
293: label(temp, 'L');
294: }
295:
296: space(x0, y0, x1, y1) /* set limits of page */
297: int x0, y0, x1, y1;
298: {
299: if (x0 == x1)
300: x1 = x0 + 1;
301: if (y0 == y1)
302: y1 = y0 - 1; /* kludge */
303: X0 = x0;
304: Y0 = y0;
305: X1 = x1;
306: Y1 = y1;
307: xscale = (float) hmax / (float) (X1-X0);
308: yscale = (float) vmax / (float) (Y0-Y1);
309: }
310:
311: xconv(x) /* convert x from external to internal form */
312: int x;
313: {
314: int v;
315:
316: v = (x-X0) * xscale + 0.5;
317: return v + CX;
318: }
319:
320: xsc(x) /* convert x from external to internal form, scaling only */
321: int x;
322: {
323: int v;
324:
325: v = (x) * xscale + 0.5;
326: return v;
327: }
328:
329: yconv(y) /* convert y from external to internal form */
330: int y;
331: {
332: int v;
333:
334: y += Y1 - ymax;
335: v = (y-Y1) * yscale + 0.5;
336: return v + CY;
337: }
338:
339: ysc(y) /* convert y from external to internal form, scaling only */
340: int y;
341: {
342: int v;
343:
344: v = (y) * yscale + 0.5;
345: return v;
346: }
347:
348: linemod(s)
349: char *s;
350: {
351: }
352:
353: dot() {
354: hvflush();
355: printf("tc.\n");
356: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.