|
|
1.1 root 1: #include <stdio.h>
2: #include "pic.h"
3: #include "y.tab.h"
4: print()
5: {
6: obj *p;
7: int i, j, k, m;
8: float x0, y0, x1, y1, ox, oy, dx, dy, ndx, ndy;
9:
10: for (i = 0; i < nobj; i++) {
11: p = objlist[i];
12: ox = p->o_x;
13: oy = p->o_y;
14: if (p->o_count >= 1)
15: x1 = p->o_val[0];
16: if (p->o_count >= 2)
17: y1 = p->o_val[1];
18: m = p->o_mode;
19: switch (p->o_type) {
20: case TROFF:
21: troff(text[p->o_nt1].t_val);
22: break;
23: case BOX:
24: case BLOCK:
25: move(ox, oy);
26: dotext(p); /* if there are any text strings */
27: x0 = ox - x1 / 2;
28: y0 = oy - y1 / 2;
29: x1 = ox + x1 / 2;
30: y1 = oy + y1 / 2;
31: if (p->o_attr & INVIS || p->o_type == BLOCK)
32: ; /* nothing at all */
33: else if (p->o_attr & (DOTBIT|DASHBIT))
34: dotbox(x0, y0, x1, y1, p->o_attr, p->o_ddval);
35: else
36: box(x0, y0, x1, y1);
37: if (ishor(m))
38: move(isright(m) ? x1 : x0, oy); /* right side */
39: else
40: move(ox, isdown(m) ? y0 : y1); /* bottom */
41: break;
42: case BLOCKEND:
43: break;
44: case CIRCLE:
45: move(ox, oy);
46: dotext(p);
47: if ((p->o_attr & INVIS) == 0)
48: circle(ox, oy, x1);
49: if (ishor(m))
50: move(ox + isright(m) ? x1 : -x1, oy);
51: else
52: move(ox, oy + isup(m) ? x1 : -x1);
53: break;
54: case ELLIPSE:
55: move(ox, oy);
56: dotext(p);
57: if ((p->o_attr & INVIS) == 0)
58: ellipse(ox, oy, x1, y1);
59: if (ishor(m))
60: move(ox + isright(m) ? x1 : -x1, oy);
61: else
62: move(ox, oy - isdown(m) ? y1 : -y1);
63: break;
64: case ARC:
65: move(ox, oy);
66: dotext(p);
67: if (p->o_attr & HEAD1)
68: arrow(x1 - (y1 - oy), y1 + (x1 - ox),
69: x1, y1, p->o_val[4], p->o_val[5], p->o_val[5]/p->o_val[6]/2, p->o_nhead);
70: if (p->o_attr & INVIS)
71: /* probably wrong when it's cw */
72: move(x1, y1);
73: else
74: arc(ox, oy, x1, y1, p->o_val[2], p->o_val[3]);
75: if (p->o_attr & HEAD2)
76: arrow(p->o_val[2] + p->o_val[3] - oy, p->o_val[3] - (p->o_val[2] - ox),
77: p->o_val[2], p->o_val[3], p->o_val[4], p->o_val[5], -p->o_val[5]/p->o_val[6]/2, p->o_nhead);
78: if (p->o_attr & CW_ARC)
79: move(x1, y1); /* because drawn backwards */
80: break;
81: case LINE:
82: case ARROW:
83: case SPLINE:
84: move((ox + x1)/2, (oy + y1)/2); /* center */
85: dotext(p);
86: if (p->o_attr & HEAD1)
87: arrow(ox + p->o_val[5], oy + p->o_val[6], ox, oy, p->o_val[2], p->o_val[3], 0.0, p->o_nhead);
88: if (p->o_attr & INVIS)
89: move(x1, y1);
90: else if (p->o_type == SPLINE)
91: spline(ox, oy, p->o_val[4], &p->o_val[5], p->o_attr & (DOTBIT|DASHBIT), p->o_ddval);
92: else {
93: dx = ox;
94: dy = oy;
95: for (k=0, j=5; k < p->o_val[4]; k++, j += 2) {
96: ndx = dx + p->o_val[j];
97: ndy = dy + p->o_val[j+1];
98: if (p->o_attr & (DOTBIT|DASHBIT))
99: dotline(dx, dy, ndx, ndy, p->o_attr, p->o_ddval);
100: else
101: line(dx, dy, ndx, ndy);
102: dx = ndx;
103: dy = ndy;
104: }
105: }
106: if (p->o_attr & HEAD2) {
107: dx = ox;
108: dy = oy;
109: for (k = 0, j = 5; k < p->o_val[4] - 1; k++, j += 2) {
110: dx += p->o_val[j];
111: dy += p->o_val[j+1];
112: }
113: arrow(dx, dy, x1, y1, p->o_val[2], p->o_val[3], 0.0, p->o_nhead);
114: }
115: break;
116: case MOVE:
117: case TEXT:
118: move(ox, oy);
119: dotext(p);
120: break;
121: }
122: }
123: }
124:
125: dotline(x0, y0, x1, y1, ddtype, ddval) /* dotted line */
126: float x0, y0, x1, y1;
127: int ddtype;
128: float ddval;
129: {
130: static float prevval = 0.05; /* 20 per inch by default */
131: int i, numdots;
132: double a, b, sqrt(), dx, dy;
133:
134: if (ddval == 0)
135: ddval = prevval;
136: prevval = ddval;
137: /* don't save dot/dash value */
138: dx = x1 - x0;
139: dy = y1 - y0;
140: if (ddtype & DOTBIT) {
141: numdots = sqrt(dx*dx + dy*dy) / prevval + 0.5;
142: if (numdots > 0)
143: for (i = 0; i <= numdots; i++) {
144: a = (float) i / (float) numdots;
145: move(x0 + (a * dx), y0 + (a * dy));
146: dot();
147: }
148: } else if (ddtype & DASHBIT) {
149: double d, dashsize, spacesize;
150: d = sqrt(dx*dx + dy*dy);
151: if (d <= 2 * prevval) {
152: line(x0, y0, x1, y1);
153: return;
154: }
155: numdots = d / (2 * prevval) + 1; /* ceiling */
156: dashsize = prevval;
157: spacesize = (d - numdots * dashsize) / (numdots - 1);
158: for (i = 0; i < numdots-1; i++) {
159: a = i * (dashsize + spacesize) / d;
160: b = a + dashsize / d;
161: line(x0 + (a*dx), y0 + (a*dy), x0 + (b*dx), y0 + (b*dy));
162: a = b;
163: b = a + spacesize / d;
164: move(x0 + (a*dx), y0 + (a*dy));
165: }
166: line(x0 + (b * dx), y0 + (b * dy), x1, y1);
167: }
168: prevval = 0.05;
169: }
170:
171: dotbox(x0, y0, x1, y1, ddtype, ddval) /* dotted or dashed box */
172: float x0, y0, x1, y1;
173: int ddtype;
174: float ddval;
175: {
176: dotline(x0, y0, x1, y0, ddtype, ddval);
177: dotline(x1, y0, x1, y1, ddtype, ddval);
178: dotline(x1, y1, x0, y1, ddtype, ddval);
179: dotline(x0, y1, x0, y0, ddtype, ddval);
180: }
181:
182: dotext(p) /* print text strings of p in proper vertical spacing */
183: obj *p;
184: {
185: int i, nhalf;
186:
187: nhalf = p->o_nt2 - p->o_nt1 - 1;
188: for (i = p->o_nt1; i < p->o_nt2; i++) {
189: label(text[i].t_val, text[i].t_type, nhalf);
190: nhalf -= 2;
191: }
192: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.