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 *textgen(void)
6 3ebbd193 2017-06-19 rsc {
7 3ebbd193 2017-06-19 rsc int i, sub, nstr, at, with, hset, invis;
8 3ebbd193 2017-06-19 rsc double xwith, ywith, h, w, x0, y0, x1, y1;
9 3ebbd193 2017-06-19 rsc obj *p, *ppos;
10 3ebbd193 2017-06-19 rsc Attr *ap;
11 3ebbd193 2017-06-19 rsc
12 3ebbd193 2017-06-19 rsc at = with = nstr = hset = invis = 0;
13 3ebbd193 2017-06-19 rsc h = getfval("textht");
14 3ebbd193 2017-06-19 rsc w = getfval("textwid");
15 3ebbd193 2017-06-19 rsc for (i = 0; i < nattr; i++) {
16 3ebbd193 2017-06-19 rsc ap = &attr[i];
17 3ebbd193 2017-06-19 rsc switch (ap->a_type) {
18 3ebbd193 2017-06-19 rsc case HEIGHT:
19 3ebbd193 2017-06-19 rsc h = ap->a_val.f;
20 3ebbd193 2017-06-19 rsc hset++;
21 3ebbd193 2017-06-19 rsc break;
22 3ebbd193 2017-06-19 rsc case WIDTH:
23 3ebbd193 2017-06-19 rsc w = ap->a_val.f;
24 3ebbd193 2017-06-19 rsc break;
25 3ebbd193 2017-06-19 rsc case WITH:
26 3ebbd193 2017-06-19 rsc with = ap->a_val.i;
27 3ebbd193 2017-06-19 rsc break;
28 3ebbd193 2017-06-19 rsc case INVIS:
29 3ebbd193 2017-06-19 rsc invis = INVIS;
30 3ebbd193 2017-06-19 rsc break;
31 3ebbd193 2017-06-19 rsc case AT:
32 3ebbd193 2017-06-19 rsc ppos = ap->a_val.o;
33 3ebbd193 2017-06-19 rsc curx = ppos->o_x;
34 3ebbd193 2017-06-19 rsc cury = ppos->o_y;
35 3ebbd193 2017-06-19 rsc at++;
36 3ebbd193 2017-06-19 rsc break;
37 3ebbd193 2017-06-19 rsc case TEXTATTR:
38 3ebbd193 2017-06-19 rsc sub = ap->a_sub;
39 3ebbd193 2017-06-19 rsc if (ap->a_val.p == NULL) /* an isolated modifier */
40 3ebbd193 2017-06-19 rsc text[ntext-1].t_type = sub;
41 3ebbd193 2017-06-19 rsc else {
42 3ebbd193 2017-06-19 rsc savetext(sub, ap->a_val.p);
43 3ebbd193 2017-06-19 rsc nstr++;
44 3ebbd193 2017-06-19 rsc }
45 3ebbd193 2017-06-19 rsc break;
46 3ebbd193 2017-06-19 rsc }
47 3ebbd193 2017-06-19 rsc }
48 3ebbd193 2017-06-19 rsc if (hset == 0) /* no explicit ht cmd */
49 3ebbd193 2017-06-19 rsc h *= nstr;
50 3ebbd193 2017-06-19 rsc if (with) {
51 3ebbd193 2017-06-19 rsc xwith = ywith = 0.0;
52 3ebbd193 2017-06-19 rsc switch (with) {
53 3ebbd193 2017-06-19 rsc case NORTH: ywith = -h / 2; break;
54 3ebbd193 2017-06-19 rsc case SOUTH: ywith = h / 2; break;
55 3ebbd193 2017-06-19 rsc case EAST: xwith = -w / 2; break;
56 3ebbd193 2017-06-19 rsc case WEST: xwith = w / 2; break;
57 3ebbd193 2017-06-19 rsc case NE: xwith = -w / 2; ywith = -h / 2; break;
58 3ebbd193 2017-06-19 rsc case SE: xwith = -w / 2; ywith = h / 2; break;
59 3ebbd193 2017-06-19 rsc case NW: xwith = w / 2; ywith = -h / 2; break;
60 3ebbd193 2017-06-19 rsc case SW: xwith = w / 2; ywith = h / 2; break;
61 3ebbd193 2017-06-19 rsc }
62 3ebbd193 2017-06-19 rsc curx += xwith;
63 3ebbd193 2017-06-19 rsc cury += ywith;
64 3ebbd193 2017-06-19 rsc }
65 3ebbd193 2017-06-19 rsc if (!at) {
66 3ebbd193 2017-06-19 rsc if (isright(hvmode))
67 3ebbd193 2017-06-19 rsc curx += w / 2;
68 3ebbd193 2017-06-19 rsc else if (isleft(hvmode))
69 3ebbd193 2017-06-19 rsc curx -= w / 2;
70 3ebbd193 2017-06-19 rsc else if (isup(hvmode))
71 3ebbd193 2017-06-19 rsc cury += h / 2;
72 3ebbd193 2017-06-19 rsc else
73 3ebbd193 2017-06-19 rsc cury -= h / 2;
74 3ebbd193 2017-06-19 rsc }
75 3ebbd193 2017-06-19 rsc x0 = curx - w / 2;
76 3ebbd193 2017-06-19 rsc y0 = cury - h / 2;
77 3ebbd193 2017-06-19 rsc x1 = curx + w / 2;
78 3ebbd193 2017-06-19 rsc y1 = cury + h / 2;
79 3ebbd193 2017-06-19 rsc extreme(x0, y0);
80 3ebbd193 2017-06-19 rsc extreme(x1, y1);
81 3ebbd193 2017-06-19 rsc dprintf("Text h %g w %g at %g,%g\n", h, w, curx, cury);
82 3ebbd193 2017-06-19 rsc p = makenode(TEXT, 2);
83 3ebbd193 2017-06-19 rsc p->o_attr = invis;
84 3ebbd193 2017-06-19 rsc p->o_val[0] = w;
85 3ebbd193 2017-06-19 rsc p->o_val[1] = h;
86 3ebbd193 2017-06-19 rsc if (isright(hvmode))
87 3ebbd193 2017-06-19 rsc curx = x1;
88 3ebbd193 2017-06-19 rsc else if (isleft(hvmode))
89 3ebbd193 2017-06-19 rsc curx = x0;
90 3ebbd193 2017-06-19 rsc else if (isup(hvmode))
91 3ebbd193 2017-06-19 rsc cury = y1;
92 3ebbd193 2017-06-19 rsc else
93 3ebbd193 2017-06-19 rsc cury = y0;
94 3ebbd193 2017-06-19 rsc return(p);
95 3ebbd193 2017-06-19 rsc }
96 3ebbd193 2017-06-19 rsc
97 3ebbd193 2017-06-19 rsc obj *troffgen(char *s) /* save away a string of troff commands */
98 3ebbd193 2017-06-19 rsc {
99 3ebbd193 2017-06-19 rsc savetext(CENTER, s); /* use the existing text mechanism */
100 3ebbd193 2017-06-19 rsc return makenode(TROFF, 0);
101 3ebbd193 2017-06-19 rsc }
102 3ebbd193 2017-06-19 rsc
103 3ebbd193 2017-06-19 rsc void savetext(int t, char *s) /* record text elements for current object */
104 3ebbd193 2017-06-19 rsc {
105 3ebbd193 2017-06-19 rsc if (ntext >= ntextlist)
106 3ebbd193 2017-06-19 rsc text = (Text *) grow((char *) text, "text", ntextlist += 200, sizeof(Text));
107 3ebbd193 2017-06-19 rsc text[ntext].t_type = t;
108 3ebbd193 2017-06-19 rsc text[ntext].t_val = s;
109 3ebbd193 2017-06-19 rsc dprintf("saving %d text %s at %d\n", t, s, ntext);
110 3ebbd193 2017-06-19 rsc ntext++;
111 3ebbd193 2017-06-19 rsc }