| #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 NOEDGE: |
| battr |= NOEDGEBIT; |
| 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); |
| } |