- int i;
- int topidx = 0, botidx = 0, sltop = pimg_fb.height, slbot = 0;
- struct pvertex *left, *right;
- uint16_t color = PACK_RGB16(pv[0].r, pv[0].g, pv[0].b);
-
- for(i=1; i<nverts; i++) {
- if(pv[i].y < pv[topidx].y) topidx = i;
- if(pv[i].y > pv[botidx].y) botidx = i;
- }
-
- left = (struct pvertex*)alloca(pimg_fb.height * sizeof *left);
- right = (struct pvertex*)alloca(pimg_fb.height * sizeof *right);
- memset(left, 0, pimg_fb.height * sizeof *left);
- memset(right, 0, pimg_fb.height * sizeof *right);
-
- for(i=0; i<nverts; i++) {
- int next = NEXTIDX(i);
- int32_t y0 = pv[i].y;
- int32_t y1 = pv[next].y;
-
- if((y0 >> 8) == (y1 >> 8)) {
- if(y0 > y1) {
- int idx = y0 >> 8;
- left[idx].x = pv[i].x < pv[next].x ? pv[i].x : pv[next].x;
- right[idx].x = pv[i].x < pv[next].x ? pv[next].x : pv[i].x;
- }
- } else {
- struct pvertex *edge = y0 > y1 ? left : right;
- uint32_t res = scan_edge(pv + i, pv + next, edge);
- uint32_t tmp = (res >> 16) & 0xffff;
- if(tmp > slbot) slbot = tmp;
- if((tmp = res & 0xffff) < sltop) {
- sltop = tmp;
- }
- }
- }
-
- for(i=sltop; i<=slbot; i++) {
- int32_t x;
- uint16_t *pixptr;
-
- x = left[i].x;
- pixptr = pimg_fb.pixels + i * pimg_fb.width + (x >> 8);
-
- while(x <= right[i].x) {
-#ifdef DEBUG_POLYFILL
- *pixptr++ += 15;
-#else
- *pixptr++ = color;
-#endif
- x += 256;
- }
- }