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 *textgen(void)
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;
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) {
19 3ebbd193 2017-06-19 rsc h = ap->a_val.f;
23 3ebbd193 2017-06-19 rsc w = ap->a_val.f;
26 3ebbd193 2017-06-19 rsc with = ap->a_val.i;
29 3ebbd193 2017-06-19 rsc invis = INVIS;
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;
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;
42 3ebbd193 2017-06-19 rsc savetext(sub, ap->a_val.p);
48 3ebbd193 2017-06-19 rsc if (hset == 0) /* no explicit ht cmd */
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;
62 3ebbd193 2017-06-19 rsc curx += xwith;
63 3ebbd193 2017-06-19 rsc cury += ywith;
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;
73 3ebbd193 2017-06-19 rsc cury -= h / 2;
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))
88 3ebbd193 2017-06-19 rsc else if (isleft(hvmode))
90 3ebbd193 2017-06-19 rsc else if (isup(hvmode))
97 3ebbd193 2017-06-19 rsc obj *troffgen(char *s) /* save away a string of troff commands */
99 3ebbd193 2017-06-19 rsc savetext(CENTER, s); /* use the existing text mechanism */
100 3ebbd193 2017-06-19 rsc return makenode(TROFF, 0);
103 3ebbd193 2017-06-19 rsc void savetext(int t, char *s) /* record text elements for current object */
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);