1 3ebbd193 2017-06-19 rsc #include <stdio.h>
2 3ebbd193 2017-06-19 rsc #include "pic.h"
3 3ebbd193 2017-06-19 rsc #include "y.tab.h"
5 3ebbd193 2017-06-19 rsc obj *boxgen(void)
7 3ebbd193 2017-06-19 rsc static double prevh = HT;
8 3ebbd193 2017-06-19 rsc static double prevw = WID; /* golden mean, sort of */
9 3ebbd193 2017-06-19 rsc int i, at, battr, with;
10 3ebbd193 2017-06-19 rsc double ddval, fillval, xwith, ywith;
11 3ebbd193 2017-06-19 rsc double h, w, x0, y0, x1, y1;
12 3ebbd193 2017-06-19 rsc obj *p, *ppos;
15 3ebbd193 2017-06-19 rsc h = getfval("boxht");
16 3ebbd193 2017-06-19 rsc w = getfval("boxwid");
17 3ebbd193 2017-06-19 rsc at = battr = with = 0;
18 3ebbd193 2017-06-19 rsc ddval = fillval = xwith = ywith = 0;
19 3ebbd193 2017-06-19 rsc for (i = 0; i < nattr; i++) {
20 3ebbd193 2017-06-19 rsc ap = &attr[i];
21 3ebbd193 2017-06-19 rsc switch (ap->a_type) {
23 3ebbd193 2017-06-19 rsc h = ap->a_val.f;
26 3ebbd193 2017-06-19 rsc w = ap->a_val.f;
33 3ebbd193 2017-06-19 rsc with = ap->a_val.i; /* corner */
36 3ebbd193 2017-06-19 rsc ppos = ap->a_val.o;
37 3ebbd193 2017-06-19 rsc curx = ppos->o_x;
38 3ebbd193 2017-06-19 rsc cury = ppos->o_y;
42 3ebbd193 2017-06-19 rsc battr |= INVIS;
45 3ebbd193 2017-06-19 rsc battr |= NOEDGEBIT;
49 3ebbd193 2017-06-19 rsc battr |= ap->a_type==DOT ? DOTBIT : DASHBIT;
50 3ebbd193 2017-06-19 rsc if (ap->a_sub == DEFAULT)
51 3ebbd193 2017-06-19 rsc ddval = getfval("dashwid");
53 3ebbd193 2017-06-19 rsc ddval = ap->a_val.f;
56 3ebbd193 2017-06-19 rsc battr |= FILLBIT;
57 3ebbd193 2017-06-19 rsc if (ap->a_sub == DEFAULT)
58 3ebbd193 2017-06-19 rsc fillval = getfval("fillval");
60 3ebbd193 2017-06-19 rsc fillval = ap->a_val.f;
62 3ebbd193 2017-06-19 rsc case TEXTATTR:
63 3ebbd193 2017-06-19 rsc savetext(ap->a_sub, ap->a_val.p);
68 3ebbd193 2017-06-19 rsc switch (with) {
69 3ebbd193 2017-06-19 rsc case NORTH: ywith = -h / 2; break;
70 3ebbd193 2017-06-19 rsc case SOUTH: ywith = h / 2; break;
71 3ebbd193 2017-06-19 rsc case EAST: xwith = -w / 2; break;
72 3ebbd193 2017-06-19 rsc case WEST: xwith = w / 2; break;
73 3ebbd193 2017-06-19 rsc case NE: xwith = -w / 2; ywith = -h / 2; break;
74 3ebbd193 2017-06-19 rsc case SE: xwith = -w / 2; ywith = h / 2; break;
75 3ebbd193 2017-06-19 rsc case NW: xwith = w / 2; ywith = -h / 2; break;
76 3ebbd193 2017-06-19 rsc case SW: xwith = w / 2; ywith = h / 2; break;
78 3ebbd193 2017-06-19 rsc curx += xwith;
79 3ebbd193 2017-06-19 rsc cury += ywith;
82 3ebbd193 2017-06-19 rsc if (isright(hvmode))
83 3ebbd193 2017-06-19 rsc curx += w / 2;
84 3ebbd193 2017-06-19 rsc else if (isleft(hvmode))
85 3ebbd193 2017-06-19 rsc curx -= w / 2;
86 3ebbd193 2017-06-19 rsc else if (isup(hvmode))
87 3ebbd193 2017-06-19 rsc cury += h / 2;
89 3ebbd193 2017-06-19 rsc cury -= h / 2;
91 3ebbd193 2017-06-19 rsc x0 = curx - w / 2;
92 3ebbd193 2017-06-19 rsc y0 = cury - h / 2;
93 3ebbd193 2017-06-19 rsc x1 = curx + w / 2;
94 3ebbd193 2017-06-19 rsc y1 = cury + h / 2;
95 3ebbd193 2017-06-19 rsc extreme(x0, y0);
96 3ebbd193 2017-06-19 rsc extreme(x1, y1);
97 3ebbd193 2017-06-19 rsc p = makenode(BOX, 2);
98 3ebbd193 2017-06-19 rsc p->o_val[0] = w;
99 3ebbd193 2017-06-19 rsc p->o_val[1] = h;
100 3ebbd193 2017-06-19 rsc p->o_attr = battr;
101 3ebbd193 2017-06-19 rsc p->o_ddval = ddval;
102 3ebbd193 2017-06-19 rsc p->o_fillval = fillval;
103 3ebbd193 2017-06-19 rsc dprintf("B %g %g %g %g at %g %g, h=%g, w=%g\n", x0, y0, x1, y1, curx, cury, h, w);
104 3ebbd193 2017-06-19 rsc if (isright(hvmode))
106 3ebbd193 2017-06-19 rsc else if (isleft(hvmode))
108 3ebbd193 2017-06-19 rsc else if (isup(hvmode))