Blame


1 5cedca1b 2004-05-15 devnull #include <stdio.h>
2 5cedca1b 2004-05-15 devnull #include <math.h>
3 5cedca1b 2004-05-15 devnull #include "pic.h"
4 5cedca1b 2004-05-15 devnull #include "y.tab.h"
5 5cedca1b 2004-05-15 devnull
6 5cedca1b 2004-05-15 devnull obj *linegen(int type)
7 5cedca1b 2004-05-15 devnull {
8 5cedca1b 2004-05-15 devnull static double prevdx = HT;
9 5cedca1b 2004-05-15 devnull static double prevdy = 0;
10 5cedca1b 2004-05-15 devnull static double prevw = HT10;
11 5cedca1b 2004-05-15 devnull static double prevh = HT5;
12 5cedca1b 2004-05-15 devnull int i, j, some, head, ddtype, invis, chop, battr, with;
13 5cedca1b 2004-05-15 devnull double ddval, chop1, chop2, x0, y0, x1, y1;
14 5cedca1b 2004-05-15 devnull double fillval = 0;
15 5cedca1b 2004-05-15 devnull double theta;
16 5cedca1b 2004-05-15 devnull double defx, defy, xwith, ywith;
17 5cedca1b 2004-05-15 devnull obj *p, *ppos;
18 5cedca1b 2004-05-15 devnull static int xtab[] = { 1, 0, -1, 0 }; /* R=0, U=1, L=2, D=3 */
19 5cedca1b 2004-05-15 devnull static int ytab[] = { 0, 1, 0, -1 };
20 5cedca1b 2004-05-15 devnull double dx[500], dy[500];
21 5cedca1b 2004-05-15 devnull int ndxy;
22 5cedca1b 2004-05-15 devnull double nx, ny;
23 220c15d2 2012-10-20 rsc Attr *ap;
24 5cedca1b 2004-05-15 devnull
25 5cedca1b 2004-05-15 devnull nx = curx;
26 5cedca1b 2004-05-15 devnull ny = cury;
27 5cedca1b 2004-05-15 devnull defx = getfval("linewid");
28 5cedca1b 2004-05-15 devnull defy = getfval("lineht");
29 5cedca1b 2004-05-15 devnull prevh = getfval("arrowht");
30 5cedca1b 2004-05-15 devnull prevw = getfval("arrowwid");
31 5cedca1b 2004-05-15 devnull dx[0] = dy[0] = ndxy = some = head = invis = battr = with = 0;
32 5cedca1b 2004-05-15 devnull chop = chop1 = chop2 = 0;
33 5cedca1b 2004-05-15 devnull ddtype = ddval = xwith = ywith = 0;
34 5cedca1b 2004-05-15 devnull for (i = 0; i < nattr; i++) {
35 5cedca1b 2004-05-15 devnull ap = &attr[i];
36 5cedca1b 2004-05-15 devnull switch (ap->a_type) {
37 5cedca1b 2004-05-15 devnull case TEXTATTR:
38 5cedca1b 2004-05-15 devnull savetext(ap->a_sub, ap->a_val.p);
39 5cedca1b 2004-05-15 devnull break;
40 5cedca1b 2004-05-15 devnull case HEAD:
41 5cedca1b 2004-05-15 devnull head += ap->a_val.i;
42 5cedca1b 2004-05-15 devnull break;
43 5cedca1b 2004-05-15 devnull case INVIS:
44 5cedca1b 2004-05-15 devnull invis = INVIS;
45 5cedca1b 2004-05-15 devnull break;
46 5cedca1b 2004-05-15 devnull case NOEDGE:
47 5cedca1b 2004-05-15 devnull battr |= NOEDGEBIT;
48 5cedca1b 2004-05-15 devnull break;
49 5cedca1b 2004-05-15 devnull case DOT:
50 5cedca1b 2004-05-15 devnull case DASH:
51 5cedca1b 2004-05-15 devnull ddtype = ap->a_type==DOT ? DOTBIT : DASHBIT;
52 5cedca1b 2004-05-15 devnull if (ap->a_sub == DEFAULT)
53 5cedca1b 2004-05-15 devnull ddval = getfval("dashwid");
54 5cedca1b 2004-05-15 devnull else
55 5cedca1b 2004-05-15 devnull ddval = ap->a_val.f;
56 5cedca1b 2004-05-15 devnull break;
57 5cedca1b 2004-05-15 devnull case SAME:
58 5cedca1b 2004-05-15 devnull dx[ndxy] = prevdx;
59 5cedca1b 2004-05-15 devnull dy[ndxy] = prevdy;
60 5cedca1b 2004-05-15 devnull some++;
61 5cedca1b 2004-05-15 devnull break;
62 5cedca1b 2004-05-15 devnull case LEFT:
63 5cedca1b 2004-05-15 devnull dx[ndxy] -= (ap->a_sub==DEFAULT) ? defx : ap->a_val.f;
64 5cedca1b 2004-05-15 devnull some++;
65 5cedca1b 2004-05-15 devnull hvmode = L_DIR;
66 5cedca1b 2004-05-15 devnull break;
67 5cedca1b 2004-05-15 devnull case RIGHT:
68 5cedca1b 2004-05-15 devnull dx[ndxy] += (ap->a_sub==DEFAULT) ? defx : ap->a_val.f;
69 5cedca1b 2004-05-15 devnull some++;
70 5cedca1b 2004-05-15 devnull hvmode = R_DIR;
71 5cedca1b 2004-05-15 devnull break;
72 5cedca1b 2004-05-15 devnull case UP:
73 5cedca1b 2004-05-15 devnull dy[ndxy] += (ap->a_sub==DEFAULT) ? defy : ap->a_val.f;
74 5cedca1b 2004-05-15 devnull some++;
75 5cedca1b 2004-05-15 devnull hvmode = U_DIR;
76 5cedca1b 2004-05-15 devnull break;
77 5cedca1b 2004-05-15 devnull case DOWN:
78 5cedca1b 2004-05-15 devnull dy[ndxy] -= (ap->a_sub==DEFAULT) ? defy : ap->a_val.f;
79 5cedca1b 2004-05-15 devnull some++;
80 5cedca1b 2004-05-15 devnull hvmode = D_DIR;
81 5cedca1b 2004-05-15 devnull break;
82 5cedca1b 2004-05-15 devnull case HEIGHT: /* length of arrowhead */
83 5cedca1b 2004-05-15 devnull prevh = ap->a_val.f;
84 5cedca1b 2004-05-15 devnull break;
85 5cedca1b 2004-05-15 devnull case WIDTH: /* width of arrowhead */
86 5cedca1b 2004-05-15 devnull prevw = ap->a_val.f;
87 5cedca1b 2004-05-15 devnull break;
88 5cedca1b 2004-05-15 devnull case TO:
89 5cedca1b 2004-05-15 devnull if (some) {
90 5cedca1b 2004-05-15 devnull nx += dx[ndxy];
91 5cedca1b 2004-05-15 devnull ny += dy[ndxy];
92 5cedca1b 2004-05-15 devnull ndxy++;
93 5cedca1b 2004-05-15 devnull dx[ndxy] = dy[ndxy] = some = 0;
94 5cedca1b 2004-05-15 devnull }
95 5cedca1b 2004-05-15 devnull ppos = attr[i].a_val.o;
96 5cedca1b 2004-05-15 devnull dx[ndxy] = ppos->o_x - nx;
97 5cedca1b 2004-05-15 devnull dy[ndxy] = ppos->o_y - ny;
98 5cedca1b 2004-05-15 devnull some++;
99 5cedca1b 2004-05-15 devnull break;
100 5cedca1b 2004-05-15 devnull case BY:
101 5cedca1b 2004-05-15 devnull if (some) {
102 5cedca1b 2004-05-15 devnull nx += dx[ndxy];
103 5cedca1b 2004-05-15 devnull ny += dy[ndxy];
104 5cedca1b 2004-05-15 devnull ndxy++;
105 5cedca1b 2004-05-15 devnull dx[ndxy] = dy[ndxy] = some = 0;
106 5cedca1b 2004-05-15 devnull }
107 5cedca1b 2004-05-15 devnull ppos = ap->a_val.o;
108 5cedca1b 2004-05-15 devnull dx[ndxy] = ppos->o_x;
109 5cedca1b 2004-05-15 devnull dy[ndxy] = ppos->o_y;
110 5cedca1b 2004-05-15 devnull some++;
111 5cedca1b 2004-05-15 devnull break;
112 5cedca1b 2004-05-15 devnull case THEN: /* turn off any previous accumulation */
113 5cedca1b 2004-05-15 devnull if (some) {
114 5cedca1b 2004-05-15 devnull nx += dx[ndxy];
115 5cedca1b 2004-05-15 devnull ny += dy[ndxy];
116 5cedca1b 2004-05-15 devnull ndxy++;
117 5cedca1b 2004-05-15 devnull dx[ndxy] = dy[ndxy] = some = 0;
118 5cedca1b 2004-05-15 devnull }
119 5cedca1b 2004-05-15 devnull break;
120 5cedca1b 2004-05-15 devnull case FROM:
121 5cedca1b 2004-05-15 devnull case AT:
122 5cedca1b 2004-05-15 devnull ppos = ap->a_val.o;
123 5cedca1b 2004-05-15 devnull nx = curx = ppos->o_x;
124 5cedca1b 2004-05-15 devnull ny = cury = ppos->o_y;
125 5cedca1b 2004-05-15 devnull break;
126 5cedca1b 2004-05-15 devnull case WITH:
127 5cedca1b 2004-05-15 devnull with = ap->a_val.i;
128 5cedca1b 2004-05-15 devnull break;
129 5cedca1b 2004-05-15 devnull case CHOP:
130 5cedca1b 2004-05-15 devnull if (ap->a_sub != PLACENAME) {
131 5cedca1b 2004-05-15 devnull if( chop == 0)
132 5cedca1b 2004-05-15 devnull chop1 = chop2 = ap->a_val.f;
133 5cedca1b 2004-05-15 devnull else
134 5cedca1b 2004-05-15 devnull chop2 = ap->a_val.f;
135 5cedca1b 2004-05-15 devnull }
136 5cedca1b 2004-05-15 devnull break;
137 5cedca1b 2004-05-15 devnull case FILL:
138 5cedca1b 2004-05-15 devnull battr |= FILLBIT;
139 5cedca1b 2004-05-15 devnull if (ap->a_sub == DEFAULT)
140 5cedca1b 2004-05-15 devnull fillval = getfval("fillval");
141 5cedca1b 2004-05-15 devnull else
142 5cedca1b 2004-05-15 devnull fillval = ap->a_val.f;
143 5cedca1b 2004-05-15 devnull break;
144 5cedca1b 2004-05-15 devnull }
145 5cedca1b 2004-05-15 devnull }
146 5cedca1b 2004-05-15 devnull if (with) { /* this doesn't work at all */
147 5cedca1b 2004-05-15 devnull switch (with) {
148 5cedca1b 2004-05-15 devnull case CENTER:
149 5cedca1b 2004-05-15 devnull xwith = (dx[1] - dx[0]) / 2; ywith = (dy[1] - dy[0]) / 2; break;
150 5cedca1b 2004-05-15 devnull }
151 5cedca1b 2004-05-15 devnull for (i = 0; i < ndxy; i++) {
152 5cedca1b 2004-05-15 devnull dx[i] -= xwith;
153 5cedca1b 2004-05-15 devnull dy[i] -= ywith;
154 5cedca1b 2004-05-15 devnull }
155 5cedca1b 2004-05-15 devnull curx += xwith;
156 5cedca1b 2004-05-15 devnull cury += ywith;
157 5cedca1b 2004-05-15 devnull }
158 5cedca1b 2004-05-15 devnull if (some) {
159 5cedca1b 2004-05-15 devnull nx += dx[ndxy];
160 5cedca1b 2004-05-15 devnull ny += dy[ndxy];
161 5cedca1b 2004-05-15 devnull ndxy++;
162 5cedca1b 2004-05-15 devnull defx = dx[ndxy-1];
163 5cedca1b 2004-05-15 devnull defy = dy[ndxy-1];
164 5cedca1b 2004-05-15 devnull } else {
165 5cedca1b 2004-05-15 devnull defx *= xtab[hvmode];
166 5cedca1b 2004-05-15 devnull defy *= ytab[hvmode];
167 5cedca1b 2004-05-15 devnull dx[ndxy] = defx;
168 5cedca1b 2004-05-15 devnull dy[ndxy] = defy;
169 5cedca1b 2004-05-15 devnull ndxy++;
170 5cedca1b 2004-05-15 devnull nx += defx;
171 5cedca1b 2004-05-15 devnull ny += defy;
172 5cedca1b 2004-05-15 devnull }
173 5cedca1b 2004-05-15 devnull prevdx = defx;
174 5cedca1b 2004-05-15 devnull prevdy = defy;
175 5cedca1b 2004-05-15 devnull if (chop) {
176 5cedca1b 2004-05-15 devnull if (chop == 1 && chop1 == 0) /* just said "chop", so use default */
177 5cedca1b 2004-05-15 devnull chop1 = chop2 = getfval("circlerad");
178 5cedca1b 2004-05-15 devnull theta = atan2(dy[0], dx[0]);
179 5cedca1b 2004-05-15 devnull x0 = chop1 * cos(theta);
180 5cedca1b 2004-05-15 devnull y0 = chop1 * sin(theta);
181 5cedca1b 2004-05-15 devnull curx += x0;
182 5cedca1b 2004-05-15 devnull cury += y0;
183 5cedca1b 2004-05-15 devnull dx[0] -= x0;
184 5cedca1b 2004-05-15 devnull dy[0] -= y0;
185 5cedca1b 2004-05-15 devnull
186 5cedca1b 2004-05-15 devnull theta = atan2(dy[ndxy-1], dx[ndxy-1]);
187 5cedca1b 2004-05-15 devnull x1 = chop2 * cos(theta);
188 5cedca1b 2004-05-15 devnull y1 = chop2 * sin(theta);
189 5cedca1b 2004-05-15 devnull nx -= x1;
190 5cedca1b 2004-05-15 devnull ny -= y1;
191 5cedca1b 2004-05-15 devnull dx[ndxy-1] -= x1;
192 5cedca1b 2004-05-15 devnull dy[ndxy-1] -= y1;
193 5cedca1b 2004-05-15 devnull dprintf("chopping %g %g %g %g; cur=%g,%g end=%g,%g\n",
194 5cedca1b 2004-05-15 devnull x0, y0, x1, y1, curx, cury, nx, ny);
195 5cedca1b 2004-05-15 devnull }
196 5cedca1b 2004-05-15 devnull p = makenode(type, 5 + 2 * ndxy);
197 5cedca1b 2004-05-15 devnull curx = p->o_val[0] = nx;
198 5cedca1b 2004-05-15 devnull cury = p->o_val[1] = ny;
199 5cedca1b 2004-05-15 devnull if (head || type == ARROW) {
200 5cedca1b 2004-05-15 devnull p->o_nhead = getfval("arrowhead");
201 5cedca1b 2004-05-15 devnull p->o_val[2] = prevw;
202 5cedca1b 2004-05-15 devnull p->o_val[3] = prevh;
203 5cedca1b 2004-05-15 devnull if (head == 0)
204 5cedca1b 2004-05-15 devnull head = HEAD2; /* default arrow head */
205 5cedca1b 2004-05-15 devnull }
206 5cedca1b 2004-05-15 devnull p->o_attr = head | invis | ddtype | battr;
207 5cedca1b 2004-05-15 devnull p->o_fillval = fillval;
208 5cedca1b 2004-05-15 devnull p->o_val[4] = ndxy;
209 5cedca1b 2004-05-15 devnull nx = p->o_x;
210 5cedca1b 2004-05-15 devnull ny = p->o_y;
211 5cedca1b 2004-05-15 devnull for (i = 0, j = 5; i < ndxy; i++, j += 2) {
212 5cedca1b 2004-05-15 devnull p->o_val[j] = dx[i];
213 5cedca1b 2004-05-15 devnull p->o_val[j+1] = dy[i];
214 5cedca1b 2004-05-15 devnull if (type == LINE || type == ARROW)
215 5cedca1b 2004-05-15 devnull extreme(nx += dx[i], ny += dy[i]);
216 5cedca1b 2004-05-15 devnull else if (type == SPLINE && i < ndxy-1) {
217 5cedca1b 2004-05-15 devnull /* to compute approx extreme of spline at p,
218 5cedca1b 2004-05-15 devnull /* compute midway between p-1 and p+1,
219 5cedca1b 2004-05-15 devnull /* then go 3/4 from there to p */
220 5cedca1b 2004-05-15 devnull double ex, ey, xi, yi, xi1, yi1;
221 5cedca1b 2004-05-15 devnull xi = nx + dx[i]; yi = ny + dy[i]; /* p */
222 5cedca1b 2004-05-15 devnull xi1 = xi + dx[i+1]; yi1 = yi + dy[i+1]; /* p+1 */
223 5cedca1b 2004-05-15 devnull ex = (nx+xi1)/2; ey = (ny+yi1)/2; /* midway */
224 5cedca1b 2004-05-15 devnull ex += 0.75*(xi-ex); ey += 0.75*(yi-ey);
225 5cedca1b 2004-05-15 devnull extreme(ex, ey);
226 5cedca1b 2004-05-15 devnull nx = xi; ny = yi;
227 5cedca1b 2004-05-15 devnull }
228 fa325e9b 2020-01-10 cross
229 5cedca1b 2004-05-15 devnull }
230 5cedca1b 2004-05-15 devnull p->o_ddval = ddval;
231 5cedca1b 2004-05-15 devnull if (dbg) {
232 5cedca1b 2004-05-15 devnull printf("S or L from %g %g to %g %g with %d elements:\n", p->o_x, p->o_y, curx, cury, ndxy);
233 5cedca1b 2004-05-15 devnull for (i = 0, j = 5; i < ndxy; i++, j += 2)
234 5cedca1b 2004-05-15 devnull printf("%g %g\n", p->o_val[j], p->o_val[j+1]);
235 5cedca1b 2004-05-15 devnull }
236 5cedca1b 2004-05-15 devnull extreme(p->o_x, p->o_y);
237 5cedca1b 2004-05-15 devnull extreme(curx, cury);
238 5cedca1b 2004-05-15 devnull return(p);
239 5cedca1b 2004-05-15 devnull }