summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'devices/gdevpdfimg.c')
-rw-r--r--devices/gdevpdfimg.c154
1 files changed, 63 insertions, 91 deletions
diff --git a/devices/gdevpdfimg.c b/devices/gdevpdfimg.c
index 81e7a48e..d0b412ec 100644
--- a/devices/gdevpdfimg.c
+++ b/devices/gdevpdfimg.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
@@ -200,8 +200,6 @@ static int gdev_pdf_image_begin_page(gx_device_pdf_image *pdf_dev,
gp_file *file)
{
gx_device_printer *const pdev = (gx_device_printer *)pdf_dev;
- cmm_dev_profile_t *profile_struct;
- gsicc_rendering_param_t rendering_params;
int code;
pdfimage_page *page;
@@ -213,39 +211,11 @@ static int gdev_pdf_image_begin_page(gx_device_pdf_image *pdf_dev,
if (gdev_prn_file_is_new(pdev)) {
/* Set up the icc link settings at this time */
- code = dev_proc(pdev, get_profile)((gx_device *)pdev, &profile_struct);
- if (code < 0)
- return_error(gs_error_undefined);
- if (profile_struct->postren_profile != NULL) {
- rendering_params.black_point_comp = gsBLACKPTCOMP_ON;
- rendering_params.graphics_type_tag = GS_UNKNOWN_TAG;
- rendering_params.override_icc = false;
- rendering_params.preserve_black = gsBLACKPRESERVE_OFF;
- rendering_params.rendering_intent = gsRELATIVECOLORIMETRIC;
- rendering_params.cmm = gsCMM_DEFAULT;
- if (profile_struct->oi_profile != NULL) {
- pdf_dev->icclink = gsicc_alloc_link_dev(pdev->memory,
- profile_struct->oi_profile, profile_struct->postren_profile,
- &rendering_params);
- } else if (profile_struct->link_profile != NULL) {
- pdf_dev->icclink = gsicc_alloc_link_dev(pdev->memory,
- profile_struct->link_profile, profile_struct->postren_profile,
- &rendering_params);
- } else {
- pdf_dev->icclink = gsicc_alloc_link_dev(pdev->memory,
- profile_struct->device_profile[GS_DEFAULT_DEVICE_PROFILE], profile_struct->postren_profile,
- &rendering_params);
- }
- if (pdf_dev->icclink == NULL) {
- gs_free_object(pdf_dev->memory->non_gc_memory, page, "pdfimage create new page");
- return_error(gs_error_VMerror);
- }
- /* If it is identity, release it now and set link to NULL */
- if (pdf_dev->icclink->is_identity) {
- pdf_dev->icclink->procs.free_link(pdf_dev->icclink);
- gsicc_free_link_dev(pdev->memory, pdf_dev->icclink);
- pdf_dev->icclink = NULL;
- }
+ code = gx_downscaler_create_post_render_link((gx_device *)pdev,
+ &pdf_dev->icclink);
+ if (code < 0) {
+ gs_free_object(pdf_dev->memory->non_gc_memory, page, "pdfimage create new page");
+ return code;
}
/* Set up the stream and insert the file header */
@@ -603,7 +573,7 @@ pdf_image_downscale_and_print_page(gx_device_printer *dev,
pprintd1(pdf_dev->strm, "%d 0 obj\n", page->PageDictObjectNumber);
pprintd1(pdf_dev->strm, "<<\n/Contents %d 0 R\n", page->PageStreamObjectNumber);
stream_puts(pdf_dev->strm, "/Type /Page\n/Parent 2 0 R\n");
- gs_sprintf(Buffer, "/MediaBox [0 0 %f %f]\n", ((double)pdf_dev->width / pdf_dev->HWResolution[0]) * 72, ((double)pdf_dev->height / pdf_dev->HWResolution[1]) * 72);
+ gs_snprintf(Buffer, sizeof(Buffer), "/MediaBox [0 0 %f %f]\n", ((double)pdf_dev->width / pdf_dev->HWResolution[0]) * 72, ((double)pdf_dev->height / pdf_dev->HWResolution[1]) * 72);
stream_puts(pdf_dev->strm, Buffer);
pprintd1(pdf_dev->strm, "/Resources <<\n/XObject <<\n/Im1 %d 0 R\n>>\n", page->ImageObjectNumber);
if (pdf_dev->ocr.file_init)
@@ -699,7 +669,7 @@ static void write_xref_entry (stream *s, gs_offset_t Offset)
if (Offset > 9999999999){
Offset = 0;
}
- gs_sprintf(O, "%d", Offset);
+ gs_snprintf(O, sizeof(O), "%d", Offset);
for (i=0; i< (10 - strlen(O)); i++)
stream_puts(s, "0");
stream_puts(s, O);
@@ -707,13 +677,13 @@ static void write_xref_entry (stream *s, gs_offset_t Offset)
}
static void
-pdf_store_default_Producer(char *buf)
+pdf_store_default_Producer(char buf[256])
{
int major = (int)(gs_revision / 1000);
int minor = (int)(gs_revision - (major * 1000)) / 10;
int patch = gs_revision % 10;
- gs_sprintf(buf, "(%s %d.%02d.%d)", gs_product, major, minor, patch);
+ gs_snprintf(buf, 256, "(%s %d.%02d.%d)", gs_product, major, minor, patch);
}
static int pdf_image_finish_file(gx_device_pdf_image *pdf_dev, int PCLm)
@@ -759,7 +729,7 @@ static int pdf_image_finish_file(gx_device_pdf_image *pdf_dev, int PCLm)
tms = *localtime(&t);
#endif
- gs_sprintf(CreationDate, "(D:%04d%02d%02d%02d%02d%02d%c%02d\'%02d\')",
+ gs_snprintf(CreationDate, sizeof(CreationDate), "(D:%04d%02d%02d%02d%02d%02d%c%02d\'%02d\')",
tms.tm_year + 1900, tms.tm_mon + 1, tms.tm_mday,
tms.tm_hour, tms.tm_min, tms.tm_sec,
timesign, timeoffset / 60, timeoffset % 60);
@@ -851,12 +821,8 @@ static int pdf_image_finish_file(gx_device_pdf_image *pdf_dev, int PCLm)
pdf_dev->Pages = NULL;
pdf_dev->NumPages = 0;
}
- if (pdf_dev->icclink != NULL)
- {
- pdf_dev->icclink->procs.free_link(pdf_dev->icclink);
- gsicc_free_link_dev(pdf_dev->memory, pdf_dev->icclink);
- pdf_dev->icclink = NULL;
- }
+ gsicc_free_link_dev(pdf_dev->icclink);
+ pdf_dev->icclink = NULL;
pdf_dev->RootOffset = 0;
pdf_dev->PagesOffset = 0;
pdf_dev->xrefOffset = 0;
@@ -1095,10 +1061,7 @@ pdf_image_put_some_params(gx_device * dev, gs_param_list * plist, int which)
(which & 2 ? GX_DOWNSCALER_PARAMS_TRAP : 0) |
(which & 4 ? GX_DOWNSCALER_PARAMS_ETS : 0)));
if (code < 0)
- {
ecode = code;
- param_signal_error(plist, param_name, ecode);
- }
}
if (ecode < 0)
return ecode;
@@ -1127,7 +1090,7 @@ pdf_image_put_params_downscale_cmyk_ets(gx_device * dev, gs_param_list * plist)
return pdf_image_put_some_params(dev, plist, 7);
}
-void
+static void
PCLm_get_initial_matrix(gx_device * dev, register gs_matrix * pmat)
{
gx_device_pdf_image *pdev = (gx_device_pdf_image *)dev;
@@ -1176,6 +1139,21 @@ PCLm_initialize_device_procs(gx_device *dev)
set_dev_proc(dev, put_params, pdf_image_put_params_downscale);
}
+static void
+PCLm8_initialize_device_procs(gx_device *dev)
+{
+ gdev_prn_initialize_device_procs_rgb(dev);
+
+ set_dev_proc(dev, open_device, PCLm_open);
+ set_dev_proc(dev, output_page, gdev_prn_output_page);
+ set_dev_proc(dev, get_initial_matrix, PCLm_get_initial_matrix);
+ set_dev_proc(dev, close_device, PCLm_close);
+ set_dev_proc(dev, get_params, pdf_image_get_params_downscale);
+ set_dev_proc(dev, put_params, pdf_image_put_params_downscale);
+ set_dev_proc(dev, encode_color, gx_default_8bit_map_gray_color);
+ set_dev_proc(dev, decode_color, gx_default_8bit_map_color_gray);
+}
+
static dev_proc_print_page(PCLm_print_page);
const gx_device_pdf_image gs_PCLm_device = {
@@ -1196,6 +1174,24 @@ const gx_device_pdf_image gs_PCLm_device = {
0 /* JPEGQ */
};
+const gx_device_pdf_image gs_PCLm8_device = {
+ prn_device_body_duplex(gx_device_pdf_image,
+ PCLm8_initialize_device_procs,
+ "pclm8",
+ DEFAULT_WIDTH_10THS, DEFAULT_HEIGHT_10THS,
+ 600, 600, /* 600 dpi by default */
+ 0, 0, 0, 0, /* Margins */
+ 1, /* num components */
+ 8, /* bits per sample */
+ 255, 0, 256, 0,
+ PCLm_print_page),
+ 3,
+ GX_DOWNSCALER_PARAMS_DEFAULTS,
+ 16, /* StripHeight */
+ 0.0, /* QFactor */
+ 0 /* JPEGQ */
+};
+
/* Open a temporary file, with or without a stream. */
static int
PCLm_open_temp_file(gx_device_pdf_image *pdev, PCLm_temp_file_t *ptf)
@@ -1328,8 +1324,6 @@ static int gdev_PCLm_begin_page(gx_device_pdf_image *pdf_dev,
gp_file *file)
{
gx_device_printer *const pdev = (gx_device_printer *)pdf_dev;
- cmm_dev_profile_t *profile_struct;
- gsicc_rendering_param_t rendering_params;
int code;
pdfimage_page *page;
@@ -1341,39 +1335,11 @@ static int gdev_PCLm_begin_page(gx_device_pdf_image *pdf_dev,
if (gdev_prn_file_is_new(pdev)) {
/* Set up the icc link settings at this time */
- code = dev_proc(pdev, get_profile)((gx_device *)pdev, &profile_struct);
- if (code < 0)
- return_error(gs_error_undefined);
- if (profile_struct->postren_profile != NULL) {
- rendering_params.black_point_comp = gsBLACKPTCOMP_ON;
- rendering_params.graphics_type_tag = GS_UNKNOWN_TAG;
- rendering_params.override_icc = false;
- rendering_params.preserve_black = gsBLACKPRESERVE_OFF;
- rendering_params.rendering_intent = gsRELATIVECOLORIMETRIC;
- rendering_params.cmm = gsCMM_DEFAULT;
- if (profile_struct->oi_profile != NULL) {
- pdf_dev->icclink = gsicc_alloc_link_dev(pdev->memory,
- profile_struct->oi_profile, profile_struct->postren_profile,
- &rendering_params);
- } else if (profile_struct->link_profile != NULL) {
- pdf_dev->icclink = gsicc_alloc_link_dev(pdev->memory,
- profile_struct->link_profile, profile_struct->postren_profile,
- &rendering_params);
- } else {
- pdf_dev->icclink = gsicc_alloc_link_dev(pdev->memory,
- profile_struct->device_profile[GS_DEFAULT_DEVICE_PROFILE], profile_struct->postren_profile,
- &rendering_params);
- }
- if (pdf_dev->icclink == NULL) {
- gs_free_object(pdf_dev->memory->non_gc_memory, page, "pdfimage create new page");
- return_error(gs_error_VMerror);
- }
- /* If it is identity, release it now and set link to NULL */
- if (pdf_dev->icclink->is_identity) {
- pdf_dev->icclink->procs.free_link(pdf_dev->icclink);
- gsicc_free_link_dev(pdev->memory, pdf_dev->icclink);
- pdf_dev->icclink = NULL;
- }
+ code = gx_downscaler_create_post_render_link((gx_device *)pdev,
+ &pdf_dev->icclink);
+ if (code < 0) {
+ gs_free_object(pdf_dev->memory->non_gc_memory, page, "pdfimage create new page");
+ return code;
}
/* Set up the stream and insert the file header */
@@ -1475,7 +1441,7 @@ PCLm_downscale_and_print_page(gx_device_printer *dev,
pprintd1(pdf_dev->strm, "%d 0 obj\n", page->PageDictObjectNumber);
pprintd1(pdf_dev->strm, "<<\n/Contents %d 0 R\n", page->PageStreamObjectNumber);
stream_puts(pdf_dev->strm, "/Type /Page\n/Parent 2 0 R\n");
- gs_sprintf(Buffer, "/MediaBox [0 0 %.3f %.3f]\n", ((double)pdf_dev->width / pdf_dev->HWResolution[0]) * 72, ((double)pdf_dev->height / pdf_dev->HWResolution[1]) * 72);
+ gs_snprintf(Buffer, sizeof(Buffer), "/MediaBox [0 0 %.3f %.3f]\n", ((double)pdf_dev->width / pdf_dev->HWResolution[0]) * 72, ((double)pdf_dev->height / pdf_dev->HWResolution[1]) * 72);
stream_puts(pdf_dev->strm, Buffer);
stream_puts(pdf_dev->strm, "/Resources <<\n/XObject <<\n");
@@ -1494,9 +1460,9 @@ PCLm_downscale_and_print_page(gx_device_printer *dev,
double adjusted;
adjusted = height - (row * pdf_dev->StripHeight);
adjusted = adjusted / (pdf_dev->HWResolution[1] / (factor * 72));
- gs_sprintf(Buffer, "%.3f 0 0 %.3f 0 0 cm\n/Im%d Do Q\n", (width / (pdf_dev->HWResolution[0] / 72)) * factor, adjusted, row);
+ gs_snprintf(Buffer, sizeof(Buffer), "%.3f 0 0 %.3f 0 0 cm\n/Im%d Do Q\n", (width / (pdf_dev->HWResolution[0] / 72)) * factor, adjusted, row);
} else
- gs_sprintf(Buffer, "%.3f 0 0 %.3f 0 %f cm\n/Im%d Do Q\n", (width / (pdf_dev->HWResolution[0] / 72)) * factor, StripDecrement, ((height / (pdf_dev->HWResolution[1] / 72)) * factor) - (StripDecrement * (row + 1)), row);
+ gs_snprintf(Buffer, sizeof(Buffer), "%.3f 0 0 %.3f 0 %f cm\n/Im%d Do Q\n", (width / (pdf_dev->HWResolution[0] / 72)) * factor, StripDecrement, ((height / (pdf_dev->HWResolution[1] / 72)) * factor) - (StripDecrement * (row + 1)), row);
stream_puts(pdf_dev->temp_stream.strm, Buffer);
pprintd2(pdf_dev->strm, "/Im%d %d 0 R\n", row, page->ImageObjectNumber + (row * 2));
}
@@ -1574,7 +1540,10 @@ PCLm_downscale_and_print_page(gx_device_printer *dev,
stream_puts(pdf_dev->strm, "/Subtype /Image\n");
pprintd1(pdf_dev->strm, "/Width %d\n", width);
pprintd1(pdf_dev->strm, "/Height %d\n", Read);
- stream_puts(pdf_dev->strm, "/ColorSpace /DeviceRGB\n");
+ if (dev->color_info.max_components == 1)
+ stream_puts(pdf_dev->strm, "/ColorSpace /DeviceGray\n");
+ else
+ stream_puts(pdf_dev->strm, "/ColorSpace /DeviceRGB\n");
stream_puts(pdf_dev->strm, "/BitsPerComponent 8\n");
switch (pdf_dev->Compression) {
case COMPRESSION_FLATE:
@@ -1674,7 +1643,10 @@ PCLm_downscale_and_print_page(gx_device_printer *dev,
stream_puts(pdf_dev->strm, "/Subtype /Image\n");
pprintd1(pdf_dev->strm, "/Width %d\n", width);
pprintd1(pdf_dev->strm, "/Height %d\n", Read);
- stream_puts(pdf_dev->strm, "/ColorSpace /DeviceRGB\n");
+ if (dev->color_info.max_components == 1)
+ stream_puts(pdf_dev->strm, "/ColorSpace /DeviceGray\n");
+ else
+ stream_puts(pdf_dev->strm, "/ColorSpace /DeviceRGB\n");
stream_puts(pdf_dev->strm, "/BitsPerComponent 8\n");
switch (pdf_dev->Compression) {
case COMPRESSION_FLATE: