|
|
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.