123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- #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 = ddval = 0;
- t = (type == CIRCLE) ? 0 : 1;
- 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 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;
- }
- }
- 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);
- }
|