1 324891a5 2006-06-25 devnull #include <u.h>
2 324891a5 2006-06-25 devnull #include <libc.h>
3 324891a5 2006-06-25 devnull #include <draw.h>
4 324891a5 2006-06-25 devnull #include <memdraw.h>
6 324891a5 2006-06-25 devnull typedef struct Seg Seg;
8 324891a5 2006-06-25 devnull struct Seg
10 324891a5 2006-06-25 devnull Point p0;
11 324891a5 2006-06-25 devnull Point p1;
12 324891a5 2006-06-25 devnull long num;
13 324891a5 2006-06-25 devnull long den;
15 324891a5 2006-06-25 devnull long dzrem;
17 324891a5 2006-06-25 devnull long zerr;
21 324891a5 2006-06-25 devnull static void zsort(Seg **seg, Seg **ep);
22 324891a5 2006-06-25 devnull static int ycompare(const void*, const void*);
23 324891a5 2006-06-25 devnull static int xcompare(const void*, const void*);
24 324891a5 2006-06-25 devnull static int zcompare(const void*, const void*);
25 324891a5 2006-06-25 devnull static void xscan(Memimage *dst, Seg **seg, Seg *segtab, int nseg, int wind, Memimage *src, Point sp, int, int, int, int);
26 324891a5 2006-06-25 devnull static void yscan(Memimage *dst, Seg **seg, Seg *segtab, int nseg, int wind, Memimage *src, Point sp, int, int);
29 324891a5 2006-06-25 devnull static void
30 324891a5 2006-06-25 devnull fillcolor(Memimage *dst, int left, int right, int y, Memimage *src, Point p)
32 324891a5 2006-06-25 devnull int srcval;
34 324891a5 2006-06-25 devnull USED(src);
35 324891a5 2006-06-25 devnull srcval = p.x;
36 324891a5 2006-06-25 devnull p.x = left;
38 324891a5 2006-06-25 devnull memset(byteaddr(dst, p), srcval, right-left);
42 324891a5 2006-06-25 devnull static void
43 324891a5 2006-06-25 devnull fillline(Memimage *dst, int left, int right, int y, Memimage *src, Point p, int op)
45 324891a5 2006-06-25 devnull Rectangle r;
47 324891a5 2006-06-25 devnull r.min.x = left;
48 324891a5 2006-06-25 devnull r.min.y = y;
49 324891a5 2006-06-25 devnull r.max.x = right;
50 324891a5 2006-06-25 devnull r.max.y = y+1;
51 324891a5 2006-06-25 devnull p.x += left;
52 324891a5 2006-06-25 devnull p.y += y;
53 324891a5 2006-06-25 devnull memdraw(dst, r, src, p, memopaque, p, op);
56 324891a5 2006-06-25 devnull static void
57 324891a5 2006-06-25 devnull fillpoint(Memimage *dst, int x, int y, Memimage *src, Point p, int op)
59 324891a5 2006-06-25 devnull Rectangle r;
61 324891a5 2006-06-25 devnull r.min.x = x;
62 324891a5 2006-06-25 devnull r.min.y = y;
63 324891a5 2006-06-25 devnull r.max.x = x+1;
64 324891a5 2006-06-25 devnull r.max.y = y+1;
65 324891a5 2006-06-25 devnull p.x += x;
66 324891a5 2006-06-25 devnull p.y += y;
67 324891a5 2006-06-25 devnull memdraw(dst, r, src, p, memopaque, p, op);
71 324891a5 2006-06-25 devnull memfillpoly(Memimage *dst, Point *vert, int nvert, int w, Memimage *src, Point sp, int op)
73 324891a5 2006-06-25 devnull _memfillpolysc(dst, vert, nvert, w, src, sp, 0, 0, 0, op);
77 324891a5 2006-06-25 devnull _memfillpolysc(Memimage *dst, Point *vert, int nvert, int w, Memimage *src, Point sp, int detail, int fixshift, int clipped, int op)
79 324891a5 2006-06-25 devnull Seg **seg, *segtab;
80 324891a5 2006-06-25 devnull Point p0;
83 324891a5 2006-06-25 devnull if(nvert == 0)
86 324891a5 2006-06-25 devnull seg = malloc((nvert+2)*sizeof(Seg*));
87 324891a5 2006-06-25 devnull if(seg == nil)
89 324891a5 2006-06-25 devnull segtab = malloc((nvert+1)*sizeof(Seg));
90 324891a5 2006-06-25 devnull if(segtab == nil) {
91 324891a5 2006-06-25 devnull free(seg);
95 324891a5 2006-06-25 devnull sp.x = (sp.x - vert[0].x) >> fixshift;
96 324891a5 2006-06-25 devnull sp.y = (sp.y - vert[0].y) >> fixshift;
97 324891a5 2006-06-25 devnull p0 = vert[nvert-1];
98 324891a5 2006-06-25 devnull if(!fixshift) {
99 324891a5 2006-06-25 devnull p0.x <<= 1;
100 324891a5 2006-06-25 devnull p0.y <<= 1;
102 324891a5 2006-06-25 devnull for(i = 0; i < nvert; i++) {
103 324891a5 2006-06-25 devnull segtab[i].p0 = p0;
104 324891a5 2006-06-25 devnull p0 = vert[i];
105 324891a5 2006-06-25 devnull if(!fixshift) {
106 324891a5 2006-06-25 devnull p0.x <<= 1;
107 324891a5 2006-06-25 devnull p0.y <<= 1;
109 324891a5 2006-06-25 devnull segtab[i].p1 = p0;
110 324891a5 2006-06-25 devnull segtab[i].d = 1;
112 324891a5 2006-06-25 devnull if(!fixshift)
113 324891a5 2006-06-25 devnull fixshift = 1;
115 324891a5 2006-06-25 devnull xscan(dst, seg, segtab, nvert, w, src, sp, detail, fixshift, clipped, op);
116 324891a5 2006-06-25 devnull if(detail)
117 324891a5 2006-06-25 devnull yscan(dst, seg, segtab, nvert, w, src, sp, fixshift, op);
119 324891a5 2006-06-25 devnull free(seg);
120 324891a5 2006-06-25 devnull free(segtab);
123 324891a5 2006-06-25 devnull static long
124 324891a5 2006-06-25 devnull mod(long x, long y)
128 324891a5 2006-06-25 devnull z = x%y;
129 324891a5 2006-06-25 devnull if((long)(((ulong)z)^((ulong)y)) > 0 || z == 0)
130 324891a5 2006-06-25 devnull return z;
131 324891a5 2006-06-25 devnull return z + y;
134 324891a5 2006-06-25 devnull static long
135 324891a5 2006-06-25 devnull sdiv(long x, long y)
137 324891a5 2006-06-25 devnull if((long)(((ulong)x)^((ulong)y)) >= 0 || x == 0)
138 324891a5 2006-06-25 devnull return x/y;
140 324891a5 2006-06-25 devnull return (x+((y>>30)|1))/y-1;
143 324891a5 2006-06-25 devnull static long
144 324891a5 2006-06-25 devnull smuldivmod(long x, long y, long z, long *mod)
146 324891a5 2006-06-25 devnull vlong vx;
148 324891a5 2006-06-25 devnull if(x == 0 || y == 0){
149 324891a5 2006-06-25 devnull *mod = 0;
150 324891a5 2006-06-25 devnull return 0;
153 324891a5 2006-06-25 devnull vx *= y;
154 324891a5 2006-06-25 devnull *mod = vx % z;
155 324891a5 2006-06-25 devnull if(*mod < 0)
156 324891a5 2006-06-25 devnull *mod += z; /* z is always >0 */
157 324891a5 2006-06-25 devnull if((vx < 0) == (z < 0))
158 324891a5 2006-06-25 devnull return vx/z;
159 324891a5 2006-06-25 devnull return -((-vx)/z);
162 324891a5 2006-06-25 devnull static void
163 324891a5 2006-06-25 devnull xscan(Memimage *dst, Seg **seg, Seg *segtab, int nseg, int wind, Memimage *src, Point sp, int detail, int fixshift, int clipped, int op)
165 324891a5 2006-06-25 devnull long y, maxy, x, x2, xerr, xden, onehalf;
166 324891a5 2006-06-25 devnull Seg **ep, **next, **p, **q, *s;
167 324891a5 2006-06-25 devnull long n, i, iy, cnt, ix, ix2, minx, maxx;
168 324891a5 2006-06-25 devnull Point pt;
169 324891a5 2006-06-25 devnull void (*fill)(Memimage*, int, int, int, Memimage*, Point, int);
171 324891a5 2006-06-25 devnull fill = fillline;
173 324891a5 2006-06-25 devnull * This can only work on 8-bit destinations, since fillcolor is
174 324891a5 2006-06-25 devnull * just using memset on sp.x.
176 324891a5 2006-06-25 devnull * I'd rather not even enable it then, since then if the general
177 324891a5 2006-06-25 devnull * code is too slow, someone will come up with a better improvement
178 324891a5 2006-06-25 devnull * than this sleazy hack. -rsc
180 324891a5 2006-06-25 devnull if(clipped && (src->flags&Frepl) && src->depth==8 && Dx(src->r)==1 && Dy(src->r)==1) {
181 324891a5 2006-06-25 devnull fill = fillcolor;
182 324891a5 2006-06-25 devnull sp.x = membyteval(src);
186 324891a5 2006-06-25 devnull USED(clipped);
189 324891a5 2006-06-25 devnull for(i=0, s=segtab, p=seg; i<nseg; i++, s++) {
191 324891a5 2006-06-25 devnull if(s->p0.y == s->p1.y)
192 324891a5 2006-06-25 devnull continue;
193 324891a5 2006-06-25 devnull if(s->p0.y > s->p1.y) {
194 324891a5 2006-06-25 devnull pt = s->p0;
195 324891a5 2006-06-25 devnull s->p0 = s->p1;
196 324891a5 2006-06-25 devnull s->p1 = pt;
197 324891a5 2006-06-25 devnull s->d = -s->d;
199 324891a5 2006-06-25 devnull s->num = s->p1.x - s->p0.x;
200 324891a5 2006-06-25 devnull s->den = s->p1.y - s->p0.y;
201 324891a5 2006-06-25 devnull s->dz = sdiv(s->num, s->den) << fixshift;
202 324891a5 2006-06-25 devnull s->dzrem = mod(s->num, s->den) << fixshift;
203 324891a5 2006-06-25 devnull s->dz += sdiv(s->dzrem, s->den);
204 324891a5 2006-06-25 devnull s->dzrem = mod(s->dzrem, s->den);
207 324891a5 2006-06-25 devnull n = p-seg;
208 324891a5 2006-06-25 devnull if(n == 0)
211 324891a5 2006-06-25 devnull qsort(seg, p-seg , sizeof(Seg*), ycompare);
213 324891a5 2006-06-25 devnull onehalf = 0;
214 324891a5 2006-06-25 devnull if(fixshift)
215 324891a5 2006-06-25 devnull onehalf = 1 << (fixshift-1);
217 324891a5 2006-06-25 devnull minx = dst->clipr.min.x;
218 324891a5 2006-06-25 devnull maxx = dst->clipr.max.x;
220 324891a5 2006-06-25 devnull y = seg[0]->p0.y;
221 324891a5 2006-06-25 devnull if(y < (dst->clipr.min.y << fixshift))
222 324891a5 2006-06-25 devnull y = dst->clipr.min.y << fixshift;
223 324891a5 2006-06-25 devnull iy = (y + onehalf) >> fixshift;
224 324891a5 2006-06-25 devnull y = (iy << fixshift) + onehalf;
225 324891a5 2006-06-25 devnull maxy = dst->clipr.max.y << fixshift;
227 324891a5 2006-06-25 devnull ep = next = seg;
229 324891a5 2006-06-25 devnull while(y<maxy) {
230 324891a5 2006-06-25 devnull for(q = p = seg; p < ep; p++) {
232 324891a5 2006-06-25 devnull if(s->p1.y < y)
233 324891a5 2006-06-25 devnull continue;
234 324891a5 2006-06-25 devnull s->z += s->dz;
235 324891a5 2006-06-25 devnull s->zerr += s->dzrem;
236 324891a5 2006-06-25 devnull if(s->zerr >= s->den) {
238 324891a5 2006-06-25 devnull s->zerr -= s->den;
239 324891a5 2006-06-25 devnull if(s->zerr < 0 || s->zerr >= s->den)
240 324891a5 2006-06-25 devnull print("bad ratzerr1: %ld den %ld dzrem %ld\n", s->zerr, s->den, s->dzrem);
242 324891a5 2006-06-25 devnull *q++ = s;
245 324891a5 2006-06-25 devnull for(p = next; *p; p++) {
247 324891a5 2006-06-25 devnull if(s->p0.y >= y)
249 324891a5 2006-06-25 devnull if(s->p1.y < y)
250 324891a5 2006-06-25 devnull continue;
251 324891a5 2006-06-25 devnull s->z = s->p0.x;
252 324891a5 2006-06-25 devnull s->z += smuldivmod(y - s->p0.y, s->num, s->den, &s->zerr);
253 324891a5 2006-06-25 devnull if(s->zerr < 0 || s->zerr >= s->den)
254 324891a5 2006-06-25 devnull print("bad ratzerr2: %ld den %ld ratdzrem %ld\n", s->zerr, s->den, s->dzrem);
255 324891a5 2006-06-25 devnull *q++ = s;
258 324891a5 2006-06-25 devnull next = p;
260 324891a5 2006-06-25 devnull if(ep == seg) {
261 324891a5 2006-06-25 devnull if(*next == 0)
263 324891a5 2006-06-25 devnull iy = (next[0]->p0.y + onehalf) >> fixshift;
264 324891a5 2006-06-25 devnull y = (iy << fixshift) + onehalf;
265 324891a5 2006-06-25 devnull continue;
268 324891a5 2006-06-25 devnull zsort(seg, ep);
270 324891a5 2006-06-25 devnull for(p = seg; p < ep; p++) {
271 324891a5 2006-06-25 devnull cnt = 0;
272 324891a5 2006-06-25 devnull x = p[0]->z;
273 324891a5 2006-06-25 devnull xerr = p[0]->zerr;
274 324891a5 2006-06-25 devnull xden = p[0]->den;
275 324891a5 2006-06-25 devnull ix = (x + onehalf) >> fixshift;
276 324891a5 2006-06-25 devnull if(ix >= maxx)
278 324891a5 2006-06-25 devnull if(ix < minx)
279 324891a5 2006-06-25 devnull ix = minx;
280 324891a5 2006-06-25 devnull cnt += p[0]->d;
282 324891a5 2006-06-25 devnull for(;;) {
283 324891a5 2006-06-25 devnull if(p == ep) {
284 324891a5 2006-06-25 devnull print("xscan: fill to infinity");
287 324891a5 2006-06-25 devnull cnt += p[0]->d;
288 324891a5 2006-06-25 devnull if((cnt&wind) == 0)
292 324891a5 2006-06-25 devnull x2 = p[0]->z;
293 324891a5 2006-06-25 devnull ix2 = (x2 + onehalf) >> fixshift;
294 324891a5 2006-06-25 devnull if(ix2 <= minx)
295 324891a5 2006-06-25 devnull continue;
296 324891a5 2006-06-25 devnull if(ix2 > maxx)
297 324891a5 2006-06-25 devnull ix2 = maxx;
298 324891a5 2006-06-25 devnull if(ix == ix2 && detail) {
299 324891a5 2006-06-25 devnull if(xerr*p[0]->den + p[0]->zerr*xden > p[0]->den*xden)
301 324891a5 2006-06-25 devnull ix = (x + x2) >> (fixshift+1);
302 324891a5 2006-06-25 devnull ix2 = ix+1;
304 324891a5 2006-06-25 devnull (*fill)(dst, ix, ix2, iy, src, sp, op);
306 324891a5 2006-06-25 devnull y += (1<<fixshift);
311 324891a5 2006-06-25 devnull static void
312 324891a5 2006-06-25 devnull yscan(Memimage *dst, Seg **seg, Seg *segtab, int nseg, int wind, Memimage *src, Point sp, int fixshift, int op)
314 324891a5 2006-06-25 devnull long x, maxx, y, y2, yerr, yden, onehalf;
315 324891a5 2006-06-25 devnull Seg **ep, **next, **p, **q, *s;
316 324891a5 2006-06-25 devnull int n, i, ix, cnt, iy, iy2, miny, maxy;
317 324891a5 2006-06-25 devnull Point pt;
319 324891a5 2006-06-25 devnull for(i=0, s=segtab, p=seg; i<nseg; i++, s++) {
321 324891a5 2006-06-25 devnull if(s->p0.x == s->p1.x)
322 324891a5 2006-06-25 devnull continue;
323 324891a5 2006-06-25 devnull if(s->p0.x > s->p1.x) {
324 324891a5 2006-06-25 devnull pt = s->p0;
325 324891a5 2006-06-25 devnull s->p0 = s->p1;
326 324891a5 2006-06-25 devnull s->p1 = pt;
327 324891a5 2006-06-25 devnull s->d = -s->d;
329 324891a5 2006-06-25 devnull s->num = s->p1.y - s->p0.y;
330 324891a5 2006-06-25 devnull s->den = s->p1.x - s->p0.x;
331 324891a5 2006-06-25 devnull s->dz = sdiv(s->num, s->den) << fixshift;
332 324891a5 2006-06-25 devnull s->dzrem = mod(s->num, s->den) << fixshift;
333 324891a5 2006-06-25 devnull s->dz += sdiv(s->dzrem, s->den);
334 324891a5 2006-06-25 devnull s->dzrem = mod(s->dzrem, s->den);
337 324891a5 2006-06-25 devnull n = p-seg;
338 324891a5 2006-06-25 devnull if(n == 0)
341 324891a5 2006-06-25 devnull qsort(seg, n , sizeof(Seg*), xcompare);
343 324891a5 2006-06-25 devnull onehalf = 0;
344 324891a5 2006-06-25 devnull if(fixshift)
345 324891a5 2006-06-25 devnull onehalf = 1 << (fixshift-1);
347 324891a5 2006-06-25 devnull miny = dst->clipr.min.y;
348 324891a5 2006-06-25 devnull maxy = dst->clipr.max.y;
350 324891a5 2006-06-25 devnull x = seg[0]->p0.x;
351 324891a5 2006-06-25 devnull if(x < (dst->clipr.min.x << fixshift))
352 324891a5 2006-06-25 devnull x = dst->clipr.min.x << fixshift;
353 324891a5 2006-06-25 devnull ix = (x + onehalf) >> fixshift;
354 324891a5 2006-06-25 devnull x = (ix << fixshift) + onehalf;
355 324891a5 2006-06-25 devnull maxx = dst->clipr.max.x << fixshift;
357 324891a5 2006-06-25 devnull ep = next = seg;
359 324891a5 2006-06-25 devnull while(x<maxx) {
360 324891a5 2006-06-25 devnull for(q = p = seg; p < ep; p++) {
362 324891a5 2006-06-25 devnull if(s->p1.x < x)
363 324891a5 2006-06-25 devnull continue;
364 324891a5 2006-06-25 devnull s->z += s->dz;
365 324891a5 2006-06-25 devnull s->zerr += s->dzrem;
366 324891a5 2006-06-25 devnull if(s->zerr >= s->den) {
368 324891a5 2006-06-25 devnull s->zerr -= s->den;
369 324891a5 2006-06-25 devnull if(s->zerr < 0 || s->zerr >= s->den)
370 324891a5 2006-06-25 devnull print("bad ratzerr1: %ld den %ld ratdzrem %ld\n", s->zerr, s->den, s->dzrem);
372 324891a5 2006-06-25 devnull *q++ = s;
375 324891a5 2006-06-25 devnull for(p = next; *p; p++) {
377 324891a5 2006-06-25 devnull if(s->p0.x >= x)
379 324891a5 2006-06-25 devnull if(s->p1.x < x)
380 324891a5 2006-06-25 devnull continue;
381 324891a5 2006-06-25 devnull s->z = s->p0.y;
382 324891a5 2006-06-25 devnull s->z += smuldivmod(x - s->p0.x, s->num, s->den, &s->zerr);
383 324891a5 2006-06-25 devnull if(s->zerr < 0 || s->zerr >= s->den)
384 324891a5 2006-06-25 devnull print("bad ratzerr2: %ld den %ld ratdzrem %ld\n", s->zerr, s->den, s->dzrem);
385 324891a5 2006-06-25 devnull *q++ = s;
388 324891a5 2006-06-25 devnull next = p;
390 324891a5 2006-06-25 devnull if(ep == seg) {
391 324891a5 2006-06-25 devnull if(*next == 0)
393 324891a5 2006-06-25 devnull ix = (next[0]->p0.x + onehalf) >> fixshift;
394 324891a5 2006-06-25 devnull x = (ix << fixshift) + onehalf;
395 324891a5 2006-06-25 devnull continue;
398 324891a5 2006-06-25 devnull zsort(seg, ep);
400 324891a5 2006-06-25 devnull for(p = seg; p < ep; p++) {
401 324891a5 2006-06-25 devnull cnt = 0;
402 324891a5 2006-06-25 devnull y = p[0]->z;
403 324891a5 2006-06-25 devnull yerr = p[0]->zerr;
404 324891a5 2006-06-25 devnull yden = p[0]->den;
405 324891a5 2006-06-25 devnull iy = (y + onehalf) >> fixshift;
406 324891a5 2006-06-25 devnull if(iy >= maxy)
408 324891a5 2006-06-25 devnull if(iy < miny)
409 324891a5 2006-06-25 devnull iy = miny;
410 324891a5 2006-06-25 devnull cnt += p[0]->d;
412 324891a5 2006-06-25 devnull for(;;) {
413 324891a5 2006-06-25 devnull if(p == ep) {
414 324891a5 2006-06-25 devnull print("yscan: fill to infinity");
417 324891a5 2006-06-25 devnull cnt += p[0]->d;
418 324891a5 2006-06-25 devnull if((cnt&wind) == 0)
422 324891a5 2006-06-25 devnull y2 = p[0]->z;
423 324891a5 2006-06-25 devnull iy2 = (y2 + onehalf) >> fixshift;
424 324891a5 2006-06-25 devnull if(iy2 <= miny)
425 324891a5 2006-06-25 devnull continue;
426 324891a5 2006-06-25 devnull if(iy2 > maxy)
427 324891a5 2006-06-25 devnull iy2 = maxy;
428 324891a5 2006-06-25 devnull if(iy == iy2) {
429 324891a5 2006-06-25 devnull if(yerr*p[0]->den + p[0]->zerr*yden > p[0]->den*yden)
431 324891a5 2006-06-25 devnull iy = (y + y2) >> (fixshift+1);
432 324891a5 2006-06-25 devnull fillpoint(dst, ix, iy, src, sp, op);
435 324891a5 2006-06-25 devnull x += (1<<fixshift);
440 324891a5 2006-06-25 devnull static void
441 324891a5 2006-06-25 devnull zsort(Seg **seg, Seg **ep)
443 324891a5 2006-06-25 devnull int done;
444 324891a5 2006-06-25 devnull Seg **q, **p, *s;
446 324891a5 2006-06-25 devnull if(ep-seg < 20) {
447 324891a5 2006-06-25 devnull /* bubble sort by z - they should be almost sorted already */
450 324891a5 2006-06-25 devnull done = 1;
452 324891a5 2006-06-25 devnull for(p = seg; p < q; p++) {
453 324891a5 2006-06-25 devnull if(p[0]->z > p[1]->z) {
454 324891a5 2006-06-25 devnull s = p[0];
455 324891a5 2006-06-25 devnull p[0] = p[1];
456 324891a5 2006-06-25 devnull p[1] = s;
457 324891a5 2006-06-25 devnull done = 0;
460 324891a5 2006-06-25 devnull } while(!done);
461 324891a5 2006-06-25 devnull } else {
462 324891a5 2006-06-25 devnull q = ep-1;
463 324891a5 2006-06-25 devnull for(p = seg; p < q; p++) {
464 324891a5 2006-06-25 devnull if(p[0]->z > p[1]->z) {
465 324891a5 2006-06-25 devnull qsort(seg, ep-seg, sizeof(Seg*), zcompare);
472 324891a5 2006-06-25 devnull static int
473 324891a5 2006-06-25 devnull ycompare(const void *a, const void *b)
475 324891a5 2006-06-25 devnull Seg **s0, **s1;
476 324891a5 2006-06-25 devnull long y0, y1;
478 324891a5 2006-06-25 devnull s0 = (Seg**)a;
479 324891a5 2006-06-25 devnull s1 = (Seg**)b;
480 324891a5 2006-06-25 devnull y0 = (*s0)->p0.y;
481 324891a5 2006-06-25 devnull y1 = (*s1)->p0.y;
483 324891a5 2006-06-25 devnull if(y0 < y1)
484 324891a5 2006-06-25 devnull return -1;
485 324891a5 2006-06-25 devnull if(y0 == y1)
486 324891a5 2006-06-25 devnull return 0;
487 324891a5 2006-06-25 devnull return 1;
490 324891a5 2006-06-25 devnull static int
491 324891a5 2006-06-25 devnull xcompare(const void *a, const void *b)
493 324891a5 2006-06-25 devnull Seg **s0, **s1;
494 324891a5 2006-06-25 devnull long x0, x1;
496 324891a5 2006-06-25 devnull s0 = (Seg**)a;
497 324891a5 2006-06-25 devnull s1 = (Seg**)b;
498 324891a5 2006-06-25 devnull x0 = (*s0)->p0.x;
499 324891a5 2006-06-25 devnull x1 = (*s1)->p0.x;
501 324891a5 2006-06-25 devnull if(x0 < x1)
502 324891a5 2006-06-25 devnull return -1;
503 324891a5 2006-06-25 devnull if(x0 == x1)
504 324891a5 2006-06-25 devnull return 0;
505 324891a5 2006-06-25 devnull return 1;
508 324891a5 2006-06-25 devnull static int
509 324891a5 2006-06-25 devnull zcompare(const void *a, const void *b)
511 324891a5 2006-06-25 devnull Seg **s0, **s1;
512 324891a5 2006-06-25 devnull long z0, z1;
514 324891a5 2006-06-25 devnull s0 = (Seg**)a;
515 324891a5 2006-06-25 devnull s1 = (Seg**)b;
516 324891a5 2006-06-25 devnull z0 = (*s0)->z;
517 324891a5 2006-06-25 devnull z1 = (*s1)->z;
519 324891a5 2006-06-25 devnull if(z0 < z1)
520 324891a5 2006-06-25 devnull return -1;
521 324891a5 2006-06-25 devnull if(z0 == z1)
522 324891a5 2006-06-25 devnull return 0;
523 324891a5 2006-06-25 devnull return 1;