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