diff options
Diffstat (limited to 'devices/gdevpdfimg.c')
-rw-r--r-- | devices/gdevpdfimg.c | 154 |
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: |