Blob
1 #include <stdio.h>2 #include "pic.h"3 #include "y.tab.h"5 obj *boxgen(void)6 {7 static double prevh = HT;8 static double prevw = WID; /* golden mean, sort of */9 int i, at, battr, with;10 double ddval, fillval, xwith, ywith;11 double h, w, x0, y0, x1, y1;12 obj *p, *ppos;13 Attr *ap;15 h = getfval("boxht");16 w = getfval("boxwid");17 at = battr = with = 0;18 ddval = fillval = xwith = ywith = 0;19 for (i = 0; i < nattr; i++) {20 ap = &attr[i];21 switch (ap->a_type) {22 case HEIGHT:23 h = ap->a_val.f;24 break;25 case WIDTH:26 w = ap->a_val.f;27 break;28 case SAME:29 h = prevh;30 w = prevw;31 break;32 case WITH:33 with = ap->a_val.i; /* corner */34 break;35 case AT:36 ppos = ap->a_val.o;37 curx = ppos->o_x;38 cury = ppos->o_y;39 at++;40 break;41 case INVIS:42 battr |= INVIS;43 break;44 case NOEDGE:45 battr |= NOEDGEBIT;46 break;47 case DOT:48 case DASH:49 battr |= ap->a_type==DOT ? DOTBIT : DASHBIT;50 if (ap->a_sub == DEFAULT)51 ddval = getfval("dashwid");52 else53 ddval = ap->a_val.f;54 break;55 case FILL:56 battr |= FILLBIT;57 if (ap->a_sub == DEFAULT)58 fillval = getfval("fillval");59 else60 fillval = ap->a_val.f;61 break;62 case TEXTATTR:63 savetext(ap->a_sub, ap->a_val.p);64 break;65 }66 }67 if (with) {68 switch (with) {69 case NORTH: ywith = -h / 2; break;70 case SOUTH: ywith = h / 2; break;71 case EAST: xwith = -w / 2; break;72 case WEST: xwith = w / 2; break;73 case NE: xwith = -w / 2; ywith = -h / 2; break;74 case SE: xwith = -w / 2; ywith = h / 2; break;75 case NW: xwith = w / 2; ywith = -h / 2; break;76 case SW: xwith = w / 2; ywith = h / 2; break;77 }78 curx += xwith;79 cury += ywith;80 }81 if (!at) {82 if (isright(hvmode))83 curx += w / 2;84 else if (isleft(hvmode))85 curx -= w / 2;86 else if (isup(hvmode))87 cury += h / 2;88 else89 cury -= h / 2;90 }91 x0 = curx - w / 2;92 y0 = cury - h / 2;93 x1 = curx + w / 2;94 y1 = cury + h / 2;95 extreme(x0, y0);96 extreme(x1, y1);97 p = makenode(BOX, 2);98 p->o_val[0] = w;99 p->o_val[1] = h;100 p->o_attr = battr;101 p->o_ddval = ddval;102 p->o_fillval = fillval;103 dprintf("B %g %g %g %g at %g %g, h=%g, w=%g\n", x0, y0, x1, y1, curx, cury, h, w);104 if (isright(hvmode))105 curx = x1;106 else if (isleft(hvmode))107 curx = x0;108 else if (isup(hvmode))109 cury = y1;110 else111 cury = y0;112 prevh = h;113 prevw = w;114 return(p);115 }