summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'devices/vector/gdevpdfb.c')
-rw-r--r--devices/vector/gdevpdfb.c53
1 files changed, 34 insertions, 19 deletions
diff --git a/devices/vector/gdevpdfb.c b/devices/vector/gdevpdfb.c
index a7b36d82..1851bab3 100644
--- a/devices/vector/gdevpdfb.c
+++ b/devices/vector/gdevpdfb.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
@@ -137,7 +137,7 @@ pdf_copy_mono(gx_device_pdf *pdev,
pdf_stream_position_t ipos;
pdf_resource_t *pres = 0;
byte invert = 0;
- bool in_line = false;
+ bool in_line = false, char_proc_begun = false;
gs_show_enum *show_enum = (gs_show_enum *)pdev->pte;
int x_offset, y_offset;
double width;
@@ -181,6 +181,7 @@ pdf_copy_mono(gx_device_pdf *pdev,
&pcp, &ipos);
if (code < 0)
return code;
+ char_proc_begun = true;
y_offset = -y_offset;
width = psdf_round(pdev->char_width.x, 100, 10); /* See
pdf_write_Widths about rounding. We need to provide
@@ -192,7 +193,7 @@ pdf_copy_mono(gx_device_pdf *pdev,
pdf_image_writer_init(&writer);
code = pdf_begin_write_image(pdev, &writer, gs_no_id, w, h, NULL, true);
if (code < 0)
- return code;
+ goto fail;
pres = (pdf_resource_t *) pcp;
goto wr;
} else if (pdev->pte != NULL) {
@@ -216,13 +217,17 @@ pdf_copy_mono(gx_device_pdf *pdev,
set_image_color(pdev, zero);
} else if (zero == pdev->black && one == pdev->white) {
pcs = gs_cspace_new_DeviceGray(pdev->memory);
- if (pcs == NULL)
- return_error(gs_error_VMerror);
+ if (pcs == NULL) {
+ code = gs_note_error(gs_error_VMerror);
+ goto fail;
+ }
gs_image_t_init(&image, pcs);
} else if (zero == pdev->white && one == pdev->black) {
pcs = gs_cspace_new_DeviceGray(pdev->memory);
- if (pcs == NULL)
- return_error(gs_error_VMerror);
+ if (pcs == NULL) {
+ code = gs_note_error(gs_error_VMerror);
+ goto fail;
+ }
gs_image_t_init(&image, pcs);
invert = 0xff;
} else {
@@ -240,13 +245,14 @@ pdf_copy_mono(gx_device_pdf *pdev,
code = pdf_cspace_init_Device(pdev->memory, &pcs_base, ncomp);
if (code < 0)
- return code;
+ goto fail;
c[0] = psdf_adjust_color_index((gx_device_vector *)pdev, zero);
c[1] = psdf_adjust_color_index((gx_device_vector *)pdev, one);
pcs = gs_cspace_alloc(pdev->memory, &gs_color_space_type_Indexed);
if (pcs == NULL) {
rc_decrement_cs(pcs_base, "pdf_copy_mono");
- return_error(gs_error_VMerror);
+ code = gs_note_error(gs_error_VMerror);
+ goto fail;
}
pcs->base_space = pcs_base;
pcs->params.indexed.hival = 1;
@@ -267,14 +273,14 @@ pdf_copy_mono(gx_device_pdf *pdev,
code = pdf_open_page(pdev, PDF_IN_STREAM);
if (code < 0)
- return code;
+ goto fail;
in_line = nbytes < pdev->MaxInlineImageSize;
if (in_line)
pdf_put_image_matrix(pdev, &image.ImageMatrix, 1.0);
pdf_image_writer_init(&writer);
code = pdf_begin_write_image(pdev, &writer, gs_no_id, w, h, NULL, in_line);
if (code < 0)
- return code;
+ goto fail;
}
wr:
if (image.ImageMask)
@@ -287,7 +293,7 @@ pdf_copy_mono(gx_device_pdf *pdev,
code = pdf_color_space_named(pdev, NULL, &cs_value, NULL, pcs,
&writer.pin->color_spaces, in_line, NULL, 0, false);
if (code < 0)
- return code;
+ goto fail;
pcsvalue = &cs_value;
}
/*
@@ -322,33 +328,37 @@ pdf_copy_mono(gx_device_pdf *pdev,
code = pdf_begin_image_data(pdev, &writer, (const gs_pixel_image_t *)&image,
pcsvalue, 0);
if (code < 0)
- return code;
+ goto fail;
code = pdf_copy_mask_bits(writer.binary[0].strm, base, sourcex, raster,
w, h, invert);
if (code < 0)
- return code;
+ goto fail;
code = pdf_end_image_binary(pdev, &writer, writer.height);
if (code < 0)
- return code;
+ goto fail;
if (!pres) {
switch ((code = pdf_end_write_image(pdev, &writer))) {
default: /* error */
- return code;
+ goto fail;
case 1:
- return 0;
+ code = 0;
+ goto fail;
case 0:
- return pdf_do_image(pdev, writer.pres, &image.ImageMatrix,
+ code = pdf_do_image(pdev, writer.pres, &image.ImageMatrix,
true);
+ goto fail;
}
}
writer.end_string = ""; /* no Q */
switch ((code = pdf_end_write_image(pdev, &writer))) {
default: /* error */
+ goto fail;
return code;
case 0: /* not possible */
- return_error(gs_error_Fatal);
+ code = gs_note_error(gs_error_Fatal);
+ goto fail;
case 1:
break;
}
@@ -365,6 +375,11 @@ pdf_copy_mono(gx_device_pdf *pdev,
imat.yy /= h;
return pdf_do_char_image(pdev, (const pdf_char_proc_t *)pres, &imat);
}
+
+fail:
+ if (char_proc_begun)
+ (void)pdf_end_char_proc(pdev, &ipos);
+ return code;
}
int
gdev_pdf_copy_mono(gx_device * dev,