From 5ca92b5a7166cb0304f9d30d0989b5379c7fa532 Mon Sep 17 00:00:00 2001 From: Robin Watts Date: Wed, 2 Aug 2017 12:11:03 +0100 Subject: Fix overprint with shadings. --- source/fitz/draw-device.c | 48 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 41 insertions(+), 7 deletions(-) (limited to 'source/fitz/draw-device.c') diff --git a/source/fitz/draw-device.c b/source/fitz/draw-device.c index 6ba5a4cf..a26e5986 100644 --- a/source/fitz/draw-device.c +++ b/source/fitz/draw-device.c @@ -1296,17 +1296,43 @@ fz_draw_fill_shade(fz_context *ctx, fz_device *devp, fz_shade *shade, const fz_m { unsigned char *s; int x, y, n, i; + fz_color_params local_cp; + fz_color_params *cp = NULL; - eop = resolve_color(ctx, &op, shade->background, fz_default_colorspace(ctx, dev->default_cs, shade->colorspace), alpha, color_params, colorbv, state->dest, prf); + /* Disable OPM */ + if (color_params) + { + local_cp = *color_params; + local_cp.opm = 0; + cp = &local_cp; + } + + eop = resolve_color(ctx, &op, shade->background, fz_default_colorspace(ctx, dev->default_cs, shade->colorspace), alpha, cp, colorbv, state->dest, prf); n = dest->n; - for (y = scissor.y0; y < scissor.y1; y++) + if (eop) { - s = dest->samples + (unsigned int)((y - dest->y) * dest->stride + (scissor.x0 - dest->x) * n); - for (x = scissor.x0; x < scissor.x1; x++) + for (y = scissor.y0; y < scissor.y1; y++) { - for (i = 0; i < n; i++) - *s++ = colorbv[i]; + s = dest->samples + (unsigned int)((y - dest->y) * dest->stride + (scissor.x0 - dest->x) * n); + for (x = scissor.x0; x < scissor.x1; x++) + { + for (i = 0; i < n; i++) + if (fz_overprint_component(eop, i)) + *s++ = colorbv[i]; + } + } + } + else + { + for (y = scissor.y0; y < scissor.y1; y++) + { + s = dest->samples + (unsigned int)((y - dest->y) * dest->stride + (scissor.x0 - dest->x) * n); + for (x = scissor.x0; x < scissor.x1; x++) + { + for (i = 0; i < n; i++) + *s++ = colorbv[i]; + } } } if (shape) @@ -1322,7 +1348,15 @@ fz_draw_fill_shade(fz_context *ctx, fz_device *devp, fz_shade *shade, const fz_m } } - fz_paint_shade(ctx, shade, &ctm, dest, prf, color_params, &bbox); + if (color_params->op) + { + eop = &op; + set_op_from_spaces(ctx, eop, dest, shade->colorspace, 0); + } + else + eop = NULL; + + fz_paint_shade(ctx, shade, &ctm, dest, prf, color_params, &bbox, eop); if (shape) fz_clear_pixmap_rect_with_value(ctx, shape, 255, &bbox); -- cgit v1.2.3