|
|
1.1 ! root 1: #ifndef MUX ! 2: #define Jcursinhibit() cursinhibit() ! 3: #define Jcursallow() cursallow() ! 4: #define lrectf(l, r, f) rectf(l, r, f) ! 5: #define lsegment(l, p, q, f) segment(l, p, q, f) ! 6: #endif ! 7: ! 8: #include <CC/jerq.h> ! 9: #define HUGE 017777777777 ! 10: #define sgn(x) ((x)<0? -1 : (x)==0? 0 : 1) ! 11: ! 12: #ifdef MUX ! 13: #define POINT Ivoid(26) /* really lpoint, but we're dealing with the cursor */ ! 14: #else ! 15: extern void point(); ! 16: #define POINT point ! 17: #endif ! 18: ! 19: static struct dist { ! 20: Point s; ! 21: Point m; ! 22: long e; ! 23: } d1, d2; ! 24: ! 25: static void ! 26: test(Point x, register struct dist *p) ! 27: { ! 28: register long dx = x.x - p->s.x; ! 29: register long dy = x.y - p->s.y; ! 30: register long e = dx*dx+dy*dy; ! 31: ! 32: if(e <= p->e) { ! 33: p->m = x; ! 34: p->e = e; ! 35: } ! 36: } ! 37: ! 38: static void ! 39: survey(Bitmap *, Point x, Code) ! 40: { ! 41: test(x, &d1); ! 42: test(x, &d2); ! 43: } ! 44: ! 45: static long emask, enext; ! 46: ! 47: static void ! 48: paint(Bitmap *bp, Point x, Code f) ! 49: { ! 50: if(enext&emask) POINT(bp, x, f); ! 51: enext <<= 1; ! 52: if(enext == 0) enext = 1; ! 53: } ! 54: ! 55: /* ! 56: * elarc(bp,p0,a,b,p1,p2,f) draws in bitmap bp an arc of the ellipse ! 57: * centered at p0 with half-axes a,b extending counterclockwise ! 58: * from a point near p1 to a point near p2 ! 59: * args reversed because ellip1 draws clockwise ! 60: */ ! 61: extern void ! 62: elarc(Bitmap *bp, Point p0, int a, int b, Point p1, Point p2, Code f, long mask) ! 63: { ! 64: short inhibited; ! 65: ! 66: emask = mask; ! 67: enext = 1; ! 68: inhibited=0; ! 69: if(f!=F_XOR){ ! 70: Jcursinhibit(); ! 71: inhibited=1; ! 72: } ! 73: if(a==0) ! 74: lsegment(bp, Pt(p0.x, p1.y), Pt(p0.x, p2.y), f); ! 75: else if(b==0) ! 76: lsegment(bp, Pt(p1.x, p0.y), Pt(p2.x, p0.y), f); ! 77: else { ! 78: int sx1; ! 79: int sy1; ! 80: int sx2; ! 81: int sy2; ! 82: ! 83: d1.s = sub(p1, p0); ! 84: d2.s = sub(p2, p0); ! 85: sx1 = sgn(d1.s.x); ! 86: sy1 = sgn(d1.s.y); ! 87: sx2 = sgn(d2.s.x); ! 88: sy2 = sgn(d2.s.y); ! 89: d1.s.x *= sx1; ! 90: d1.s.y *= sy1; ! 91: d2.s.x *= sx2; ! 92: d2.s.y *= sy2; ! 93: d1.e = d2.e = HUGE; ! 94: survey(bp, Pt(0, b), f); ! 95: ellip1(bp, Pt(0, 0), a, b, survey, Pt(0,b), Pt(a, 0), f); ! 96: if(d1.m != d2.m) ! 97: paint(bp, d1.m, f); ! 98: ellip1(bp, p0, a, b, paint, ! 99: Pt(d1.m.x*sx1, d1.m.y*sy1), Pt(d2.m.x*sx2, d2.m.y*sy2), f); ! 100: } ! 101: if(inhibited) ! 102: Jcursallow(); ! 103: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.