|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include "pic.h" ! 3: #include "y.tab.h" ! 4: ! 5: obj *circgen(int type) ! 6: { ! 7: static double rad[2] = { HT2, WID2 }; ! 8: static double rad2[2] = { HT2, HT2 }; ! 9: int i, at, t, with, battr; ! 10: double xwith, ywith; ! 11: double r, r2, ddval, fillval; ! 12: obj *p, *ppos; ! 13: Attr *ap; ! 14: ! 15: battr = at = 0; ! 16: with = xwith = ywith = fillval = ddval = 0; ! 17: t = (type == CIRCLE) ? 0 : 1; ! 18: if (type == CIRCLE) ! 19: r = r2 = getfval("circlerad"); ! 20: else if (type == ELLIPSE) { ! 21: r = getfval("ellipsewid") / 2; ! 22: r2 = getfval("ellipseht") / 2; ! 23: } ! 24: for (i = 0; i < nattr; i++) { ! 25: ap = &attr[i]; ! 26: switch (ap->a_type) { ! 27: case TEXTATTR: ! 28: savetext(ap->a_sub, ap->a_val.p); ! 29: break; ! 30: case RADIUS: ! 31: r = ap->a_val.f; ! 32: break; ! 33: case DIAMETER: ! 34: case WIDTH: ! 35: r = ap->a_val.f / 2; ! 36: break; ! 37: case HEIGHT: ! 38: r2 = ap->a_val.f / 2; ! 39: break; ! 40: case SAME: ! 41: r = rad[t]; ! 42: r2 = rad2[t]; ! 43: break; ! 44: case WITH: ! 45: with = ap->a_val.i; ! 46: break; ! 47: case AT: ! 48: ppos = ap->a_val.o; ! 49: curx = ppos->o_x; ! 50: cury = ppos->o_y; ! 51: at++; ! 52: break; ! 53: case INVIS: ! 54: battr |= INVIS; ! 55: break; ! 56: case NOEDGE: ! 57: battr |= NOEDGEBIT; ! 58: break; ! 59: case DOT: ! 60: case DASH: ! 61: battr |= ap->a_type==DOT ? DOTBIT : DASHBIT; ! 62: if (ap->a_sub == DEFAULT) ! 63: ddval = getfval("dashwid"); ! 64: else ! 65: ddval = ap->a_val.f; ! 66: break; ! 67: case FILL: ! 68: battr |= FILLBIT; ! 69: if (ap->a_sub == DEFAULT) ! 70: fillval = getfval("fillval"); ! 71: else ! 72: fillval = ap->a_val.f; ! 73: break; ! 74: } ! 75: } ! 76: if (type == CIRCLE) ! 77: r2 = r; /* probably superfluous */ ! 78: if (with) { ! 79: switch (with) { ! 80: case NORTH: ywith = -r2; break; ! 81: case SOUTH: ywith = r2; break; ! 82: case EAST: xwith = -r; break; ! 83: case WEST: xwith = r; break; ! 84: case NE: xwith = -r * 0.707; ywith = -r2 * 0.707; break; ! 85: case SE: xwith = -r * 0.707; ywith = r2 * 0.707; break; ! 86: case NW: xwith = r * 0.707; ywith = -r2 * 0.707; break; ! 87: case SW: xwith = r * 0.707; ywith = r2 * 0.707; break; ! 88: } ! 89: curx += xwith; ! 90: cury += ywith; ! 91: } ! 92: if (!at) { ! 93: if (isright(hvmode)) ! 94: curx += r; ! 95: else if (isleft(hvmode)) ! 96: curx -= r; ! 97: else if (isup(hvmode)) ! 98: cury += r2; ! 99: else ! 100: cury -= r2; ! 101: } ! 102: p = makenode(type, 2); ! 103: p->o_val[0] = rad[t] = r; ! 104: p->o_val[1] = rad2[t] = r2; ! 105: if (r <= 0 || r2 <= 0) { ! 106: ERROR "%s has invalid radius %g\n", (type==CIRCLE) ? "circle" : "ellipse", r<r2 ? r : r2 WARNING; ! 107: } ! 108: p->o_attr = battr; ! 109: p->o_ddval = ddval; ! 110: p->o_fillval = fillval; ! 111: extreme(curx+r, cury+r2); ! 112: extreme(curx-r, cury-r2); ! 113: if (type == CIRCLE) ! 114: dprintf("C %g %g %g\n", curx, cury, r); ! 115: if (type == ELLIPSE) ! 116: dprintf("E %g %g %g %g\n", curx, cury, r, r2); ! 117: if (isright(hvmode)) ! 118: curx += r; ! 119: else if (isleft(hvmode)) ! 120: curx -= r; ! 121: else if (isup(hvmode)) ! 122: cury += r2; ! 123: else ! 124: cury -= r2; ! 125: return(p); ! 126: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.