diff options
Diffstat (limited to 'source/fitz/draw-rasterize.c')
-rw-r--r-- | source/fitz/draw-rasterize.c | 180 |
1 files changed, 112 insertions, 68 deletions
diff --git a/source/fitz/draw-rasterize.c b/source/fitz/draw-rasterize.c index 2231801e..63a9d0b2 100644 --- a/source/fitz/draw-rasterize.c +++ b/source/fitz/draw-rasterize.c @@ -47,94 +47,117 @@ fz_text_aa_level(fz_context *ctx) return fz_aa_text_bits; } -#ifndef AA_BITS -static void -set_gfx_level(fz_context *ctx, int level) +int +fz_rasterizer_graphics_aa_level(fz_rasterizer *ras) +{ + return fz_rasterizer_aa_bits(ras); +} + +int +fz_rasterizer_text_aa_level(fz_rasterizer *ras) { + return fz_rasterizer_aa_text_bits(ras); +} + +void +fz_set_rasterizer_text_aa_level(fz_context *ctx, fz_aa_context *aa, int level) +{ +#ifdef AA_BITS + if (level != fz_aa_bits) + { + if (fz_aa_bits == 10) + fz_warn(ctx, "Only the Any-part-of-a-pixel rasterizer was compiled in"); + else if (fz_aa_bits == 9) + fz_warn(ctx, "Only the Centre-of-a-pixel rasterizer was compiled in"); + else + fz_warn(ctx, "Only the %d bit anti-aliasing rasterizer was compiled in", fz_aa_bits); + } +#else + if (level > 6) + aa->text_bits = 8; + else if (level > 4) + aa->text_bits = 6; + else if (level > 2) + aa->text_bits = 4; + else if (level > 0) + aa->text_bits = 2; + else + aa->text_bits = 0; +#endif +} + +void +fz_set_rasterizer_graphics_aa_level(fz_context *ctx, fz_aa_context *aa, int level) +{ +#ifdef AA_BITS + if (level != fz_aa_bits) + { + if (fz_aa_bits == 10) + fz_warn(ctx, "Only the Any-part-of-a-pixel rasterizer was compiled in"); + else if (fz_aa_bits == 9) + fz_warn(ctx, "Only the Centre-of-a-pixel rasterizer was compiled in"); + else + fz_warn(ctx, "Only the %d bit anti-aliasing rasterizer was compiled in", fz_aa_bits); + } +#else if (level == 9 || level == 10) { - fz_aa_hscale = 1; - fz_aa_vscale = 1; - fz_aa_bits = level; + aa->hscale = 1; + aa->vscale = 1; + aa->bits = level; } else if (level > 6) { - fz_aa_hscale = 17; - fz_aa_vscale = 15; - fz_aa_bits = 8; + aa->hscale = 17; + aa->vscale = 15; + aa->bits = 8; } else if (level > 4) { - fz_aa_hscale = 8; - fz_aa_vscale = 8; - fz_aa_bits = 6; + aa->hscale = 8; + aa->vscale = 8; + aa->bits = 6; } else if (level > 2) { - fz_aa_hscale = 5; - fz_aa_vscale = 3; - fz_aa_bits = 4; + aa->hscale = 5; + aa->vscale = 3; + aa->bits = 4; } else if (level > 0) { - fz_aa_hscale = 2; - fz_aa_vscale = 2; - fz_aa_bits = 2; + aa->hscale = 2; + aa->vscale = 2; + aa->bits = 2; } else { - fz_aa_hscale = 1; - fz_aa_vscale = 1; - fz_aa_bits = 0; + aa->hscale = 1; + aa->vscale = 1; + aa->bits = 0; } - fz_aa_scale = 0xFF00 / (fz_aa_hscale * fz_aa_vscale); -} - -static void -set_txt_level(fz_context *ctx, int level) -{ - if (level > 6) - fz_aa_text_bits = 8; - else if (level > 4) - fz_aa_text_bits = 6; - else if (level > 2) - fz_aa_text_bits = 4; - else if (level > 0) - fz_aa_text_bits = 2; - else - fz_aa_text_bits = 0; + aa->scale = 0xFF00 / (aa->hscale * aa->vscale); + fz_set_rasterizer_text_aa_level(ctx, aa, level); +#endif } -#endif /* AA_BITS */ void fz_set_aa_level(fz_context *ctx, int level) { -#ifdef AA_BITS - fz_warn(ctx, "anti-aliasing was compiled with a fixed precision of %d bits", fz_aa_bits); -#else - set_gfx_level(ctx, level); - set_txt_level(ctx, level); -#endif + fz_set_rasterizer_graphics_aa_level(ctx, ctx->aa, level); + fz_set_rasterizer_text_aa_level(ctx, ctx->aa, level); } void fz_set_text_aa_level(fz_context *ctx, int level) { -#ifdef AA_BITS - fz_warn(ctx, "anti-aliasing was compiled with a fixed precision of %d bits", fz_aa_bits); -#else - set_txt_level(ctx, level); -#endif + fz_set_rasterizer_text_aa_level(ctx, ctx->aa, level); } void fz_set_graphics_aa_level(fz_context *ctx, int level) { -#ifdef AA_BITS - fz_warn(ctx, "anti-aliasing was compiled with a fixed precision of %d bits", fz_aa_bits); -#else - set_gfx_level(ctx, level); -#endif + fz_set_rasterizer_graphics_aa_level(ctx, ctx->aa, level); } void @@ -155,11 +178,17 @@ fz_graphics_min_line_width(fz_context *ctx) return ctx->aa->min_line_width; } +float +fz_rasterizer_graphics_min_line_width(fz_rasterizer *ras) +{ + return ras->aa.min_line_width; +} + fz_irect * fz_bound_rasterizer(fz_context *ctx, const fz_rasterizer *rast, fz_irect *bbox) { - const int hscale = fz_aa_hscale; - const int vscale = fz_aa_vscale; + 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) { @@ -177,8 +206,8 @@ fz_bound_rasterizer(fz_context *ctx, const fz_rasterizer *rast, fz_irect *bbox) fz_rect *fz_scissor_rasterizer(fz_context *ctx, const fz_rasterizer *rast, fz_rect *r) { - const int hscale = fz_aa_hscale; - const int vscale = fz_aa_vscale; + const int hscale = fz_rasterizer_aa_hscale(rast); + const int vscale = fz_rasterizer_aa_vscale(rast); r->x0 = ((float)rast->clip.x0) / hscale; r->y0 = ((float)rast->clip.y0) / vscale; @@ -190,8 +219,8 @@ fz_rect *fz_scissor_rasterizer(fz_context *ctx, const fz_rasterizer *rast, fz_re static fz_irect *fz_clip_rasterizer(fz_context *ctx, const fz_rasterizer *rast, fz_irect *r) { - const int hscale = fz_aa_hscale; - const int vscale = fz_aa_vscale; + 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); @@ -203,8 +232,8 @@ static fz_irect *fz_clip_rasterizer(fz_context *ctx, const fz_rasterizer *rast, int fz_reset_rasterizer(fz_context *ctx, fz_rasterizer *rast, const fz_irect *clip) { - const int hscale = fz_aa_hscale; - const int vscale = fz_aa_vscale; + const int hscale = fz_rasterizer_aa_hscale(rast); + const int vscale = fz_rasterizer_aa_vscale(rast); if (fz_is_infinite_irect(clip)) { @@ -239,14 +268,29 @@ void *fz_new_rasterizer_of_size(fz_context *ctx, int size, const fz_rasterizer_f return rast; } -fz_rasterizer *fz_new_rasterizer(fz_context *ctx) +fz_rasterizer *fz_new_rasterizer(fz_context *ctx, const fz_aa_context *aa) { - if (ctx->aa->bits == 10) - return fz_new_edgebuffer(ctx, FZ_EDGEBUFFER_ANY_PART_OF_PIXEL); - else if (ctx->aa->bits == 9) - return fz_new_edgebuffer(ctx, FZ_EDGEBUFFER_CENTER_OF_PIXEL); + fz_rasterizer *r; + int bits; + +#ifdef AA_BITS + bits = AA_BITS; +#else + if (aa == NULL) + aa = ctx->aa; + bits = aa->bits; +#endif + if (bits == 10) + r = fz_new_edgebuffer(ctx, FZ_EDGEBUFFER_ANY_PART_OF_PIXEL); + else if (bits == 9) + r = fz_new_edgebuffer(ctx, FZ_EDGEBUFFER_CENTER_OF_PIXEL); else - return fz_new_gel(ctx); + r = fz_new_gel(ctx); +#ifndef AA_BITS + r->aa = *aa; +#endif + + return r; } void fz_convert_rasterizer(fz_context *ctx, fz_rasterizer *r, int eofill, fz_pixmap *pix, unsigned char *colorbv) |