| #include <stdio.h> |
| #include "pic.h" |
| #include "y.tab.h" |
| |
| obj* |
| circgen(int type) |
| { |
| static double rad[2] = { HT2, WID2 }; |
| static double rad2[2] = { HT2, HT2 }; |
| int i, at, t, with, battr; |
| double xwith, ywith; |
| double r, r2, ddval, fillval; |
| obj *p, *ppos; |
| Attr *ap; |
| |
| battr = at = 0; |
| with = xwith = ywith = fillval = 0; |
| t = (type == CIRCLE) ? 0 : 1; |
| r = 0; |
| r2 = 0; |
| ddval = 0; |
| if (type == CIRCLE) |
| r = r2 = getfval("circlerad"); |
| else if (type == ELLIPSE) { |
| r = getfval("ellipsewid") / 2; |
| r2 = getfval("ellipseht") / 2; |
| } |
| for (i = 0; i < nattr; i++) { |
| ap = &attr[i]; |
| switch (ap->a_type) { |
| case TEXTATTR: |
| savetext(ap->a_sub, ap->a_val.p); |
| break; |
| case RADIUS: |
| r = ap->a_val.f; |
| break; |
| case DIAMETER: |
| case WIDTH: |
| r = ap->a_val.f / 2; |
| break; |
| case HEIGHT: |
| r2 = ap->a_val.f / 2; |
| break; |
| case SAME: |
| r = rad[t]; |
| r2 = rad2[t]; |
| break; |
| case WITH: |
| with = ap->a_val.i; |
| 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; |
| } |
| } |
| if (type == CIRCLE) |
| r2 = r; /* probably superfluous */ |
| if (with) { |
| switch (with) { |
| case NORTH: ywith = -r2; break; |
| case SOUTH: ywith = r2; break; |
| case EAST: xwith = -r; break; |
| case WEST: xwith = r; break; |
| case NE: xwith = -r * 0.707; ywith = -r2 * 0.707; break; |
| case SE: xwith = -r * 0.707; ywith = r2 * 0.707; break; |
| case NW: xwith = r * 0.707; ywith = -r2 * 0.707; break; |
| case SW: xwith = r * 0.707; ywith = r2 * 0.707; break; |
| } |
| curx += xwith; |
| cury += ywith; |
| } |
| if (!at) { |
| if (isright(hvmode)) |
| curx += r; |
| else if (isleft(hvmode)) |
| curx -= r; |
| else if (isup(hvmode)) |
| cury += r2; |
| else |
| cury -= r2; |
| } |
| p = makenode(type, 2); |
| p->o_val[0] = rad[t] = r; |
| p->o_val[1] = rad2[t] = r2; |
| if (r <= 0 || r2 <= 0) { |
| ERROR "%s has invalid radius %g\n", (type==CIRCLE) ? "circle" : "ellipse", r<r2 ? r : r2 WARNING; |
| } |
| p->o_attr = battr; |
| p->o_ddval = ddval; |
| p->o_fillval = fillval; |
| extreme(curx+r, cury+r2); |
| extreme(curx-r, cury-r2); |
| if (type == CIRCLE) |
| dprintf("C %g %g %g\n", curx, cury, r); |
| if (type == ELLIPSE) |
| dprintf("E %g %g %g %g\n", curx, cury, r, r2); |
| if (isright(hvmode)) |
| curx += r; |
| else if (isleft(hvmode)) |
| curx -= r; |
| else if (isup(hvmode)) |
| cury += r2; |
| else |
| cury -= r2; |
| return(p); |
| } |