Blame


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