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