void fz_insertgel(fz_gel *gel, float fx0, float fy0, float fx1, float fy1) { int x0, y0, x1, y1; int d, v; fx0 = floorf(fx0 * HSCALE); fx1 = floorf(fx1 * HSCALE); fy0 = floorf(fy0 * VSCALE); fy1 = floorf(fy1 * VSCALE); x0 = CLAMP(fx0, BBOX_MIN, BBOX_MAX); y0 = CLAMP(fy0, BBOX_MIN, BBOX_MAX); x1 = CLAMP(fx1, BBOX_MIN, BBOX_MAX); y1 = CLAMP(fy1, BBOX_MIN, BBOX_MAX); d = cliplerpy(gel->clip.y0, 0, x0, y0, x1, y1, &v); if (d == OUTSIDE) return; if (d == LEAVE) { y1 = gel->clip.y0; x1 = v; } if (d == ENTER) { y0 = gel->clip.y0; x0 = v; } d = cliplerpy(gel->clip.y1, 1, x0, y0, x1, y1, &v); if (d == OUTSIDE) return; if (d == LEAVE) { y1 = gel->clip.y1; x1 = v; } if (d == ENTER) { y0 = gel->clip.y1; x0 = v; } d = cliplerpx(gel->clip.x0, 0, x0, y0, x1, y1, &v); if (d == OUTSIDE) { x0 = x1 = gel->clip.x0; } if (d == LEAVE) { fz_insertgelraw(gel, gel->clip.x0, v, gel->clip.x0, y1); x1 = gel->clip.x0; y1 = v; } if (d == ENTER) { fz_insertgelraw(gel, gel->clip.x0, y0, gel->clip.x0, v); x0 = gel->clip.x0; y0 = v; } d = cliplerpx(gel->clip.x1, 1, x0, y0, x1, y1, &v); if (d == OUTSIDE) { x0 = x1 = gel->clip.x1; } if (d == LEAVE) { fz_insertgelraw(gel, gel->clip.x1, v, gel->clip.x1, y1); x1 = gel->clip.x1; y1 = v; } if (d == ENTER) { fz_insertgelraw(gel, gel->clip.x1, y0, gel->clip.x1, v); x0 = gel->clip.x1; y0 = v; } fz_insertgelraw(gel, x0, y0, x1, y1); }
void fz_insertgel(fz_gel *gel, float fx0, float fy0, float fx1, float fy1) { fz_edge *edge; int dx, dy; int winding; int width; int tmp; int v; int d; int x0 = floor(fx0 * HSCALE); int y0 = floor(fy0 * VSCALE); int x1 = floor(fx1 * HSCALE); int y1 = floor(fy1 * VSCALE); d = cliplerpy(gel->clip.y0, 0, x0, y0, x1, y1, &v); if (d == OUTSIDE) return; if (d == LEAVE) { y1 = gel->clip.y0; x1 = v; } if (d == ENTER) { y0 = gel->clip.y0; x0 = v; } d = cliplerpy(gel->clip.y1, 1, x0, y0, x1, y1, &v); if (d == OUTSIDE) return; if (d == LEAVE) { y1 = gel->clip.y1; x1 = v; } if (d == ENTER) { y0 = gel->clip.y1; x0 = v; } if (y0 == y1) return; if (y0 > y1) { winding = -1; tmp = x0; x0 = x1; x1 = tmp; tmp = y0; y0 = y1; y1 = tmp; } else winding = 1; if (x0 < gel->bbox.x0) gel->bbox.x0 = x0; if (x0 > gel->bbox.x1) gel->bbox.x1 = x0; if (x1 < gel->bbox.x0) gel->bbox.x0 = x1; if (x1 > gel->bbox.x1) gel->bbox.x1 = x1; if (y0 < gel->bbox.y0) gel->bbox.y0 = y0; if (y1 > gel->bbox.y1) gel->bbox.y1 = y1; if (gel->len + 1 == gel->cap) { gel->cap = gel->cap + 512; gel->edges = fz_realloc(gel->edges, sizeof(fz_edge) * gel->cap); } edge = &gel->edges[gel->len++]; dy = y1 - y0; dx = x1 - x0; width = dx < 0 ? -dx : dx; edge->xdir = dx > 0 ? 1 : -1; edge->ydir = winding; edge->x = x0; edge->y = y0; edge->h = dy; edge->adjdown = dy; /* initial error term going l->r and r->l */ if (dx >= 0) edge->e = 0; else edge->e = -dy + 1; /* y-major edge */ if (dy >= width) { edge->xmove = 0; edge->adjup = width; } /* x-major edge */ else { edge->xmove = (width / dy) * edge->xdir; edge->adjup = width % dy; } }