|
|
1.1 root 1: #include <stdio.h>
2: #include "pic.h"
3: #include "y.tab.h"
4:
5: obj *boxgen(void)
6: {
7: static double prevh = HT;
8: static double prevw = WID; /* golden mean, sort of */
9: int i, at, battr, with;
10: double ddval, fillval, xwith, ywith;
11: double h, w, x0, y0, x1, y1;
12: obj *p, *ppos;
13: Attr *ap;
14:
15: h = getfval("boxht");
16: w = getfval("boxwid");
17: at = battr = with = 0;
18: ddval = fillval = xwith = ywith = 0;
19: for (i = 0; i < nattr; i++) {
20: ap = &attr[i];
21: switch (ap->a_type) {
22: case HEIGHT:
23: h = ap->a_val.f;
24: break;
25: case WIDTH:
26: w = ap->a_val.f;
27: break;
28: case SAME:
29: h = prevh;
30: w = prevw;
31: break;
32: case WITH:
33: with = ap->a_val.i; /* corner */
34: break;
35: case AT:
36: ppos = ap->a_val.o;
37: curx = ppos->o_x;
38: cury = ppos->o_y;
39: at++;
40: break;
41: case INVIS:
42: battr |= INVIS;
43: break;
44: case NOEDGE:
45: battr |= NOEDGEBIT;
46: break;
47: case DOT:
48: case DASH:
49: battr |= ap->a_type==DOT ? DOTBIT : DASHBIT;
50: if (ap->a_sub == DEFAULT)
51: ddval = getfval("dashwid");
52: else
53: ddval = ap->a_val.f;
54: break;
55: case FILL:
56: battr |= FILLBIT;
57: if (ap->a_sub == DEFAULT)
58: fillval = getfval("fillval");
59: else
60: fillval = ap->a_val.f;
61: break;
62: case TEXTATTR:
63: savetext(ap->a_sub, ap->a_val.p);
64: break;
65: }
66: }
67: if (with) {
68: switch (with) {
69: case NORTH: ywith = -h / 2; break;
70: case SOUTH: ywith = h / 2; break;
71: case EAST: xwith = -w / 2; break;
72: case WEST: xwith = w / 2; break;
73: case NE: xwith = -w / 2; ywith = -h / 2; break;
74: case SE: xwith = -w / 2; ywith = h / 2; break;
75: case NW: xwith = w / 2; ywith = -h / 2; break;
76: case SW: xwith = w / 2; ywith = h / 2; break;
77: }
78: curx += xwith;
79: cury += ywith;
80: }
81: if (!at) {
82: if (isright(hvmode))
83: curx += w / 2;
84: else if (isleft(hvmode))
85: curx -= w / 2;
86: else if (isup(hvmode))
87: cury += h / 2;
88: else
89: cury -= h / 2;
90: }
91: x0 = curx - w / 2;
92: y0 = cury - h / 2;
93: x1 = curx + w / 2;
94: y1 = cury + h / 2;
95: extreme(x0, y0);
96: extreme(x1, y1);
97: p = makenode(BOX, 2);
98: p->o_val[0] = w;
99: p->o_val[1] = h;
100: p->o_attr = battr;
101: p->o_ddval = ddval;
102: p->o_fillval = fillval;
103: dprintf("B %g %g %g %g at %g %g, h=%g, w=%g\n", x0, y0, x1, y1, curx, cury, h, w);
104: if (isright(hvmode))
105: curx = x1;
106: else if (isleft(hvmode))
107: curx = x0;
108: else if (isup(hvmode))
109: cury = y1;
110: else
111: cury = y0;
112: prevh = h;
113: prevw = w;
114: return(p);
115: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.