Blame


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"
4 3ebbd193 2017-06-19 rsc
5 3ebbd193 2017-06-19 rsc obj *boxgen(void)
6 3ebbd193 2017-06-19 rsc {
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;
13 3ebbd193 2017-06-19 rsc Attr *ap;
14 3ebbd193 2017-06-19 rsc
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) {
22 3ebbd193 2017-06-19 rsc case HEIGHT:
23 3ebbd193 2017-06-19 rsc h = ap->a_val.f;
24 3ebbd193 2017-06-19 rsc break;
25 3ebbd193 2017-06-19 rsc case WIDTH:
26 3ebbd193 2017-06-19 rsc w = ap->a_val.f;
27 3ebbd193 2017-06-19 rsc break;
28 3ebbd193 2017-06-19 rsc case SAME:
29 3ebbd193 2017-06-19 rsc h = prevh;
30 3ebbd193 2017-06-19 rsc w = prevw;
31 3ebbd193 2017-06-19 rsc break;
32 3ebbd193 2017-06-19 rsc case WITH:
33 3ebbd193 2017-06-19 rsc with = ap->a_val.i; /* corner */
34 3ebbd193 2017-06-19 rsc break;
35 3ebbd193 2017-06-19 rsc case AT:
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;
39 3ebbd193 2017-06-19 rsc at++;
40 3ebbd193 2017-06-19 rsc break;
41 3ebbd193 2017-06-19 rsc case INVIS:
42 3ebbd193 2017-06-19 rsc battr |= INVIS;
43 3ebbd193 2017-06-19 rsc break;
44 3ebbd193 2017-06-19 rsc case NOEDGE:
45 3ebbd193 2017-06-19 rsc battr |= NOEDGEBIT;
46 3ebbd193 2017-06-19 rsc break;
47 3ebbd193 2017-06-19 rsc case DOT:
48 3ebbd193 2017-06-19 rsc case DASH:
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");
52 3ebbd193 2017-06-19 rsc else
53 3ebbd193 2017-06-19 rsc ddval = ap->a_val.f;
54 3ebbd193 2017-06-19 rsc break;
55 3ebbd193 2017-06-19 rsc case FILL:
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");
59 3ebbd193 2017-06-19 rsc else
60 3ebbd193 2017-06-19 rsc fillval = ap->a_val.f;
61 3ebbd193 2017-06-19 rsc break;
62 3ebbd193 2017-06-19 rsc case TEXTATTR:
63 3ebbd193 2017-06-19 rsc savetext(ap->a_sub, ap->a_val.p);
64 3ebbd193 2017-06-19 rsc break;
65 3ebbd193 2017-06-19 rsc }
66 3ebbd193 2017-06-19 rsc }
67 3ebbd193 2017-06-19 rsc if (with) {
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;
77 3ebbd193 2017-06-19 rsc }
78 3ebbd193 2017-06-19 rsc curx += xwith;
79 3ebbd193 2017-06-19 rsc cury += ywith;
80 3ebbd193 2017-06-19 rsc }
81 3ebbd193 2017-06-19 rsc if (!at) {
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;
88 3ebbd193 2017-06-19 rsc else
89 3ebbd193 2017-06-19 rsc cury -= h / 2;
90 3ebbd193 2017-06-19 rsc }
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))
105 3ebbd193 2017-06-19 rsc curx = x1;
106 3ebbd193 2017-06-19 rsc else if (isleft(hvmode))
107 3ebbd193 2017-06-19 rsc curx = x0;
108 3ebbd193 2017-06-19 rsc else if (isup(hvmode))
109 3ebbd193 2017-06-19 rsc cury = y1;
110 3ebbd193 2017-06-19 rsc else
111 3ebbd193 2017-06-19 rsc cury = y0;
112 3ebbd193 2017-06-19 rsc prevh = h;
113 3ebbd193 2017-06-19 rsc prevw = w;
114 3ebbd193 2017-06-19 rsc return(p);
115 3ebbd193 2017-06-19 rsc }