|  | #include	<stdio.h> | 
|  | #include	"pic.h" | 
|  | #include	"y.tab.h" | 
|  |  | 
|  | obj* | 
|  | boxgen(void) | 
|  | { | 
|  | static double prevh = HT; | 
|  | static double prevw = WID;	/* golden mean, sort of */ | 
|  | int i, at, battr, with; | 
|  | double ddval, fillval, xwith, ywith; | 
|  | double h, w, x0, y0, x1, y1; | 
|  | obj *p, *ppos; | 
|  | Attr *ap; | 
|  |  | 
|  | h = getfval("boxht"); | 
|  | w = getfval("boxwid"); | 
|  | at = battr = with = 0; | 
|  | ddval = fillval = xwith = ywith = 0; | 
|  | for (i = 0; i < nattr; i++) { | 
|  | ap = &attr[i]; | 
|  | switch (ap->a_type) { | 
|  | case HEIGHT: | 
|  | h = ap->a_val.f; | 
|  | break; | 
|  | case WIDTH: | 
|  | w = ap->a_val.f; | 
|  | break; | 
|  | case SAME: | 
|  | h = prevh; | 
|  | w = prevw; | 
|  | break; | 
|  | case WITH: | 
|  | with = ap->a_val.i;	/* corner */ | 
|  | break; | 
|  | case AT: | 
|  | ppos = ap->a_val.o; | 
|  | curx = ppos->o_x; | 
|  | cury = ppos->o_y; | 
|  | at++; | 
|  | break; | 
|  | case INVIS: | 
|  | battr |= INVIS; | 
|  | break; | 
|  | case DOT: | 
|  | case DASH: | 
|  | battr |= ap->a_type==DOT ? DOTBIT : DASHBIT; | 
|  | if (ap->a_sub == DEFAULT) | 
|  | ddval = getfval("dashwid"); | 
|  | else | 
|  | ddval = ap->a_val.f; | 
|  | break; | 
|  | case FILL: | 
|  | battr |= FILLBIT; | 
|  | if (ap->a_sub == DEFAULT) | 
|  | fillval = getfval("fillval"); | 
|  | else | 
|  | fillval = ap->a_val.f; | 
|  | break; | 
|  | case TEXTATTR: | 
|  | savetext(ap->a_sub, ap->a_val.p); | 
|  | break; | 
|  | } | 
|  | } | 
|  | if (with) { | 
|  | switch (with) { | 
|  | case NORTH:	ywith = -h / 2; break; | 
|  | case SOUTH:	ywith = h / 2; break; | 
|  | case EAST:	xwith = -w / 2; break; | 
|  | case WEST:	xwith = w / 2; break; | 
|  | case NE:	xwith = -w / 2; ywith = -h / 2; break; | 
|  | case SE:	xwith = -w / 2; ywith = h / 2; break; | 
|  | case NW:	xwith = w / 2; ywith = -h / 2; break; | 
|  | case SW:	xwith = w / 2; ywith = h / 2; break; | 
|  | } | 
|  | curx += xwith; | 
|  | cury += ywith; | 
|  | } | 
|  | if (!at) { | 
|  | if (isright(hvmode)) | 
|  | curx += w / 2; | 
|  | else if (isleft(hvmode)) | 
|  | curx -= w / 2; | 
|  | else if (isup(hvmode)) | 
|  | cury += h / 2; | 
|  | else | 
|  | cury -= h / 2; | 
|  | } | 
|  | x0 = curx - w / 2; | 
|  | y0 = cury - h / 2; | 
|  | x1 = curx + w / 2; | 
|  | y1 = cury + h / 2; | 
|  | extreme(x0, y0); | 
|  | extreme(x1, y1); | 
|  | p = makenode(BOX, 2); | 
|  | p->o_val[0] = w; | 
|  | p->o_val[1] = h; | 
|  | p->o_attr = battr; | 
|  | p->o_ddval = ddval; | 
|  | p->o_fillval = fillval; | 
|  | dprintf("B %g %g %g %g at %g %g, h=%g, w=%g\n", x0, y0, x1, y1, curx, cury, h, w); | 
|  | if (isright(hvmode)) | 
|  | curx = x1; | 
|  | else if (isleft(hvmode)) | 
|  | curx = x0; | 
|  | else if (isup(hvmode)) | 
|  | cury = y1; | 
|  | else | 
|  | cury = y0; | 
|  | prevh = h; | 
|  | prevw = w; | 
|  | return(p); | 
|  | } |