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