void fz_insert_gel(fz_gel *gel, float fx0, float fy0, float fx1, float fy1) { int x0, y0, x1, y1; int d, v; fx0 = floorf(fx0 * FZ_AA_HSCALE(gel->ctx)); fx1 = floorf(fx1 * FZ_AA_HSCALE(gel->ctx)); fy0 = floorf(fy0 * FZ_AA_VSCALE(gel->ctx)); fy1 = floorf(fy1 * FZ_AA_VSCALE(gel->ctx)); /* cf. http://code.google.com/p/sumatrapdf/issues/detail?id=1741 */ x0 = CLAMP(fx0, BBOX_MIN * FZ_AA_HSCALE(gel->ctx), BBOX_MAX * FZ_AA_HSCALE(gel->ctx)); y0 = CLAMP(fy0, BBOX_MIN * FZ_AA_VSCALE(gel->ctx), BBOX_MAX * FZ_AA_VSCALE(gel->ctx)); x1 = CLAMP(fx1, BBOX_MIN * FZ_AA_HSCALE(gel->ctx), BBOX_MAX * FZ_AA_HSCALE(gel->ctx)); y1 = CLAMP(fy1, BBOX_MIN * FZ_AA_VSCALE(gel->ctx), BBOX_MAX * FZ_AA_VSCALE(gel->ctx)); d = clip_lerp_y(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 = clip_lerp_y(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 = clip_lerp_x(gel->clip.x0, 0, x0, y0, x1, y1, &v); if (d == OUTSIDE) { x0 = x1 = gel->clip.x0; } if (d == LEAVE) { fz_insert_gel_raw(gel, gel->clip.x0, v, gel->clip.x0, y1); x1 = gel->clip.x0; y1 = v; } if (d == ENTER) { fz_insert_gel_raw(gel, gel->clip.x0, y0, gel->clip.x0, v); x0 = gel->clip.x0; y0 = v; } d = clip_lerp_x(gel->clip.x1, 1, x0, y0, x1, y1, &v); if (d == OUTSIDE) { x0 = x1 = gel->clip.x1; } if (d == LEAVE) { fz_insert_gel_raw(gel, gel->clip.x1, v, gel->clip.x1, y1); x1 = gel->clip.x1; y1 = v; } if (d == ENTER) { fz_insert_gel_raw(gel, gel->clip.x1, y0, gel->clip.x1, v); x0 = gel->clip.x1; y0 = v; } fz_insert_gel_raw(gel, x0, y0, x1, y1); }
void fz_insert_gel_rect(fz_context *ctx, fz_gel *gel, float fx0, float fy0, float fx1, float fy1) { int x0, y0, x1, y1; const int hscale = fz_aa_hscale; const int vscale = fz_aa_vscale; if (fx0 <= fx1) { fx0 = floorf(fx0 * hscale); fx1 = ceilf(fx1 * hscale); } else { fx0 = ceilf(fx0 * hscale); fx1 = floorf(fx1 * hscale); } if (fy0 <= fy1) { fy0 = floorf(fy0 * vscale); fy1 = ceilf(fy1 * vscale); } else { fy0 = ceilf(fy0 * vscale); fy1 = floorf(fy1 * vscale); } fx0 = fz_clamp(fx0, gel->clip.x0, gel->clip.x1); fx1 = fz_clamp(fx1, gel->clip.x0, gel->clip.x1); fy0 = fz_clamp(fy0, gel->clip.y0, gel->clip.y1); fy1 = fz_clamp(fy1, gel->clip.y0, gel->clip.y1); /* Call fz_clamp so that clamping is done in the float domain, THEN * cast down to an int. Calling fz_clampi causes problems due to the * implicit cast down from float to int of the first argument * over/underflowing and flipping sign at extreme values. */ x0 = (int)fz_clamp(fx0, BBOX_MIN * hscale, BBOX_MAX * hscale); y0 = (int)fz_clamp(fy0, BBOX_MIN * vscale, BBOX_MAX * vscale); x1 = (int)fz_clamp(fx1, BBOX_MIN * hscale, BBOX_MAX * hscale); y1 = (int)fz_clamp(fy1, BBOX_MIN * vscale, BBOX_MAX * vscale); fz_insert_gel_raw(ctx, gel, x1, y0, x1, y1); fz_insert_gel_raw(ctx, gel, x0, y1, x0, y0); }
void fz_insert_gel(fz_context *ctx, fz_gel *gel, float fx0, float fy0, float fx1, float fy1) { int x0, y0, x1, y1; int d, v; const int hscale = fz_aa_hscale; const int vscale = fz_aa_vscale; fx0 = floorf(fx0 * hscale); fx1 = floorf(fx1 * hscale); fy0 = floorf(fy0 * vscale); fy1 = floorf(fy1 * vscale); /* Call fz_clamp so that clamping is done in the float domain, THEN * cast down to an int. Calling fz_clampi causes problems due to the * implicit cast down from float to int of the first argument * over/underflowing and flipping sign at extreme values. */ x0 = (int)fz_clamp(fx0, BBOX_MIN * hscale, BBOX_MAX * hscale); y0 = (int)fz_clamp(fy0, BBOX_MIN * vscale, BBOX_MAX * vscale); x1 = (int)fz_clamp(fx1, BBOX_MIN * hscale, BBOX_MAX * hscale); y1 = (int)fz_clamp(fy1, BBOX_MIN * vscale, BBOX_MAX * vscale); d = clip_lerp_y(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 = clip_lerp_y(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 = clip_lerp_x(gel->clip.x0, 0, x0, y0, x1, y1, &v); if (d == OUTSIDE) { x0 = x1 = gel->clip.x0; } if (d == LEAVE) { fz_insert_gel_raw(ctx, gel, gel->clip.x0, v, gel->clip.x0, y1); x1 = gel->clip.x0; y1 = v; } if (d == ENTER) { fz_insert_gel_raw(ctx, gel, gel->clip.x0, y0, gel->clip.x0, v); x0 = gel->clip.x0; y0 = v; } d = clip_lerp_x(gel->clip.x1, 1, x0, y0, x1, y1, &v); if (d == OUTSIDE) { x0 = x1 = gel->clip.x1; } if (d == LEAVE) { fz_insert_gel_raw(ctx, gel, gel->clip.x1, v, gel->clip.x1, y1); x1 = gel->clip.x1; y1 = v; } if (d == ENTER) { fz_insert_gel_raw(ctx, gel, gel->clip.x1, y0, gel->clip.x1, v); x0 = gel->clip.x1; y0 = v; } fz_insert_gel_raw(ctx, gel, x0, y0, x1, y1); }