|
|
1.1 root 1: #include <stdio.h>
2: #include "pic.h"
3: #include "y.tab.h"
4:
5: struct obj *circgen(type)
6: {
7: static int rad[2] = { HT/2, WID/2 };
8: static int rad2[2] = { HT/2, HT/2 };
9: static coord x0, y0, x1, y1, x2, y2;
10: int i, at, t, invis;
11: int with, xwith, ywith;
12: int r, r2;
13: struct obj *p, *ppos;
14:
15: at = invis = 0;
16: with = xwith = ywith = 0;
17: t = (type == CIRCLE) ? 0 : 1;
18: if (type == CIRCLE)
19: r = r2 = getvar("circlerad");
20: else if (type == ELLIPSE) {
21: r = getvar("ellipsewid") / 2;
22: r2 = getvar("ellipseht") / 2;
23: }
24: for (i = 0; i < nattr; i++)
25: switch (attr[i].a_type) {
26: case LJUST: case RJUST: case CENTER: case SPREAD: case FILL: case ABOVE: case BELOW:
27: savetext(attr[i].a_type, attr[i].a_val);
28: break;
29: case RADIUS:
30: r = attr[i].a_val;
31: break;
32: case DIAMETER:
33: case WIDTH:
34: r = (attr[i].a_val + 1) / 2;
35: break;
36: case HEIGHT:
37: r2 = (attr[i].a_val + 1) / 2;
38: break;
39: case SAME:
40: r = rad[t];
41: r2 = rad2[t];
42: break;
43: case WITH:
44: with = attr[i].a_val;
45: break;
46: case AT:
47: ppos = (struct obj *) attr[i].a_val;
48: curx = ppos->o_x;
49: cury = ppos->o_y;
50: at++;
51: break;
52: case INVIS:
53: invis = INVIS;
54: break;
55: }
56: if (type == CIRCLE)
57: r2 = r; /* probably superfluous */
58: if (with) {
59: switch (with) {
60: case NORTH: ywith = -r2; break;
61: case SOUTH: ywith = r2; break;
62: case EAST: xwith = -r; break;
63: case WEST: xwith = r; break;
64: case NE: xwith = -r * 0.707; ywith = -r2 * 0.707; break;
65: case SE: xwith = -r * 0.707; ywith = r2 * 0.707; break;
66: case NW: xwith = r * 0.707; ywith = -r2 * 0.707; break;
67: case SW: xwith = r * 0.707; ywith = r2 * 0.707; break;
68: }
69: curx += xwith;
70: cury += ywith;
71: }
72: if (!at) {
73: if (isright(hvmode))
74: curx += r;
75: else if (isleft(hvmode))
76: curx -= r;
77: else if (isup(hvmode))
78: cury += r2;
79: else
80: cury -= r2;
81: }
82: p = makenode(type, 2);
83: p->o_val[0] = rad[t] = r;
84: p->o_val[1] = rad2[t] = r2;
85: if (r <= 0 || r2 <= 0) {
86: yyerror("%s has invalid radius %d\n", (type==CIRCLE) ? "circle" : "ellipse", r<r2 ? r : r2);
87: }
88: p->o_attr = invis;
89: extreme(curx+r, cury+r2);
90: extreme(curx-r, cury-r2);
91: if (type == CIRCLE)
92: dprintf("C %d %d %d\n", curx, cury, r);
93: if (type == ELLIPSE)
94: dprintf("E %d %d %d %d\n", curx, cury, r, r2);
95: if (isright(hvmode))
96: curx += r;
97: else if (isleft(hvmode))
98: curx -= r;
99: else if (isup(hvmode))
100: cury += r2;
101: else
102: cury -= r2;
103: return(p);
104: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.