|
|
1.1 ! root 1: #include <jerq.h> ! 2: #include <line.h> ! 3: static ! 4: code(p, r) ! 5: Point p; ! 6: Rectangle r; ! 7: { ! 8: return( (p.x<r.origin.x? 01 : p.x>=r.corner.x? 02 : 0) | ! 9: (p.y<r.origin.y? 04 : p.y>=r.corner.y?010 : 0)); ! 10: } ! 11: ! 12: /* ! 13: * Modified clip-to-rectangle algorithm ! 14: * works in bitmaps ! 15: * Everything in SCREEN coordinates. ! 16: * ! 17: * Newman & Sproull 124 (1st edition) ! 18: */ ! 19: Jclipline(b, r, p0, p1, f) ! 20: register Bitmap *b; ! 21: Rectangle r; ! 22: Point p0, p1; ! 23: { ! 24: register c0, c1; ! 25: register xl, xr, yt, yb; ! 26: Point temp; ! 27: int swapxy=0; ! 28: ! 29: if(!Jxmajor){ ! 30: #define XYswap(p) c0=p.x; p.x=p.y; p.y=c0 ! 31: XYswap(p0); XYswap(p1); XYswap(r.origin); XYswap(r.corner); ! 32: swapxy++; ! 33: } ! 34: xl=r.origin.x; xr=r.corner.x; ! 35: yt=r.origin.y; yb=r.corner.y; ! 36: c0=code(p0, r); ! 37: c1=code(p1, r); ! 38: while(c0|c1){ ! 39: if(c0&c1) ! 40: return; /* no point of line in r */ ! 41: if(c0==0){ /* swap points */ ! 42: short t; ! 43: temp=p0; p0=p1; p1=temp; ! 44: t=c0; c0=c1; c1=t; ! 45: } ! 46: if(c0==0) ! 47: break; ! 48: if(c0&01) /* push towards left edge */ ! 49: p0.y=Jminor(p0.x=xl); ! 50: else if(c0&02) /* push towards right edge */ ! 51: p0.y=Jminor(p0.x=xr-1); ! 52: else if(c0&04){ /* push towards top edge */ ! 53: if(Jslopeneg) ! 54: p0.x=Jmajor((p0.y=yt)-1)-1; ! 55: else{ ! 56: p0.y=yt; ! 57: p0.x=Jmajor(yt); ! 58: } ! 59: }else if(c0&010){ /* push towards bottom edge */ ! 60: if(Jslopeneg){ ! 61: p0.y=yb-1; ! 62: p0.x=Jmajor(yb-1); ! 63: } ! 64: else{ ! 65: p0.y=yb-1; ! 66: p0.x=Jmajor(yb)-1; ! 67: } ! 68: } ! 69: c0=code(p0, r); ! 70: } ! 71: if(swapxy){ ! 72: XYswap(p0); XYswap(p1); ! 73: } ! 74: _line(b, p0, p1, f); ! 75: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.