fz_bbox fz_boundgel(fz_gel *gel) { fz_bbox bbox; bbox.x0 = fz_idiv(gel->bbox.x0, HSCALE); bbox.y0 = fz_idiv(gel->bbox.y0, VSCALE); bbox.x1 = fz_idiv(gel->bbox.x1, HSCALE) + 1; bbox.y1 = fz_idiv(gel->bbox.y1, VSCALE) + 1; return bbox; }
fz_bbox fz_boundgel(fz_gel *gel) { fz_bbox bbox; if (gel->len == 0) return fz_emptybbox; bbox.x0 = fz_idiv(gel->bbox.x0, HSCALE); bbox.y0 = fz_idiv(gel->bbox.y0, VSCALE); bbox.x1 = fz_idiv(gel->bbox.x1, HSCALE) + 1; bbox.y1 = fz_idiv(gel->bbox.y1, VSCALE) + 1; return bbox; }
fz_bbox fz_bound_gel(fz_gel *gel) { fz_bbox bbox; if (gel->len == 0) return fz_empty_bbox; bbox.x0 = fz_idiv(gel->bbox.x0, FZ_AA_HSCALE(gel->ctx)); bbox.y0 = fz_idiv(gel->bbox.y0, FZ_AA_VSCALE(gel->ctx)); bbox.x1 = fz_idiv(gel->bbox.x1, FZ_AA_HSCALE(gel->ctx)) + 1; bbox.y1 = fz_idiv(gel->bbox.y1, FZ_AA_VSCALE(gel->ctx)) + 1; return bbox; }
static fz_irect fz_clip_rasterizer(fz_context *ctx, const fz_rasterizer *rast) { fz_irect r; const int hscale = fz_rasterizer_aa_hscale(rast); const int vscale = fz_rasterizer_aa_vscale(rast); r.x0 = fz_idiv(rast->clip.x0, hscale); r.y0 = fz_idiv(rast->clip.y0, vscale); r.x1 = fz_idiv_up(rast->clip.x1, hscale); r.y1 = fz_idiv_up(rast->clip.y1, vscale); return r; }
fz_irect * fz_bound_gel(fz_context *ctx, const fz_gel *gel, fz_irect *bbox) { const int hscale = fz_aa_hscale; const int vscale = fz_aa_vscale; if (gel->len == 0) { *bbox = fz_empty_irect; } else { bbox->x0 = fz_idiv(gel->bbox.x0, hscale); bbox->y0 = fz_idiv(gel->bbox.y0, vscale); bbox->x1 = fz_idiv(gel->bbox.x1, hscale) + 1; bbox->y1 = fz_idiv(gel->bbox.y1, vscale) + 1; } return bbox; }
fz_irect fz_bound_rasterizer(fz_context *ctx, const fz_rasterizer *rast) { fz_irect bbox; const int hscale = fz_rasterizer_aa_hscale(rast); const int vscale = fz_rasterizer_aa_vscale(rast); if (rast->bbox.x1 < rast->bbox.x0 || rast->bbox.y1 < rast->bbox.y0) { bbox = fz_empty_irect; } else { bbox.x0 = fz_idiv(rast->bbox.x0, hscale); bbox.y0 = fz_idiv(rast->bbox.y0, vscale); bbox.x1 = fz_idiv_up(rast->bbox.x1, hscale); bbox.y1 = fz_idiv_up(rast->bbox.y1, vscale); } return bbox; }
fz_error fz_scanconvert(fz_gel *gel, fz_ael *ael, int eofill, fz_bbox clip, fz_pixmap *dest, unsigned char *color) { fz_error error; unsigned char *deltas; int y, e; int yd, yc; int xmin = fz_idiv(gel->bbox.x0, HSCALE); int xmax = fz_idiv(gel->bbox.x1, HSCALE) + 1; int xofs = xmin * HSCALE; int skipx = clip.x0 - xmin; int clipn = clip.x1 - clip.x0; if (gel->len == 0) return fz_okay; assert(clip.x0 >= xmin); assert(clip.x1 <= xmax); deltas = fz_malloc(xmax - xmin + 1); memset(deltas, 0, xmax - xmin + 1); e = 0; y = gel->edges[0].y; yc = fz_idiv(y, VSCALE); yd = yc; while (ael->len > 0 || e < gel->len) { yc = fz_idiv(y, VSCALE); if (yc != yd) { if (yd >= clip.y0 && yd < clip.y1) { undelta(deltas, skipx + clipn); blit(dest, xmin + skipx, yd, deltas + skipx, clipn, color); memset(deltas, 0, skipx + clipn); } } yd = yc; error = insertael(ael, gel, y, &e); if (error) { fz_free(deltas); return error; } if (yd >= clip.y0 && yd < clip.y1) { if (eofill) evenodd(ael, deltas, xofs); else nonzerowinding(ael, deltas, xofs); } advanceael(ael); if (ael->len > 0) y ++; else if (e < gel->len) y = gel->edges[e].y; } if (yd >= clip.y0 && yd < clip.y1) { undelta(deltas, skipx + clipn); blit(dest, xmin + skipx, yd, deltas + skipx, clipn, color); } fz_free(deltas); return fz_okay; }