summaryrefslogtreecommitdiff
path: root/source/fitz/draw-rasterize.c
diff options
context:
space:
mode:
authorRobin Watts <robin.watts@artifex.com>2017-06-15 17:57:28 +0100
committerRobin Watts <robin.watts@artifex.com>2017-06-22 14:59:43 +0100
commit2764ef8c0fd10d16a41842e8834efb1bd17e65d8 (patch)
treec1811c37e5314d59754e82a467ca88c775e7cd16 /source/fitz/draw-rasterize.c
parentdd58ea5e2ff7e6b61cc5a5b6fd950fb62e92b8be (diff)
downloadmupdf-2764ef8c0fd10d16a41842e8834efb1bd17e65d8.tar.xz
Move rasterizer/anti-alias choices into the draw device.
We still use the fz_context versions as the default, but these can be overridden with draw device options.
Diffstat (limited to 'source/fitz/draw-rasterize.c')
-rw-r--r--source/fitz/draw-rasterize.c180
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)