if(pv[i].y > pv[botidx].y) botidx = i;
}
- left = alloca(pfill_fb.height * sizeof *left);
- right = alloca(pfill_fb.height * sizeof *right);
+ int winding = 0;
+ for(i=0; i<nverts; i++) {
+ int next = NEXTIDX(i);
+ winding += (pv[next].x - pv[i].x) * (pv[next].y + pv[i].y);
+ }
+
+ /* +1 to avoid crashing due to off-by-one rounding errors in the rasterization */
+ left = alloca((pfill_fb.height + 1) * sizeof *left);
+ right = alloca((pfill_fb.height + 1) * sizeof *right);
for(i=0; i<nverts; i++) {
int next = NEXTIDX(i);
if(idx < sltop) sltop = idx;
/*}*/
} else {
- struct pvertex *edge = y0 > y1 ? left : right;
- uint32_t res = SCANEDGE(pv + i, pv + next, edge);
- uint32_t tmp = (res >> 16) & 0xffff;
+ struct pvertex *edge;
+ uint32_t res, tmp;
+
+ if(winding < 0) {
+ edge = y0 > y1 ? left : right;
+ } else {
+ edge = y0 > y1 ? right : left;
+ }
+ res = SCANEDGE(pv + i, pv + next, edge);
+ tmp = (res >> 16) & 0xffff;
if(tmp > slbot) slbot = tmp;
if((tmp = res & 0xffff) < sltop) {
sltop = tmp;