|
|
1.1 ! root 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; ! 8: double xwith, ywith, h, w, x0, y0, x1, y1; ! 9: obj *p, *ppos; ! 10: static double prevh = 0; ! 11: static double prevw = 0; ! 12: Attr *ap; ! 13: ! 14: at = with = nstr = hset = 0; ! 15: h = getfval("textht"); ! 16: w = getfval("textwid"); ! 17: for (i = 0; i < nattr; i++) { ! 18: ap = &attr[i]; ! 19: switch (ap->a_type) { ! 20: case HEIGHT: ! 21: h = ap->a_val.f; ! 22: hset++; ! 23: break; ! 24: case WIDTH: ! 25: w = ap->a_val.f; ! 26: break; ! 27: case WITH: ! 28: with = ap->a_val.i; ! 29: break; ! 30: case AT: ! 31: ppos = ap->a_val.o; ! 32: curx = ppos->o_x; ! 33: cury = ppos->o_y; ! 34: at++; ! 35: break; ! 36: case TEXTATTR: ! 37: sub = ap->a_sub; ! 38: if (ap->a_val.p == NULL) /* an isolated modifier */ ! 39: text[ntext-1].t_type = sub; ! 40: else { ! 41: savetext(sub, ap->a_val.p); ! 42: nstr++; ! 43: } ! 44: break; ! 45: } ! 46: } ! 47: if (hset == 0) /* no explicit ht cmd */ ! 48: h *= nstr; ! 49: if (with) { ! 50: xwith = ywith = 0.0; ! 51: switch (with) { ! 52: case NORTH: ywith = -h / 2; break; ! 53: case SOUTH: ywith = h / 2; break; ! 54: case EAST: xwith = -w / 2; break; ! 55: case WEST: xwith = w / 2; break; ! 56: case NE: xwith = -w / 2; ywith = -h / 2; break; ! 57: case SE: xwith = -w / 2; ywith = h / 2; break; ! 58: case NW: xwith = w / 2; ywith = -h / 2; break; ! 59: case SW: xwith = w / 2; ywith = h / 2; break; ! 60: } ! 61: curx += xwith; ! 62: cury += ywith; ! 63: } ! 64: if (!at) { ! 65: if (isright(hvmode)) ! 66: curx += w / 2; ! 67: else if (isleft(hvmode)) ! 68: curx -= w / 2; ! 69: else if (isup(hvmode)) ! 70: cury += h / 2; ! 71: else ! 72: cury -= h / 2; ! 73: } ! 74: x0 = curx - w / 2; ! 75: y0 = cury - h / 2; ! 76: x1 = curx + w / 2; ! 77: y1 = cury + h / 2; ! 78: extreme(x0, y0); ! 79: extreme(x1, y1); ! 80: dprintf("Text h %g w %g at %g,%g\n", h, w, curx, cury); ! 81: p = makenode(TEXT, 2); ! 82: p->o_val[0] = w; ! 83: p->o_val[1] = h; ! 84: if (isright(hvmode)) ! 85: curx = x1; ! 86: else if (isleft(hvmode)) ! 87: curx = x0; ! 88: else if (isup(hvmode)) ! 89: cury = y1; ! 90: else ! 91: cury = y0; ! 92: prevh = h; ! 93: prevw = w; ! 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.