summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'base/gsovrc.c')
-rw-r--r--base/gsovrc.c52
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) {