|
|
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.