diff options
Diffstat (limited to 'base/gsovrc.c')
-rw-r--r-- | base/gsovrc.c | 52 |
1 files changed, 32 insertions, 20 deletions
diff --git a/base/gsovrc.c b/base/gsovrc.c index 745ebfbe..574e1e2e 100644 --- a/base/gsovrc.c +++ b/base/gsovrc.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2001-2021 Artifex Software, Inc. +/* Copyright (C) 2001-2022 Artifex Software, Inc. All Rights Reserved. This software is provided AS-IS with no warranty, either express or @@ -424,6 +424,7 @@ nooverprint_initialize_device_procs(gx_device *dev) set_dev_proc(dev, copy_planes, gx_forward_copy_planes); set_dev_proc(dev, copy_alpha_hl_color, gx_forward_copy_alpha_hl_color); set_dev_proc(dev, fill_stroke_path, gx_forward_fill_stroke_path); + set_dev_proc(dev, lock_pattern, gx_forward_lock_pattern); } /* @@ -903,7 +904,9 @@ overprint_copy_alpha_hl_color(gx_device * dev, const byte * data, int data_x, overprint_device_t * opdev = (overprint_device_t *)dev; int code; - opdev->copy_alpha_hl = true; + if ((opdev->op_state == OP_STATE_FILL && !opdev->retain_none_fill) || + (opdev->op_state == OP_STATE_STROKE && !opdev->retain_none_stroke)) + opdev->copy_alpha_hl = true; code = gx_default_copy_alpha_hl_color(dev, data, data_x, raster, id, x, y, width, height, pdcolor, depth); opdev->copy_alpha_hl = false; @@ -930,7 +933,7 @@ overprint_copy_planes(gx_device * dev, const byte * data, int data_x, int raster uchar num_comps; uchar k,j; gs_memory_t * mem = dev->memory; - gx_color_index comps = opdev->op_state == OP_STATE_FILL ? opdev->drawn_comps_fill : opdev->drawn_comps_stroke; + gx_color_index comps_orig = opdev->op_state == OP_STATE_FILL ? opdev->drawn_comps_fill : opdev->drawn_comps_stroke; byte *curr_data = (byte *) data + data_x; int row, offset; @@ -972,6 +975,7 @@ overprint_copy_planes(gx_device * dev, const byte * data, int data_x, int raster /* step through the height */ row = 0; while (h-- > 0 && code >= 0) { + gx_color_index comps = comps_orig; gb_rect.p.y = y++; gb_rect.q.y = y; offset = row * raster_in + data_x; @@ -981,23 +985,23 @@ overprint_copy_planes(gx_device * dev, const byte * data, int data_x, int raster for (k = 0; k < tdev->color_info.num_components; k++) { /* First set the params to zero for all planes except the one we want */ for (j = 0; j < tdev->color_info.num_components; j++) - gb_params.data[j] = 0; - gb_params.data[k] = gb_buff + k * raster; - code = dev_proc(tdev, get_bits_rectangle) (tdev, &gb_rect, - &gb_params); - if (code < 0) { - gs_free_object(mem, gb_buff, "overprint_copy_planes" ); - return code; - } - /* Skip the plane if this component is not to be drawn. If - its the one that we want to draw, replace it with our - buffer data */ - if ((comps & 0x01) == 1) { - memcpy(gb_params.data[k], curr_data, w); - } - /* Next plane */ - curr_data += plane_height * raster_in; - comps >>= 1; + gb_params.data[j] = 0; + gb_params.data[k] = gb_buff + k * raster; + code = dev_proc(tdev, get_bits_rectangle) (tdev, &gb_rect, + &gb_params); + if (code < 0) { + gs_free_object(mem, gb_buff, "overprint_copy_planes" ); + return code; + } + /* Skip the plane if this component is not to be drawn. If + its the one that we want to draw, replace it with our + buffer data */ + if ((comps & 0x01) == 1) { + memcpy(gb_params.data[k], curr_data, w); + } + /* Next plane */ + curr_data += plane_height * raster_in; + comps >>= 1; } code = dev_proc(tdev, copy_planes)(tdev, gb_buff, 0, raster, gs_no_bitmap_id, x, y - 1, w, 1, 1); @@ -1300,6 +1304,14 @@ overprint_dev_spec_op(gx_device* pdev, int dev_spec_op, if (dev_spec_op == gxdso_overprint_active) return !opdev->is_idle; + if (dev_spec_op == gxdso_overprint_op) + { + int ret = opdev->op_state; + if ((intptr_t)data >= 0) + opdev->op_state = (intptr_t)data; + return ret; + } + if (dev_spec_op == gxdso_device_child) { gxdso_device_child_request *d = (gxdso_device_child_request *)data; if (d->target == pdev) { |