|
|
1.1 ! root 1: /* Copyright (c) 1988 AT&T */ ! 2: /* All Rights Reserved */ ! 3: ! 4: /* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T */ ! 5: /* The copyright notice above does not evidence any */ ! 6: /* actual or intended publication of such source code. */ ! 7: ! 8: /* @(#)picasso:blockgen.c 1.0 */ ! 9: #include "picasso.h" ! 10: #include "y.tab.h" ! 11: ! 12: #define NBRACK 20 /* depth of [...] */ ! 13: #define NBRACE 20 /* depth of {...} */ ! 14: ! 15: struct pushstack stack[NBRACK]; ! 16: int nstack = 0; ! 17: struct pushstack bracestack[NBRACE]; ! 18: int nbstack = 0; ! 19: obj *cur_block = (obj *)0; ! 20: ! 21: obj *leftthing(c) /* called for {... or [... */ ! 22: /* really ought to be separate functions */ ! 23: int c; ! 24: { ! 25: obj *p; ! 26: ! 27: if (c == '[') { ! 28: if (nstack >= NBRACK) ! 29: fatal("[...] nested too deep"); ! 30: stack[nstack].p_x = curx; ! 31: stack[nstack].p_y = cury; ! 32: stack[nstack].p_hvmode = hvmode; ! 33: stack[nstack].p_xmin = Gbox[0]; ! 34: stack[nstack].p_ymin = Gbox[1]; ! 35: stack[nstack].p_xmax = Gbox[2]; ! 36: stack[nstack].p_ymax = Gbox[3]; ! 37: nstack++; ! 38: Gbox[0] = Gbox[1] = 32767; ! 39: Gbox[2] = Gbox[3] = -32767; ! 40: p = makenode(BLOCK, N_VAL+2, (int)getfval("curlayer")); ! 41: curx = cury = 0; ! 42: cur_block = p; ! 43: } else { ! 44: if (nbstack >= NBRACK) ! 45: fatal("{...} nested too deep"); ! 46: bracestack[nbstack].p_x = curx; ! 47: bracestack[nbstack].p_y = cury; ! 48: bracestack[nbstack].p_hvmode = hvmode; ! 49: nbstack++; ! 50: p = NULL; ! 51: } ! 52: return(p); ! 53: } ! 54: ! 55: obj *rightthing(p, c) /* called for ... ] or ... } */ ! 56: obj *p; ! 57: { ! 58: obj *q; ! 59: ! 60: if (c == '}') { ! 61: nbstack--; ! 62: curx = bracestack[nbstack].p_x; ! 63: cury = bracestack[nbstack].p_y; ! 64: hvmode = bracestack[nbstack].p_hvmode; ! 65: q = makenode(MOVE, 0, 0); ! 66: } else { ! 67: nstack--; ! 68: hvmode = stack[nstack].p_hvmode; ! 69: q = makenode(BLOCKEND, 0, p->o_layer); ! 70: cur_block = p->o_parent; ! 71: curx = stack[nstack].p_x; ! 72: cury = stack[nstack].p_y; ! 73: p->o_val[N_VAL+0].o = q; ! 74: p->o_val[N_VAL+1].s = stack[nstack+1].p_symtab; ! 75: p->o_x = (Gbox[2]+Gbox[0])/2; ! 76: p->o_wid = (Gbox[2]-Gbox[0]); ! 77: if (p->o_wid < 0) p->o_wid = 0; ! 78: p->o_y = (Gbox[3]+Gbox[1])/2; ! 79: p->o_ht = (Gbox[3]-Gbox[1]); ! 80: if (p->o_ht < 0) p->o_ht = 0; ! 81: Gbox[0] = stack[nstack].p_xmin; ! 82: Gbox[1] = stack[nstack].p_ymin; ! 83: Gbox[2] = stack[nstack].p_xmax; ! 84: Gbox[3] = stack[nstack].p_ymax; ! 85: } ! 86: return(q); ! 87: } ! 88: ! 89: obj *blockgen(p) /* handles [...] */ ! 90: obj *p; ! 91: { ! 92: float h, w, xwith, ywith; ! 93: float ctrx, ctry, x0, y0, x1, y1; ! 94: int i, at, with; ! 95: obj *ppos; ! 96: Attr *ap; ! 97: ! 98: at = with = xwith = ywith = 0; ! 99: if (ntext > ntext1) ! 100: set_text(); ! 101: ctrx = curx + p->o_x; ! 102: ctry = cury + p->o_y; ! 103: w = p->o_wid; ! 104: h = p->o_ht; ! 105: for (i = 0; i < nattr; i++) { ! 106: ap = &attr[i]; ! 107: switch (ap->a_type) { ! 108: case HEIGHT: ! 109: h = ap->a_val.f; ! 110: break; ! 111: case WIDTH: ! 112: w = ap->a_val.f; ! 113: break; ! 114: case WITH: ! 115: with = ap->a_val.i; /* corner */ ! 116: break; ! 117: case PLACE: /* actually with position ... */ ! 118: ppos = ap->a_val.o; ! 119: xwith = p->o_x - Xformx(ppos, 1, ppos->o_x, ppos->o_y); ! 120: ywith = p->o_y - Xformy(ppos, 0, ppos->o_x, ppos->o_y); ! 121: with = PLACE; ! 122: break; ! 123: case AT: ! 124: case FROM: ! 125: ppos = ap->a_val.o; ! 126: ctrx = Xformx(ppos, 1, ppos->o_x, ppos->o_y); ! 127: ctry = Xformy(ppos, 0, ppos->o_x, ppos->o_y); ! 128: at++; ! 129: break; ! 130: case LAYER: ! 131: if ((p->o_layer = (int)ap->a_val.f) > top_layer) ! 132: top_layer = p->o_layer; ! 133: break; ! 134: case FONT: ! 135: reset_font((double)ap->a_val.f); ! 136: break; ! 137: case SIZE: ! 138: reset_size(ap->a_sub, (double)ap->a_val.f); ! 139: break; ! 140: case SPACE: ! 141: reset_space(ap->a_sub, (double)ap->a_val.f); ! 142: break; ! 143: case TEXTATTR: ! 144: savetext(ap->a_sub, ap->a_val.p); ! 145: break; ! 146: case TCOLOR: ! 147: p->o_text = checkcolor((double)ap->a_val.f); ! 148: break; ! 149: } ! 150: } ! 151: if (!at && !with) ! 152: with = isright(hvmode) ? WEST : isleft(hvmode) ? EAST : ! 153: isup(hvmode) ? SOUTH : NORTH; ! 154: if (with) { ! 155: switch (with) { ! 156: case NORTH: ywith = -h/2; break; ! 157: case SOUTH: ywith = h/2; break; ! 158: case EAST: xwith = -w/2; break; ! 159: case WEST: xwith = w/2; break; ! 160: case NE: xwith = -w/2; ywith = -h/2; break; ! 161: case SE: xwith = -w/2; ywith = h/2; break; ! 162: case NW: xwith = w/2; ywith = -h/2; break; ! 163: case SW: xwith = w/2; ywith = h/2; break; ! 164: } ! 165: ctrx += xwith; ! 166: ctry += ywith; ! 167: } ! 168: x0 = ctrx - w / 2; ! 169: x1 = ctrx + w / 2; ! 170: y0 = ctry - h / 2; ! 171: y1 = ctry + h / 2; ! 172: p->o_nt1 = ntext1; ! 173: p->o_nt2 = ntext; ! 174: if (ntext > ntext1) { ! 175: ntext1 = ntext; ! 176: checktextcolor(p); ! 177: } ! 178: translate(p, ctrx - p->o_x, ctry - p->o_y); ! 179: text_bounds(p); ! 180: if (isright(hvmode)) ! 181: curx = x1; ! 182: else if (isleft(hvmode)) ! 183: curx = x0; ! 184: else if (isup(hvmode)) ! 185: cury = y1; ! 186: else ! 187: cury = y0; ! 188: stack[nstack+1].p_symtab = NULL; /* so won't be found again */ ! 189: return(p); ! 190: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.