summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'devices/gdevtsep.c')
-rw-r--r--devices/gdevtsep.c118
1 files changed, 66 insertions, 52 deletions
diff --git a/devices/gdevtsep.c b/devices/gdevtsep.c
index fd859ddc..6d75d600 100644
--- a/devices/gdevtsep.c
+++ b/devices/gdevtsep.c
@@ -445,7 +445,7 @@ tiffscaled24_print_page(gx_device_printer * pdev, gp_file * file)
static void
tiff_set_cmyk_fields(gx_device_printer *pdev, TIFF *tif,
short bits_per_sample,
- uint16 compression,
+ uint16_t compression,
long max_strip_size)
{
TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, bits_per_sample);
@@ -667,7 +667,7 @@ static dev_proc_decode_color(tiffsep1_decode_color);
bool UseBigTIFF; /* true = output bigtiff, false don't */ \
bool write_datetime; /* true = write DATETIME tag, false = don't */ \
bool PrintSpotCMYK; /* true = print CMYK equivalents for spot inks; false = do nothing */\
- uint16 Compression; /* for the separation files, same values as TIFFTAG_COMPRESSION */\
+ uint16_t Compression; /* for the separation files, same values as TIFFTAG_COMPRESSION */\
long MaxStripSize;\
long BitsPerComponent;\
int max_spots;\
@@ -678,7 +678,8 @@ static dev_proc_decode_color(tiffsep1_decode_color);
bool warning_given; /* avoid issuing lots of warnings */\
gp_file *comp_file; /* Underlying file for tiff_comp */\
TIFF *tiff_comp; /* tiff file for comp file */\
- gsicc_link_t *icclink /* link profile if we are doing post rendering */
+ gsicc_link_t *icclink; /* link profile if we are doing post rendering */\
+ unsigned int page_num_comps /* Number of components at end of page, for cleanup */
/*
* A structure definition for a DeviceN type device
@@ -1224,26 +1225,16 @@ int
tiffsep1_prn_close(gx_device * pdev)
{
tiffsep1_device * const tfdev = (tiffsep1_device *) pdev;
- int num_dev_comp = tfdev->color_info.num_components;
- int num_std_colorants = tfdev->devn_params.num_std_colorant_names;
- int num_order = tfdev->devn_params.num_separation_order_names;
- int num_spot = tfdev->devn_params.separations.num_separations;
char *name= NULL;
int code = gdev_prn_close(pdev);
short map_comp_to_sep[GX_DEVICE_COLOR_MAX_COMPONENTS];
int comp_num;
- int num_comp = number_output_separations(num_dev_comp, num_std_colorants,
- num_order, num_spot);
const char *fmt;
gs_parsed_file_name_t parsed;
if (code < 0)
return code;
- name = (char *)gs_alloc_bytes(pdev->memory, gp_file_name_sizeof, "tiffsep1_prn_close(name)");
- if (!name)
- return_error(gs_error_VMerror);
-
code = gx_parse_output_file_name(&parsed, &fmt, tfdev->fname,
strlen(tfdev->fname), pdev->memory);
if (code < 0) {
@@ -1278,33 +1269,44 @@ tiffsep1_prn_close(gx_device * pdev)
build_comp_to_sep_map((tiffsep_device *)tfdev, map_comp_to_sep);
/* Close the separation files */
- for (comp_num = 0; comp_num < num_comp; comp_num++ ) {
- if (tfdev->sep_file[comp_num] != NULL) {
- int sep_num = map_comp_to_sep[comp_num];
+ for (comp_num = 0; comp_num < tfdev->page_num_comps; comp_num++ ) {
+ const char *lname_empty = "";
+ char *lname = NULL;
- code = create_separation_file_name((tiffsep_device *)tfdev, name,
- gp_file_name_sizeof, sep_num, true);
- if (code < 0) {
- goto done;
- }
- code = gx_device_close_output_file(pdev, name, tfdev->sep_file[comp_num]);
+ if (tfdev->tiff[comp_num] != NULL) {
+ tiff_filename_from_tiff(tfdev->tiff[comp_num], &name);
+ }
+ else {
+ name = (char *)lname_empty;
+ }
+
+ lname = (char *)gs_alloc_bytes(tfdev->memory, strlen(name) + 1, "tiffsep1_prn_close");
+ if (lname == NULL) {
+ code = gs_note_error(gs_error_VMerror);
+ goto done;
+ }
+ memcpy(lname, name, strlen(name) + 1);
+
+ if (tfdev->tiff[comp_num]) {
+ void *t = TIFFClientdata(tfdev->tiff[comp_num]);
+
+ TIFFCleanup(tfdev->tiff[comp_num]);
+ gs_free(pdev->memory, t, sizeof(tifs_io_private), 1, "tiffsep1_prn_close");
+ tfdev->tiff[comp_num] = NULL;
+ }
+ if (tfdev->sep_file[comp_num] != NULL) {
+ code = gx_device_close_output_file(pdev, lname, tfdev->sep_file[comp_num]);
if (code >= 0)
- code = gs_remove_outputfile_control_path(pdev->memory, name);
+ code = gs_remove_outputfile_control_path(pdev->memory, lname);
if (code < 0) {
goto done;
}
tfdev->sep_file[comp_num] = NULL;
}
- if (tfdev->tiff[comp_num]) {
- TIFFCleanup(tfdev->tiff[comp_num]);
- tfdev->tiff[comp_num] = NULL;
- }
+ gs_free_object(tfdev->memory, lname, "tiffsep1_prn_close");
}
done:
-
- if (name)
- gs_free_object(pdev->memory, name, "tiffsep1_prn_close(name)");
return code;
}
@@ -1730,26 +1732,18 @@ int
tiffsep_prn_close(gx_device * pdev)
{
tiffsep_device * const pdevn = (tiffsep_device *) pdev;
- int num_dev_comp = pdevn->color_info.num_components;
- int num_std_colorants = pdevn->devn_params.num_std_colorant_names;
- int num_order = pdevn->devn_params.num_separation_order_names;
- int num_spot = pdevn->devn_params.separations.num_separations;
short map_comp_to_sep[GX_DEVICE_COLOR_MAX_COMPONENTS];
char *name = NULL;
int code;
int comp_num;
- int num_comp = number_output_separations(num_dev_comp, num_std_colorants,
- num_order, num_spot);
gsicc_free_link_dev(pdevn->icclink);
pdevn->icclink = NULL;
- name = (char *)gs_alloc_bytes(pdevn->memory, gp_file_name_sizeof, "tiffsep_prn_close(name)");
- if (!name)
- return_error(gs_error_VMerror);
-
if (pdevn->tiff_comp) {
+ void *t = TIFFClientdata(pdevn->tiff_comp);
TIFFCleanup(pdevn->tiff_comp);
+ gs_free(pdev->memory, t, sizeof(tifs_io_private), 1, "tiffsep_prn_close");
pdevn->tiff_comp = NULL;
}
code = gdev_prn_close(pdev);
@@ -1759,27 +1753,44 @@ tiffsep_prn_close(gx_device * pdev)
build_comp_to_sep_map(pdevn, map_comp_to_sep);
/* Close the separation files */
- for (comp_num = 0; comp_num < num_comp; comp_num++ ) {
- if (pdevn->sep_file[comp_num] != NULL) {
- int sep_num = pdevn->devn_params.separation_order_map[comp_num];
+ for (comp_num = 0; comp_num < pdevn->page_num_comps; comp_num++ ) {
+ const char *lname_empty = "";
+ char *lname = NULL;
- code = create_separation_file_name(pdevn, name,
- gp_file_name_sizeof, sep_num, true);
- if (code < 0) {
- goto done;
- }
- code = tiffsep_close_sep_file(pdevn, name, comp_num);
+ if (pdevn->tiff[comp_num] != NULL) {
+ tiff_filename_from_tiff(pdevn->tiff[comp_num], &name);
+ }
+ else {
+ name = (char *)lname_empty;
+ }
+
+ lname = (char *)gs_alloc_bytes(pdevn->memory, strlen(name) + 1, "tiffsep1_prn_close");
+ if (lname == NULL) {
+ code = gs_note_error(gs_error_VMerror);
+ goto done;
+ }
+ memcpy(lname, name, strlen(name) + 1);
+
+ if (pdevn->tiff[comp_num]) {
+ void *t = TIFFClientdata(pdevn->tiff[comp_num]);
+ TIFFCleanup(pdevn->tiff[comp_num]);
+ gs_free(pdevn->memory, t, sizeof(tifs_io_private), 1, "tiffsep_prn_close");
+ pdevn->tiff[comp_num] = NULL;
+ }
+
+ if (pdevn->sep_file[comp_num]) {
+ code = gx_device_close_output_file((gx_device *)pdevn, lname, pdevn->sep_file[comp_num]);
if (code >= 0)
- code = gs_remove_outputfile_control_path(pdevn->memory, name);
+ code = gs_remove_outputfile_control_path(pdevn->memory, lname);
if (code < 0) {
goto done;
}
+ pdevn->sep_file[comp_num] = NULL;
}
+ gs_free_object(pdevn->memory, lname, "tiffsep1_prn_close");
}
done:
- if (name)
- gs_free_object(pdev->memory, name, "tiffsep_prn_close(name)");
return code;
}
@@ -2123,6 +2134,7 @@ tiffsep_print_page(gx_device_printer * pdev, gp_file * file)
/* Set up the separation output files */
num_comp = number_output_separations( tfdev->color_info.num_components,
num_std_colorants, num_order, num_spot);
+ tfdev->page_num_comps = num_comp;
if (!tfdev->NoSeparationFiles && !num_order && num_comp < num_std_colorants + num_spot) {
dmlprintf(pdev->memory, "Warning: skipping one or more colour separations, see: Devices.htm#TIFF\n");
@@ -2493,6 +2505,8 @@ tiffsep1_print_page(gx_device_printer * pdev, gp_file * file)
/* Set up the separation output files */
num_comp = number_output_separations(tfdev->color_info.num_components,
num_std_colorants, num_order, num_spot);
+ tfdev->page_num_comps = num_comp;
+
build_cmyk_map((gx_device *)tfdev, num_comp, &tfdev->equiv_cmyk_colors, cmyk_map);
if (tfdev->PrintSpotCMYK) {
code = print_cmyk_equivalent_colors((tiffsep_device *)tfdev, num_comp, cmyk_map);