45 #define CODE(x,y,c) c = 0;\ 68 *yi = y1 + ((e - x1) * (y2 - y1))/(x2 - x1);
85 *xi = x1 + ((e - y1) * (x2 - x1))/(y2 - y1);
91 int *pX1,*pY1,*pX2,*pY2,
l,b,
r,
t;
106 while(c1 != 0 || c2 != 0) {
107 if((c1 & c2) != 0)
return(
true);
108 if((c = c1) == 0) c = c2;
110 y = y1+(y2-y1)*(l-x1)/(x2-x1);
114 y = y1+(y2-y1)*(r-x1)/(x2-x1);
118 x = x1+(x2-x1)*(b-y1)/(y2-y1);
122 x = x1+(x2-x1)*(t-y1)/(y2-y1);
126 x1 = x; y1 = y;
CODE(x,y,c1)
129 x2 = x; y2 = y;
CODE(x,y,c2)
132 *pX1 = x1; *pY1 = y1;
133 *pX2 = x2; *pY2 = y2;
141 int top,bottom,left,right;
151 int minx, miny, maxx, maxy;
158 n = poly->nvertices << 1;
163 minx = maxx = poly->xy[0];
164 miny = maxy = poly->xy[1];
166 p2.
xy[i] = poly->xy[i];
170 p2.
xy[i] = poly->xy[i];
177 if(maxx < left || minx > right || maxy < bottom || miny > top)
184 while(p2.
xy[i] > right && i < n) i += 2;
186 p1.
xy[k++] = p2.
xy[i++];
187 p1.
xy[k++] = p2.
xy[i++];
197 if(p2.
xy[i] <= right){
198 p1.
xy[k++] = p2.
xy[i++];
199 p1.
xy[k++] = p2.
xy[i++];
202 if(p2.
xy[i-2] != right){
207 while(i < n && p2.
xy[i] > right) i += 2;
208 if(i < n && p2.
xy[i] <= right){
215 if((p2.
xy[0] > right && p2.
xy[n-2] <= right) ||
216 (p2.
xy[0] <= right && p2.
xy[n-2] > right)){
231 while(p2.
xy[i] < left && i < n) i += 2;
233 p1.
xy[k++] = p2.
xy[i++];
234 p1.
xy[k++] = p2.
xy[i++];
244 if(p2.
xy[i] >= left){
245 p1.
xy[k++] = p2.
xy[i++];
246 p1.
xy[k++] = p2.
xy[i++];
249 if(p2.
xy[i-2] != left){
254 while(i < n && p2.
xy[i] < left) i += 2;
255 if(i < n && p2.
xy[i] >= left){
262 if((p2.
xy[0] < left && p2.
xy[n-2] >= left) ||
263 (p2.
xy[0] >= left && p2.
xy[n-2] < left)){
278 while(p2.
xy[i+1] > top && i < n) i += 2;
280 p1.
xy[k++] = p2.
xy[i++];
281 p1.
xy[k++] = p2.
xy[i++];
291 if(p2.
xy[i+1] <= top){
292 p1.
xy[k++] = p2.
xy[i++];
293 p1.
xy[k++] = p2.
xy[i++];
296 if(p2.
xy[i-1] != top){
301 while(i < n && p2.
xy[i+1] > top) i += 2;
302 if(i < n && p2.
xy[i+1] <= top){
309 if((p2.
xy[1] > top && p2.
xy[n-1] <= top) ||
310 (p2.
xy[1] <= top && p2.
xy[n-1] > top)){
325 while(p2.
xy[i+1] < bottom && i < n) i += 2;
327 p1.
xy[k++] = p2.
xy[i++];
328 p1.
xy[k++] = p2.
xy[i++];
338 if(p2.
xy[i+1] >= bottom){
339 p1.
xy[k++] = p2.
xy[i++];
340 p1.
xy[k++] = p2.
xy[i++];
343 if(p2.
xy[i-1] != bottom){
348 while(i < n && p2.
xy[i+1] < bottom) i += 2;
349 if(i < n && p2.
xy[i+1] >= bottom){
356 if((p2.
xy[1] < bottom && p2.
xy[n-1] >= bottom) ||
357 (p2.
xy[1] >= bottom && p2.
xy[n-1] < bottom)){
364 poly->nvertices = k >> 1;
369 for(i=0; i<k; i += 2){
380 int left,bottom,right,top;
385 int n,x1,y1,x2,y2,lastX,lastY,newX,newY,pathnum=0;
401 while(n < path->nvertices){
402 newX = path->xy[n + n];
403 newY = path->xy[n + n + 1];
406 if(left <= newX && right >= newX && bottom <= newY && top >= newY)
417 if(
MFBLineClip(&x1,&y1,&x2,&y2,left,bottom,right,top))
420 pbuf[pathnum].
xy[0] = x1;
421 pbuf[pathnum].
xy[1] = y1;
422 pbuf[pathnum].
xy[2] = x2;
423 pbuf[pathnum].
xy[3] = y2;
427 pbuf[pathnum].
xy[0] = newX;
428 pbuf[pathnum].
xy[1] = newY;
431 while(n < path->nvertices && pathnum < 5){
432 x1 = lastX = newX; y1 = lastY = newY;
433 x2 = newX = path->xy[n + n]; y2 = newY = path->xy[n + n + 1];
435 MFBLineClip(&x1,&y1,&x2,&y2,left,bottom,right,top);
437 if(left < lastX && right > lastX && bottom < lastY && top > lastY){
442 else if(left < newX && right > newX && bottom < newY && top > newY){
444 pbuf[pathnum].
xy[0] = x1; pbuf[pathnum].
xy[1] = y1;
445 pbuf[pathnum].
xy[2] = x2; pbuf[pathnum].
xy[3] = y2;
451 pbuf[n].nvertices /= 2;
MFBPATH * MFBClipArc(MFBPATH *path, int left, int bottom, int right, int top)
#define MFBPOLYGONBUFSIZE
Bool MFBLineClip(int *pX1, int *pY1, int *pX2, int *pY2, int l, int b, int r, int t)
void MFB_X_Intercept(int x1, int y1, int x2, int y2, int e, int *xi)
#define MFBSwapInt(f1, f2)
void MFBPolygonClip(MFBPOLYGON *poly, int left, int bottom, int right, int top)
void MFB_Y_Intercept(int x1, int y1, int x2, int y2, int e, int *yi)