}
}
-static void parseOpts(filter_data_t *data,
- void *parameters,
- pwgtoraster_doc_t *doc)
+static int parseOpts(filter_data_t *data,
+ void *parameters,
+ pwgtoraster_doc_t *doc)
{
int num_options = 0;
cups_option_t *options = NULL;
#else
if (log) log(ld, FILTER_LOGLEVEL_ERROR,
"pwgtoraster: No PPD file specified.");
- exit(1);
+ return (1);
#endif /* HAVE_CUPS_1_7 */
}
if ((val = cupsGetOption("print-color-mode", num_options, options)) != NULL
"pwgtoraster: Page size %s: %s",
doc->page_size_requested ? "requested" : "default",
doc->outheader.cupsPageSizeName);
+
+ return (0);
}
static unsigned char *reverseLine(unsigned char *src, unsigned char *dst,
}
/* select convertLine function */
-static void selectConvertFunc(cups_raster_t *raster,
- pwgtoraster_doc_t* doc,
- conversion_function_t *convert,
- filter_logfunc_t log,
- void* ld)
+static int selectConvertFunc(cups_raster_t *raster,
+ pwgtoraster_doc_t* doc,
+ conversion_function_t *convert,
+ filter_logfunc_t log,
+ void* ld)
{
if ((doc->color_profile.colorProfile == NULL || doc->color_profile.outputColorProfile == doc->color_profile.colorProfile)
&& (doc->outheader.cupsColorOrder == CUPS_ORDER_CHUNKED
|| doc->outheader.cupsNumColors == 1)) {
- if (selectSpecialCase(doc, convert)) return;
+ if (selectSpecialCase(doc, convert))
+ return (0);
}
switch (doc->outheader.cupsColorOrder) {
doc->color_profile.renderingIntent,0)) == 0) {
if (log) log(ld, FILTER_LOGLEVEL_ERROR,
"pwgtoraster: Can't create color transform.");
- exit(1);
+ return (1);
}
} else {
/* select convertCSpace function */
default:
if (log) log(ld, FILTER_LOGLEVEL_ERROR,
"pwgtoraster: Specified ColorSpace is not supported");
- exit(1);
+ return (1);
break;
}
}
else
doc->bitspercolor = doc->outheader.cupsBitsPerColor;
+ return (0);
}
static bool outPage(pwgtoraster_doc_t *doc,
return (ret);
}
-static void setColorProfile(pwgtoraster_doc_t *doc, filter_logfunc_t log, void *ld)
+static int setColorProfile(pwgtoraster_doc_t *doc, filter_logfunc_t log, void *ld)
{
if (doc->outheader.cupsBitsPerColor != 8 && doc->outheader.cupsBitsPerColor != 16) {
/* color Profile is not supported */
- return;
+ return (0);
}
/* set output color profile */
switch (doc->outheader.cupsColorSpace) {
default:
if (log) log(ld, FILTER_LOGLEVEL_ERROR,
"pwgtoraster: Specified ColorSpace is not supported");
- exit(1);
- break;
+ return (1);
}
+
+ return (0);
}
int pwgtoraster(int inputfd, /* I - File descriptor input stream */
{
pwgtoraster_doc_t doc;
int i;
- cups_raster_t *inras,
- *outras;
+ cups_raster_t *inras = NULL,
+ *outras = NULL;
filter_logfunc_t log = data->logfunc;
void *ld = data->logdata;
conversion_function_t convert;
filter_iscanceledfunc_t iscanceled = data->iscanceledfunc;
void *icd = data->iscanceleddata;
+ int ret = 0;
(void)inputseekable;
doc.color_profile.renderingIntent = INTENT_PERCEPTUAL;
// Parse the options
- parseOpts(data, parameters, &doc);
+ if (parseOpts(data, parameters, &doc) == 1)
+ return (1);
doc.outheader.NumCopies = data->copies;
doc.outheader.MirrorPrint = CUPS_FALSE;
&& doc.outheader.cupsBitsPerColor != 16) {
if (log) log(ld, FILTER_LOGLEVEL_ERROR,
"pwgtoraster: Specified color format is not supported.");
- exit(1);
+ ret = 1;
+ goto out;
}
if (doc.outheader.cupsColorOrder == CUPS_ORDER_PLANAR) {
&& doc.outheader.cupsBitsPerColor != 16)) {
if (log) log(ld, FILTER_LOGLEVEL_ERROR,
"pwgtoraster: Specified color format is not supported.");
- exit(1);
+ ret = 1;
+ goto out;
}
case CUPS_CSPACE_RGB:
case CUPS_CSPACE_SRGB:
default:
if (log) log(ld, FILTER_LOGLEVEL_ERROR,
"pwgtoraster: Specified ColorSpace is not supported.");
- exit(1);
- break;
+ ret = 1;
+ goto out;
}
if (!(doc.color_profile.cm_disabled)) {
- setColorProfile(&doc, log, ld);
+ if (setColorProfile(&doc, log, ld) == 1) {
+ if (log) log(ld, FILTER_LOGLEVEL_ERROR,
+ "pwgtoraster: Cannot set color profile.");
+ ret = 1;
+ goto out;
+ }
}
/*
if ((outras = cupsRasterOpen(outputfd, CUPS_RASTER_WRITE)) == 0) {
if (log) log(ld, FILTER_LOGLEVEL_ERROR,
"pwgtoraster: Can't open output raster stream.");
- exit(1);
+ ret = 1;
+ goto out;
}
/*
*/
memset(&convert, 0, sizeof(conversion_function_t));
- selectConvertFunc(outras, &doc, &convert, log, ld);
+ if (selectConvertFunc(outras, &doc, &convert, log, ld) == 1)
+ {
+ if (log) log(ld, FILTER_LOGLEVEL_ERROR,
+ "pwgtoraster: Unable to select color conversion function.");
+ ret = 1;
+ goto out;
+ }
if (log) {
log(ld, FILTER_LOGLEVEL_DEBUG,
if (log) log(ld, FILTER_LOGLEVEL_DEBUG,
"pwgtoraster: No page printed, outputting empty file.");
+ out:
+
/*
* Close the streams
*/
-
- cupsRasterClose(inras);
+
+ if (inras)
+ cupsRasterClose(inras);
close(inputfd);
- cupsRasterClose(outras);
+ if (outras)
+ cupsRasterClose(outras);
close(outputfd);
/*
cmsDeleteTransform(doc.color_profile.colorTransform);
}
- return 0;
+ return (ret);
}