From 5edcd874f9a738c092ff7b2ff2266868d6c00b20 Mon Sep 17 00:00:00 2001 From: Tim Waugh Date: Aug 13 2013 14:20:40 +0000 Subject: 1.0.36. --- diff --git a/.gitignore b/.gitignore index b4808c8..e1ab8a3 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ /cups-filters-1.0.33.tar.xz /cups-filters-1.0.34.tar.xz /cups-filters-1.0.35.tar.xz +/cups-filters-1.0.36.tar.xz diff --git a/cups-filters-gs-filters.patch b/cups-filters-gs-filters.patch deleted file mode 100644 index 4e0eaf2..0000000 --- a/cups-filters-gs-filters.patch +++ /dev/null @@ -1,3406 +0,0 @@ -diff -up cups-filters-1.0.35/configure.ac.gs-filters cups-filters-1.0.35/configure.ac ---- cups-filters-1.0.35/configure.ac.gs-filters 2013-06-26 17:26:43.000000000 +0100 -+++ cups-filters-1.0.35/configure.ac 2013-08-13 10:36:31.982178082 +0100 -@@ -530,6 +530,21 @@ AS_IF([test x"$GCC" = "xyes"], [ - CFLAGS="$CFLAGS -D_GNU_SOURCE" - CXXFLAGS="$CXXFLAGS -D_GNU_SOURCE" - -+# ======= -+# gstopxl -+# ======= -+AC_PROG_SED -+dnl See if it is GNU sed or else. -+dnl - need more work to tell SED features. -+SED_EXTENDED_REGEX_OPT=-nre -+sed_variant=`sed --version 2>&1` -+sed_variant=`echo $sed_variant|sed -e 's/ .*//'` -+if test "$sed_variant" != GNU ; then -+SED_EXTENDED_REGEX_OPT=-nEe -+fi -+AC_SUBST(SED_EXTENDED_REGEX_OPT) -+AC_SUBST(CUPS_GHOSTSCRIPT) -+ - # ===================== - # Prepare all .in files - # ===================== -@@ -537,6 +552,7 @@ AC_CONFIG_FILES([ - libcupsfilters.pc - libfontembed.pc - Makefile -+ filter/gstopxl - utils/cups-browsed - utils/cups-browsed.conf - ]) -diff -up cups-filters-1.0.35/COPYING.gs-filters cups-filters-1.0.35/COPYING ---- cups-filters-1.0.35/COPYING.gs-filters 2012-11-17 20:19:18.000000000 +0000 -+++ cups-filters-1.0.35/COPYING 2013-08-13 10:36:31.956177963 +0100 -@@ -7,7 +7,7 @@ Copyright 1993-2007 Easy Software Produc - Copyright 2007-2011 Apple Inc. - Copyright 2012 Canonical Ltd. - Copyright 2006-2012 BBR Inc. --Copyright 2008-2012 Till Kamppeter -+Copyright 2008-2013 Till Kamppeter - Copyright 2008,2012 Tobias Hoffmann - Copyright 2003 Robert Sander - Copyright 2003-2006 Red Hat, Inc. -@@ -53,12 +53,13 @@ CLAIM, DAMAGES OR OTHER LIABILITY, WHETH - TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - --The filter textonly and its PPD file textonly.ppd and also the filters --texttops and imagetops are provided under the terms of version 2 of --the GNU General Public License, or (at your option) any later --version. This program is distributed in the hope that it will be --useful, but WITHOUT ANY WARRANTY; without even the implied warranty of --MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -+The filters gstopxl, textonly, and its PPD files pxlcolor.ppd, -+pxlmono.ppd, and textonly.ppd and also the filters texttops and -+imagetops are provided under the terms of version 2 of the GNU General -+Public License, or (at your option) any later version. This program is -+distributed in the hope that it will be useful, but WITHOUT ANY -+WARRANTY; without even the implied warranty of MERCHANTABILITY or -+FITNESS FOR A PARTICULAR PURPOSE. - - The filter bannertopdf and all their auxiliary files is provided under - the terms of version 3 of the GNU General Public License. This program -@@ -72,10 +73,10 @@ version.. This program is distributed in - useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - --The filters pdftoijs, pdftoopvp, pdftopdf, and pdftoraster and all --their auxiliary files and also libfontembed in the filter/fontembed --subdirectory (used by texttopdf) are also free software and are --published under MIT license: -+The filters gstoraster, pdftoijs, pdftoopvp, pdftopdf, and pdftoraster -+and all their auxiliary files and also libfontembed in the -+filter/fontembed subdirectory (used by texttopdf) are also free -+software and are published under MIT license: - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the -diff -up cups-filters-1.0.35/cupsfilters/raster.c.gs-filters cups-filters-1.0.35/cupsfilters/raster.c ---- cups-filters-1.0.35/cupsfilters/raster.c.gs-filters 2013-08-13 10:36:31.983178087 +0100 -+++ cups-filters-1.0.35/cupsfilters/raster.c 2013-08-13 10:36:31.983178087 +0100 -@@ -0,0 +1,1030 @@ -+/* -+ * Function to apply IPP options to a CUPS/PWG Raster header. -+ * -+ * Copyright 2013 by Till Kamppeter. -+ * -+ * Distribution and use rights are outlined in the file "COPYING" -+ * which should have been included with this file. -+ * -+ * Contents: -+ * -+ * cupsRasterParseIPPOptions() - Parse IPP options from the command line -+ * and apply them to the CUPS Raster header. -+ */ -+ -+/* -+ * Include necessary headers. -+ */ -+ -+#include "driver.h" -+#include -+#include -+#include -+#include -+ -+/* -+ * '_strlcpy()' - Safely copy two strings. -+ */ -+ -+size_t /* O - Length of string */ -+_strlcpy(char *dst, /* O - Destination string */ -+ const char *src, /* I - Source string */ -+ size_t size) /* I - Size of destination string buffer */ -+{ -+ size_t srclen; /* Length of source string */ -+ -+ -+ /* -+ * Figure out how much room is needed... -+ */ -+ -+ size --; -+ -+ srclen = strlen(src); -+ -+ /* -+ * Copy the appropriate amount... -+ */ -+ -+ if (srclen > size) -+ srclen = size; -+ -+ memcpy(dst, src, srclen); -+ dst[srclen] = '\0'; -+ -+ return (srclen); -+} -+ -+/* -+ * 'cupsRasterParseIPPOptions()' - Parse IPP options from the command line -+ * and apply them to the CUPS Raster header. -+ */ -+ -+int /* O - -1 on error, 0 on success */ -+cupsRasterParseIPPOptions(cups_page_header2_t *h, /* I - Raster header */ -+ int num_options, /* I - Number of options */ -+ cups_option_t *options, /* I - Options */ -+ int pwg_raster, /* I - 1 if PWG Raster */ -+ int set_defaults) /* I - If 1, se default values -+ for all fields for which -+ we did not get an option */ -+{ -+ int i; /* Looping var */ -+ char *ptr, /* Pointer into string */ -+ s[255]; /* Temporary string */ -+ const char *val, /* Pointer into value */ -+ *media, /* media option */ -+ *page_size, /* PageSize option */ -+ *media_source, /* Media source */ -+ *media_type; /* Media type */ -+ pwg_media_t *size_found; /* page size found for given name */ -+ -+ /* -+ * Range check input... -+ */ -+ -+ if (!h) -+ return (-1); -+ -+ /* -+ * Check if the supplied "media" option is a comma-separated list of any -+ * combination of page size ("media"), media source ("media-position"), -+ * and media type ("media-type") and if so, put these list elements into -+ * their dedicated options. -+ */ -+ -+ page_size = NULL; -+ media_source = NULL; -+ media_type = NULL; -+ if ((media = cupsGetOption("media", num_options, options)) != NULL) -+ { -+ /* -+ * Loop through the option string, separating it at commas and marking each -+ * individual option as long as the corresponding PPD option (PageSize, -+ * InputSlot, etc.) is not also set. -+ * -+ * For PageSize, we also check for an empty option value since some versions -+ * of MacOS X use it to specify auto-selection of the media based solely on -+ * the size. -+ */ -+ -+ for (val = media; *val;) -+ { -+ /* -+ * Extract the sub-option from the string... -+ */ -+ -+ for (ptr = s; *val && *val != ',' && (ptr - s) < (sizeof(s) - 1);) -+ *ptr++ = *val++; -+ *ptr++ = '\0'; -+ -+ if (*val == ',') -+ val ++; -+ -+ /* -+ * Identify it... -+ */ -+ -+ size_found = NULL; -+ if ((size_found = pwgMediaForPWG(s)) == NULL) -+ if ((size_found = pwgMediaForPPD(s)) == NULL) -+ if ((size_found = pwgMediaForPPD(s)) == NULL) -+ { -+ if (strcasestr(s, "tray") || -+ strcasestr(s, "feed") || -+ strcasestr(s, "capacity") || -+ strcasestr(s, "upper") || -+ strcasestr(s, "top") || -+ strcasestr(s, "middle") || -+ strcasestr(s, "lower") || -+ strcasestr(s, "bottom") || -+ strcasestr(s, "left") || -+ strcasestr(s, "right") || -+ strcasestr(s, "side") || -+ strcasestr(s, "main")) -+ media_source = strdup(s); -+ else -+ media_type = strdup(s); -+ } -+ if (size_found) -+ page_size = strdup(size_found->pwg); -+ } -+ } -+ -+ if (pwg_raster) -+ strcpy(h->MediaClass, "PwgRaster"); -+ else if ((val = cupsGetOption("media-class", num_options, options)) != NULL || -+ (val = cupsGetOption("MediaClass", num_options, options)) != NULL) -+ _strlcpy(h->MediaClass, val, sizeof(h->MediaClass)); -+ else if (set_defaults) -+ strcpy(h->MediaClass, "PwgRaster"); -+ -+ if ((val = cupsGetOption("media-color", num_options, options)) != NULL || -+ (val = cupsGetOption("MediaColor", num_options, options)) != NULL) -+ _strlcpy(h->MediaColor, val, sizeof(h->MediaColor)); -+ else if (set_defaults) -+ h->MediaColor[0] = '\0'; -+ -+ if ((val = cupsGetOption("media-type", num_options, options)) != NULL || -+ (val = cupsGetOption("MediaType", num_options, options)) != NULL || -+ (val = media_type) != NULL) -+ _strlcpy(h->MediaType, val, sizeof(h->MediaType)); -+ else if (set_defaults) -+ h->MediaType[0] = '\0'; -+ -+ if ((val = cupsGetOption("print-content-optimize", num_options, -+ options)) != NULL || -+ (val = cupsGetOption("output-type", num_options, options)) != NULL || -+ (val = cupsGetOption("OutputType", num_options, options)) != NULL) -+ { -+ if (!strcasecmp(val, "automatic")) -+ _strlcpy(h->OutputType, "Automatic", -+ sizeof(h->OutputType)); -+ else if (!strcasecmp(val, "graphics")) -+ _strlcpy(h->OutputType, "Graphics", sizeof(h->OutputType)); -+ else if (!strcasecmp(val, "photo")) -+ _strlcpy(h->OutputType, "Photo", sizeof(h->OutputType)); -+ else if (!strcasecmp(val, "text")) -+ _strlcpy(h->OutputType, "Text", sizeof(h->OutputType)); -+ else if (!strcasecmp(val, "text-and-graphics") || -+ !strcasecmp(val, "TextAndGraphics")) -+ _strlcpy(h->OutputType, "TextAndGraphics", -+ sizeof(h->OutputType)); -+ else if (pwg_raster) -+ fprintf(stderr, "DEBUG: Unsupported print-content-type \"%s\".\n", val); -+ else -+ _strlcpy(h->OutputType, val, sizeof(h->OutputType)); -+ } -+ else if (set_defaults) -+ _strlcpy(h->OutputType, "Automatic", sizeof(h->OutputType)); -+ -+ if (pwg_raster) -+ { -+ /* Set "reserved" fields to 0 */ -+ h->AdvanceDistance = 0; -+ h->AdvanceMedia = CUPS_ADVANCE_NONE; -+ h->Collate = CUPS_FALSE; -+ } -+ else -+ { -+ /* TODO - Support for advance distance and advance media */ -+ if (set_defaults) -+ { -+ h->AdvanceDistance = 0; -+ h->AdvanceMedia = CUPS_ADVANCE_NONE; -+ } -+ if ((val = cupsGetOption("Collate", num_options, options)) != NULL && -+ (!strcasecmp(val, "true") || !strcasecmp(val, "on") || -+ !strcasecmp(val, "yes"))) -+ h->Collate = CUPS_TRUE; -+ else if ((val = cupsGetOption("Collate", num_options, options)) != NULL && -+ (!strcasecmp(val, "false") || !strcasecmp(val, "off") || -+ !strcasecmp(val, "no"))) -+ h->Collate = CUPS_FALSE; -+ else if (set_defaults) -+ h->Collate = CUPS_FALSE; -+ } -+ -+ if (set_defaults) -+ h->CutMedia = CUPS_CUT_NONE; -+ -+ if ((val = cupsGetOption("sides", num_options, options)) != NULL || -+ (val = cupsGetOption("Duplex", num_options, options)) != NULL) -+ { -+ if (!strcasecmp(val, "None") || !strcasecmp(val, "Off") || -+ !strcasecmp(val, "False") || !strcasecmp(val, "No") || -+ !strcasecmp(val, "one-sided") || !strcasecmp(val, "OneSided")) -+ h->Duplex = CUPS_FALSE; -+ else if (!strcasecmp(val, "On") || -+ !strcasecmp(val, "True") || !strcasecmp(val, "Yes") || -+ !strncasecmp(val, "two-sided", 9) || -+ !strncasecmp(val, "TwoSided", 8) || -+ !strncasecmp(val, "Duplex", 6)) -+ h->Duplex = CUPS_TRUE; -+ else if (set_defaults) -+ h->Duplex = CUPS_FALSE; -+ } -+ else if (set_defaults) -+ h->Duplex = CUPS_FALSE; -+ -+ if ((val = cupsGetOption("printer-resolution", num_options, -+ options)) != NULL || -+ (val = cupsGetOption("Resolution", num_options, options)) != NULL) -+ { -+ int xres, /* X resolution */ -+ yres; /* Y resolution */ -+ char *ptr; /* Pointer into value */ -+ -+ xres = yres = strtol(val, (char **)&ptr, 10); -+ if (ptr > val && xres > 0) -+ { -+ if (*ptr == 'x') -+ yres = strtol(ptr + 1, (char **)&ptr, 10); -+ } -+ -+ if (ptr <= val || xres <= 0 || yres <= 0 || !ptr || -+ (strcasecmp(ptr, "dpi") && -+ strcasecmp(ptr, "dpc") && -+ strcasecmp(ptr, "dpcm"))) -+ { -+ fprintf(stderr, "DEBUG: Bad resolution value \"%s\".\n", val); -+ if (set_defaults) -+ { -+ h->HWResolution[0] = 600; -+ h->HWResolution[1] = 600; -+ } -+ } -+ else -+ { -+ if (!strcasecmp(ptr, "dpc") || -+ !strcasecmp(ptr, "dpcm")) -+ { -+ xres = xres * 254 / 100; -+ yres = yres * 254 / 100; -+ } -+ h->HWResolution[0] = xres; -+ h->HWResolution[1] = yres; -+ } -+ } -+ else if (set_defaults) -+ { -+ h->HWResolution[0] = 600; -+ h->HWResolution[1] = 600; -+ } -+ -+ if (set_defaults) -+ { -+ /* TODO - Support for insert sheets */ -+ h->InsertSheet = CUPS_FALSE; -+ } -+ -+ if (set_defaults) -+ { -+ /* TODO - Support for jog */ -+ h->Jog = CUPS_JOG_NONE; -+ } -+ -+ if ((val = cupsGetOption("feed-orientation", num_options, -+ options)) != NULL || -+ (val = cupsGetOption("feed-direction", num_options, options)) != NULL || -+ (val = cupsGetOption("LeadingEdge", num_options, options)) != NULL) -+ { -+ if (!strcasecmp(val, "ShortEdgeFirst")) -+ h->LeadingEdge = CUPS_EDGE_TOP; -+ else if (!strcasecmp(val, "LongEdgeFirst")) -+ h->LeadingEdge = CUPS_EDGE_RIGHT; -+ else -+ fprintf(stderr, "DEBUG: Unsupported feed-orientation \"%s\".\n", val); -+ } -+ else if (set_defaults) -+ h->LeadingEdge = CUPS_EDGE_TOP; -+ -+ if (pwg_raster || set_defaults) -+ { -+ /* TODO - Support for margins */ -+ h->Margins[0] = 0; -+ h->Margins[1] = 0; -+ } -+ -+ if (pwg_raster || set_defaults) -+ { -+ /* TODO - Support for manual feed */ -+ h->ManualFeed = CUPS_FALSE; -+ } -+ -+ if ((val = cupsGetOption("media-position", num_options, options)) != NULL || -+ (val = cupsGetOption("MediaPosition", num_options, options)) != NULL || -+ (val = cupsGetOption("media-source", num_options, options)) != NULL || -+ (val = cupsGetOption("MediaSource", num_options, options)) != NULL || -+ (val = cupsGetOption("InputSlot", num_options, options)) != NULL || -+ (val = media_source) != NULL) -+ { -+ if (!strncasecmp(val, "Auto", 4) || -+ !strncasecmp(val, "Default", 7)) -+ h->MediaPosition = 0; -+ else if (!strcasecmp(val, "Main")) -+ h->MediaPosition = 1; -+ else if (!strcasecmp(val, "Alternate")) -+ h->MediaPosition = 2; -+ else if (!strcasecmp(val, "LargeCapacity")) -+ h->MediaPosition = 3; -+ else if (!strcasecmp(val, "Manual")) -+ h->MediaPosition = 4; -+ else if (!strcasecmp(val, "Envelope")) -+ h->MediaPosition = 5; -+ else if (!strcasecmp(val, "Disc")) -+ h->MediaPosition = 6; -+ else if (!strcasecmp(val, "Photo")) -+ h->MediaPosition = 7; -+ else if (!strcasecmp(val, "Hagaki")) -+ h->MediaPosition = 8; -+ else if (!strcasecmp(val, "MainRoll")) -+ h->MediaPosition = 9; -+ else if (!strcasecmp(val, "AlternateRoll")) -+ h->MediaPosition = 10; -+ else if (!strcasecmp(val, "Top")) -+ h->MediaPosition = 11; -+ else if (!strcasecmp(val, "Middle")) -+ h->MediaPosition = 12; -+ else if (!strcasecmp(val, "Bottom")) -+ h->MediaPosition = 13; -+ else if (!strcasecmp(val, "Side")) -+ h->MediaPosition = 14; -+ else if (!strcasecmp(val, "Left")) -+ h->MediaPosition = 15; -+ else if (!strcasecmp(val, "Right")) -+ h->MediaPosition = 16; -+ else if (!strcasecmp(val, "Center")) -+ h->MediaPosition = 17; -+ else if (!strcasecmp(val, "Rear")) -+ h->MediaPosition = 18; -+ else if (!strcasecmp(val, "ByPassTray")) -+ h->MediaPosition = 19; -+ else if (!strcasecmp(val, "Tray1")) -+ h->MediaPosition = 20; -+ else if (!strcasecmp(val, "Tray2")) -+ h->MediaPosition = 21; -+ else if (!strcasecmp(val, "Tray3")) -+ h->MediaPosition = 22; -+ else if (!strcasecmp(val, "Tray4")) -+ h->MediaPosition = 23; -+ else if (!strcasecmp(val, "Tray5")) -+ h->MediaPosition = 24; -+ else if (!strcasecmp(val, "Tray6")) -+ h->MediaPosition = 25; -+ else if (!strcasecmp(val, "Tray7")) -+ h->MediaPosition = 26; -+ else if (!strcasecmp(val, "Tray8")) -+ h->MediaPosition = 27; -+ else if (!strcasecmp(val, "Tray9")) -+ h->MediaPosition = 28; -+ else if (!strcasecmp(val, "Tray10")) -+ h->MediaPosition = 29; -+ else if (!strcasecmp(val, "Tray11")) -+ h->MediaPosition = 30; -+ else if (!strcasecmp(val, "Tray12")) -+ h->MediaPosition = 31; -+ else if (!strcasecmp(val, "Tray13")) -+ h->MediaPosition = 32; -+ else if (!strcasecmp(val, "Tray14")) -+ h->MediaPosition = 33; -+ else if (!strcasecmp(val, "Tray15")) -+ h->MediaPosition = 34; -+ else if (!strcasecmp(val, "Tray16")) -+ h->MediaPosition = 35; -+ else if (!strcasecmp(val, "Tray17")) -+ h->MediaPosition = 36; -+ else if (!strcasecmp(val, "Tray18")) -+ h->MediaPosition = 37; -+ else if (!strcasecmp(val, "Tray19")) -+ h->MediaPosition = 38; -+ else if (!strcasecmp(val, "Tray20")) -+ h->MediaPosition = 39; -+ else if (!strcasecmp(val, "Roll1")) -+ h->MediaPosition = 40; -+ else if (!strcasecmp(val, "Roll2")) -+ h->MediaPosition = 41; -+ else if (!strcasecmp(val, "Roll3")) -+ h->MediaPosition = 42; -+ else if (!strcasecmp(val, "Roll4")) -+ h->MediaPosition = 43; -+ else if (!strcasecmp(val, "Roll5")) -+ h->MediaPosition = 44; -+ else if (!strcasecmp(val, "Roll6")) -+ h->MediaPosition = 45; -+ else if (!strcasecmp(val, "Roll7")) -+ h->MediaPosition = 46; -+ else if (!strcasecmp(val, "Roll8")) -+ h->MediaPosition = 47; -+ else if (!strcasecmp(val, "Roll9")) -+ h->MediaPosition = 48; -+ else if (!strcasecmp(val, "Roll10")) -+ h->MediaPosition = 49; -+ else -+ fprintf(stderr, "DEBUG: Unsupported media source \"%s\".\n", val); -+ } -+ else if (set_defaults) -+ h->MediaPosition = 0; /* Auto */ -+ -+ if ((val = cupsGetOption("media-weight", num_options, options)) != NULL || -+ (val = cupsGetOption("MediaWeight", num_options, options)) != NULL || -+ (val = cupsGetOption("media-weight-metric", num_options, -+ options)) != NULL || -+ (val = cupsGetOption("MediaWeightMetric", num_options, options)) != NULL) -+ h->MediaWeight = atol(val); -+ else if (set_defaults) -+ h->MediaWeight = 0; -+ -+ if (pwg_raster) -+ { -+ /* Set "reserved" fields to 0 */ -+ h->MirrorPrint = CUPS_FALSE; -+ h->NegativePrint = CUPS_FALSE; -+ } -+ else -+ { -+ if ((val = cupsGetOption("mirror-print", num_options, options)) != NULL || -+ (val = cupsGetOption("MirrorPrint", num_options, options)) != NULL) -+ { -+ if (!strcasecmp(val, "true") || !strcasecmp(val, "on") || -+ !strcasecmp(val, "yes")) -+ h->MirrorPrint = CUPS_TRUE; -+ else if (!strcasecmp(val, "false") || -+ !strcasecmp(val, "off") || -+ !strcasecmp(val, "no")) -+ h->MirrorPrint = CUPS_FALSE; -+ else if (set_defaults) -+ h->MirrorPrint = CUPS_FALSE; -+ } -+ if ((val = cupsGetOption("negative-print", num_options, options)) != NULL || -+ (val = cupsGetOption("NegativePrint", num_options, options)) != NULL) -+ { -+ if (!strcasecmp(val, "true") || !strcasecmp(val, "on") || -+ !strcasecmp(val, "yes")) -+ h->NegativePrint = CUPS_TRUE; -+ else if (!strcasecmp(val, "false") || -+ !strcasecmp(val, "off") || -+ !strcasecmp(val, "no")) -+ h->NegativePrint = CUPS_FALSE; -+ else if (set_defaults) -+ h->NegativePrint = CUPS_FALSE; -+ } -+ } -+ -+ if ((val = cupsGetOption("copies", num_options, options)) != NULL || -+ (val = cupsGetOption("Copies", num_options, options)) != NULL || -+ (val = cupsGetOption("num-copies", num_options, options)) != NULL || -+ (val = cupsGetOption("NumCopies", num_options, options)) != NULL) -+ h->NumCopies = atol(val); -+ else if (set_defaults) -+ h->NumCopies = 1; /* 0 = Printer default */ -+ -+ if ((val = cupsGetOption("orientation-requested", num_options, -+ options)) != NULL || -+ (val = cupsGetOption("OrientationRequested", num_options, -+ options)) != NULL || -+ (val = cupsGetOption("Orientation", num_options, options)) != NULL) -+ { -+ if (!strcasecmp(val, "Portrait") || -+ !strcasecmp(val, "3")) -+ h->Orientation = CUPS_ORIENT_0; -+ else if (!strcasecmp(val, "Landscape") || -+ !strcasecmp(val, "4")) -+ h->Orientation = CUPS_ORIENT_90; -+ else if (!strcasecmp(val, "reverse-portrait") || -+ !strcasecmp(val, "ReversePortrait") || -+ !strcasecmp(val, "5")) -+ h->Orientation = CUPS_ORIENT_180; -+ else if (!strcasecmp(val, "reverse-landscape") || -+ !strcasecmp(val, "ReverseLandscape") || -+ !strcasecmp(val, "6")) -+ h->Orientation = CUPS_ORIENT_270; -+ else -+ fprintf(stderr, "DEBUG: Unsupported Orientation \"%s\".\n", val); -+ } -+ else if (set_defaults) -+ h->Orientation = CUPS_ORIENT_0; -+ -+ if (pwg_raster) -+ { -+ /* Set "reserved" fields to 0 */ -+ h->OutputFaceUp = CUPS_FALSE; -+ } -+ else -+ { -+ if ((val = cupsGetOption("OutputFaceUp", num_options, options)) != NULL || -+ (val = cupsGetOption("output-face-up", num_options, options)) != NULL) -+ { -+ if (!strcasecmp(val, "true") || !strcasecmp(val, "on") || -+ !strcasecmp(val, "yes")) -+ h->OutputFaceUp = CUPS_TRUE; -+ else if (!strcasecmp(val, "false") || -+ !strcasecmp(val, "off") || -+ !strcasecmp(val, "no")) -+ h->OutputFaceUp = CUPS_FALSE; -+ else if (set_defaults) -+ h->OutputFaceUp = CUPS_FALSE; -+ } -+ } -+ -+ if ((val = cupsGetOption("media-size", num_options, options)) != NULL || -+ (val = cupsGetOption("MediaSize", num_options, options)) != NULL || -+ (val = cupsGetOption("page-size", num_options, options)) != NULL || -+ (val = cupsGetOption("PageSize", num_options, options)) != NULL || -+ (val = page_size) != NULL) -+ { -+ size_found = NULL; -+ if ((size_found = pwgMediaForPWG(val)) == NULL) -+ if ((size_found = pwgMediaForPPD(val)) == NULL) -+ size_found = pwgMediaForLegacy(val); -+ if (size_found != NULL) -+ { -+ h->PageSize[0] = size_found->width * 72 / 2540; -+ h->PageSize[1] = size_found->length * 72 / 2540; -+ _strlcpy(h->cupsPageSizeName, size_found->pwg, -+ sizeof(h->cupsPageSizeName)); -+ if (pwg_raster) -+ { -+ h->cupsPageSize[0] = 0.0; -+ h->cupsPageSize[1] = 0.0; -+ } -+ else -+ { -+ h->cupsPageSize[0] = size_found->width * 72.0 / 2540.0; -+ h->cupsPageSize[1] = size_found->length * 72.0 / 2540.0; -+ } -+ } -+ else -+ fprintf(stderr, "DEBUG: Unsupported page size %s.\n", val); -+ } -+ else if (set_defaults) -+ { -+ /* TODO: Automatic A4/Letter, like in scheduler/conf.c in CUPS. */ -+ h->PageSize[0] = 612; -+ h->PageSize[1] = 792; -+ _strlcpy(h->cupsPageSizeName, "na_letter_8.5x11in", -+ sizeof(h->cupsPageSizeName)); -+ if (pwg_raster) -+ { -+ h->cupsPageSize[0] = 0.0; -+ h->cupsPageSize[1] = 0.0; -+ } -+ } -+ else if (pwg_raster) -+ { -+ h->cupsPageSize[0] = 0.0; -+ h->cupsPageSize[1] = 0.0; -+ } -+ -+ if (pwg_raster) -+ { -+ /* Set "reserved" fields to 0 */ -+ h->ImagingBoundingBox[0] = 0; -+ h->ImagingBoundingBox[1] = 0; -+ h->ImagingBoundingBox[2] = 0; -+ h->ImagingBoundingBox[3] = 0; -+ h->cupsImagingBBox[0] = 0.0; -+ h->cupsImagingBBox[1] = 0.0; -+ h->cupsImagingBBox[2] = 0.0; -+ h->cupsImagingBBox[3] = 0.0; -+ } -+ else -+ { -+ /* TODO - Support for non-zero margins */ -+ h->ImagingBoundingBox[0] = 0; -+ h->ImagingBoundingBox[1] = 0; -+ h->ImagingBoundingBox[2] = h->PageSize[0]; -+ h->ImagingBoundingBox[3] = h->PageSize[1]; -+ h->cupsImagingBBox[0] = 0.0; -+ h->cupsImagingBBox[1] = 0.0; -+ h->cupsImagingBBox[2] = h->cupsPageSize[0]; -+ h->cupsImagingBBox[3] = h->cupsPageSize[1]; -+ } -+ -+ if (pwg_raster) -+ { -+ /* Set "reserved" fields to 0 */ -+ h->Separations = CUPS_FALSE; -+ h->TraySwitch = CUPS_FALSE; -+ } -+ else -+ { -+ if ((val = cupsGetOption("separations", num_options, options)) != NULL || -+ (val = cupsGetOption("Separations", num_options, options)) != NULL) -+ { -+ if (!strcasecmp(val, "true") || !strcasecmp(val, "on") || -+ !strcasecmp(val, "yes")) -+ h->Separations = CUPS_TRUE; -+ else if (!strcasecmp(val, "false") || -+ !strcasecmp(val, "off") || -+ !strcasecmp(val, "no")) -+ h->Separations = CUPS_FALSE; -+ else if (set_defaults) -+ h->Separations = CUPS_FALSE; -+ } -+ if ((val = cupsGetOption("tray-switch", num_options, options)) != NULL || -+ (val = cupsGetOption("TraySwitch", num_options, options)) != NULL) -+ { -+ if (!strcasecmp(val, "true") || !strcasecmp(val, "on") || -+ !strcasecmp(val, "yes")) -+ h->TraySwitch = CUPS_TRUE; -+ else if (!strcasecmp(val, "false") || -+ !strcasecmp(val, "off") || -+ !strcasecmp(val, "no")) -+ h->TraySwitch = CUPS_FALSE; -+ else if (set_defaults) -+ h->TraySwitch = CUPS_FALSE; -+ } -+ } -+ -+ if ((val = cupsGetOption("sides", num_options, options)) != NULL || -+ (val = cupsGetOption("Tumble", num_options, options)) != NULL) -+ { -+ if (!strcasecmp(val, "None") || !strcasecmp(val, "Off") || -+ !strcasecmp(val, "False") || !strcasecmp(val, "No") || -+ !strcasecmp(val, "one-sided") || !strcasecmp(val, "OneSided") || -+ !strcasecmp(val, "two-sided-long-edge") || -+ !strcasecmp(val, "TwoSidedLongEdge") || -+ !strcasecmp(val, "DuplexNoTumble")) -+ h->Tumble = CUPS_FALSE; -+ else if (!strcasecmp(val, "On") || -+ !strcasecmp(val, "True") || !strcasecmp(val, "Yes") || -+ !strcasecmp(val, "two-sided-short-edge") || -+ !strcasecmp(val, "TwoSidedShortEdge") || -+ !strcasecmp(val, "DuplexTumble")) -+ h->Tumble = CUPS_TRUE; -+ else if (set_defaults) -+ h->Tumble = CUPS_FALSE; -+ } -+ else if (set_defaults) -+ h->Tumble = CUPS_FALSE; -+ -+ h->cupsWidth = h->HWResolution[0] * h->PageSize[0] / 72; -+ h->cupsHeight = h->HWResolution[1] * h->PageSize[1] / 72; -+ -+ if (pwg_raster || set_defaults) -+ { -+ /* TODO - Support for MediaType number */ -+ h->cupsMediaType = 0; -+ } -+ -+ if ((val = cupsGetOption("pwg-raster-document-type", num_options, -+ options)) != NULL || -+ (val = cupsGetOption("PwgRasterDocumentType", num_options, -+ options)) != NULL || -+ (val = cupsGetOption("print-color-mode", num_options, -+ options)) != NULL || -+ (val = cupsGetOption("PrintColorMode", num_options, options)) != NULL || -+ (val = cupsGetOption("color-space", num_options, options)) != NULL || -+ (val = cupsGetOption("ColorSpace", num_options, options)) != NULL || -+ (val = cupsGetOption("color-model", num_options, options)) != NULL || -+ (val = cupsGetOption("ColorModel", num_options, options)) != NULL) -+ { -+ int bitspercolor, /* Bits per color */ -+ bitsperpixel, /* Bits per pixel */ -+ colorspace, /* CUPS/PWG raster color space */ -+ numcolors; /* Number of colorants */ -+ const char *ptr; /* Pointer into value */ -+ -+ ptr = NULL; -+ numcolors = 0; -+ bitspercolor = 8; -+ if (!strncasecmp(val, "AdobeRgb", 8)) -+ { -+ if (*(val + 8) == '_') -+ ptr = val + 9; -+ colorspace = 20; -+ numcolors = 3; -+ } -+ else if (!strncasecmp(val, "Black", 5)) -+ { -+ if (*(val + 5) == '_') -+ ptr = val + 6; -+ bitspercolor = 1; -+ colorspace = 3; -+ numcolors = 1; -+ } -+ else if (!strncasecmp(val, "Cmyk", 4)) -+ { -+ if (*(val + 4) == '_') -+ ptr = val + 5; -+ colorspace = 6; -+ numcolors = 4; -+ } -+ else if (!strncasecmp(val, "Device", 6)) -+ { -+ ptr = val + 6; -+ numcolors = strtol(ptr, (char **)&ptr, 10); -+ if (*ptr == '_') -+ { -+ ptr ++; -+ colorspace = 47 + numcolors; -+ } -+ else -+ { -+ numcolors = 0; -+ ptr = NULL; -+ } -+ } -+ else if (!strncasecmp(val, "Rgb", 3)) -+ { -+ if (*(val + 3) == '_') -+ ptr = val + 4; -+ colorspace = 1; -+ numcolors = 3; -+ } -+ else if (!strncasecmp(val, "Sgray", 5)) -+ { -+ if (*(val + 5) == '_') -+ ptr = val + 6; -+ colorspace = 18; -+ numcolors = 1; -+ } -+ else if (!strncasecmp(val, "Srgb", 4)) -+ { -+ if (*(val + 4) == '_') -+ ptr = val + 5; -+ colorspace = 19; -+ numcolors = 3; -+ } -+ if (numcolors > 0) -+ { -+ if (ptr) -+ bitspercolor = strtol(ptr, (char **)&ptr, 10); -+ bitsperpixel = bitspercolor * numcolors; -+ h->cupsBitsPerColor = bitspercolor; -+ h->cupsBitsPerPixel = bitsperpixel; -+ h->cupsColorSpace = colorspace; -+ h->cupsNumColors = numcolors; -+ } -+ else -+ { -+ fprintf(stderr, "DEBUG: Bad color space value \"%s\".\n", val); -+ if (set_defaults) -+ { -+ h->cupsBitsPerColor = 1; -+ h->cupsBitsPerPixel = 1; -+ h->cupsColorSpace = 3; -+ h->cupsNumColors = 1; -+ } -+ } -+ } -+ else if (set_defaults) -+ { -+ h->cupsBitsPerColor = 1; -+ h->cupsBitsPerPixel = 1; -+ h->cupsColorSpace = 3; -+ h->cupsNumColors = 1; -+ } -+ -+ h->cupsBytesPerLine = (h->cupsWidth * h->cupsBitsPerPixel + 7) / 8; -+ -+ if (pwg_raster || set_defaults) -+ { -+ /* TODO - Support for color orders 1 (banded) and 2 (planar) */ -+ h->cupsColorOrder = 0; -+ } -+ -+ if (pwg_raster || set_defaults) -+ { -+ /* TODO - Support for these parameters */ -+ h->cupsCompression = 0; -+ h->cupsRowCount = 0; -+ h->cupsRowFeed = 0; -+ h->cupsRowStep = 0; -+ } -+ -+ if (pwg_raster || set_defaults) -+ { -+ /* TODO - Support for cupsBorderlessScalingFactor */ -+ h->cupsBorderlessScalingFactor = 0.0; -+ } -+ -+ if (pwg_raster || set_defaults) -+ { -+ /* TODO - Support for custom values in CUPS Raster mode */ -+ for (i = 0; i < 16; i ++) -+ { -+ h->cupsInteger[i] = 0; -+ h->cupsReal[i] = 0.0; -+ memset(h->cupsString[i], 0, 64); -+ } -+ } -+ -+ if (pwg_raster) -+ { -+ -+ if ((val = cupsGetOption("job-impressions", num_options, -+ options)) != NULL || -+ (val = cupsGetOption("JobImpressions", num_options, options)) != NULL || -+ (val = cupsGetOption("Impressions", num_options, options)) != NULL) -+ { -+ int impressions = atoi(val); -+ if (impressions >= 0) -+ h->cupsInteger[0] = impressions; -+ } -+ -+ if ((val = cupsGetOption("pwg-raster-document-sheet-back", num_options, -+ options)) != NULL || -+ (val = cupsGetOption("PwgRasterDocumentSheetBack", num_options, -+ options)) != NULL) -+ { -+ /* Set CrossFeedTransform and FeedTransform */ -+ if (h->Duplex == CUPS_FALSE) -+ { -+ h->cupsInteger[1] = 1; -+ h->cupsInteger[2] = 1; -+ } -+ else if (h->Duplex == CUPS_TRUE) -+ { -+ if (h->Tumble == CUPS_FALSE) -+ { -+ if (!strcasecmp(val, "Flipped")) -+ { -+ h->cupsInteger[1] = 1; -+ h->cupsInteger[2] = -1; -+ } -+ else if (!strncasecmp(val, "Manual", 6)) -+ { -+ h->cupsInteger[1] = 1; -+ h->cupsInteger[2] = 1; -+ } -+ else if (!strcasecmp(val, "Normal")) -+ { -+ h->cupsInteger[1] = 1; -+ h->cupsInteger[2] = 1; -+ } -+ else if (!strcasecmp(val, "Rotated")) -+ { -+ h->cupsInteger[1] = -1; -+ h->cupsInteger[2] = -1; -+ } -+ else -+ { -+ h->cupsInteger[1] = 1; -+ h->cupsInteger[2] = 1; -+ } -+ } -+ else -+ { -+ if (!strcasecmp(val, "Flipped")) -+ { -+ h->cupsInteger[1] = -1; -+ h->cupsInteger[2] = 1; -+ } -+ else if (!strncasecmp(val, "Manual", 6)) -+ { -+ h->cupsInteger[1] = -1; -+ h->cupsInteger[2] = -1; -+ } -+ else if (!strcasecmp(val, "Normal")) -+ { -+ h->cupsInteger[1] = 1; -+ h->cupsInteger[2] = 1; -+ } -+ else if (!strcasecmp(val, "Rotated")) -+ { -+ h->cupsInteger[1] = 1; -+ h->cupsInteger[2] = 1; -+ } -+ else -+ { -+ h->cupsInteger[1] = 1; -+ h->cupsInteger[2] = 1; -+ } -+ } -+ } -+ else -+ { -+ h->cupsInteger[1] = 1; -+ h->cupsInteger[2] = 1; -+ } -+ } -+ else -+ { -+ h->cupsInteger[1] = 1; -+ h->cupsInteger[2] = 1; -+ } -+ -+ /* TODO - Support for ImageBoxLeft, ImageBoxTop, ImageBoxRight, and -+ ImageBoxBottom (h->cupsInteger[3..6]), leave on 0 for now */ -+ -+ if ((val = cupsGetOption("alternate-primary", num_options, -+ options)) != NULL || -+ (val = cupsGetOption("AlternatePrimary", num_options, -+ options)) != NULL) -+ { -+ int alternateprimary = atoi(val); /* SRGB value for black -+ pixels */ -+ h->cupsInteger[7] = alternateprimary; -+ } -+ -+ if ((val = cupsGetOption("print-quality", num_options, options)) != NULL || -+ (val = cupsGetOption("PrintQuality", num_options, options)) != NULL || -+ (val = cupsGetOption("Quality", num_options, options)) != NULL) -+ { -+ int quality = atoi(val); /* print-quality value */ -+ -+ if (!quality || -+ (quality >= IPP_QUALITY_DRAFT && quality <= IPP_QUALITY_HIGH)) -+ h->cupsInteger[8] = quality; -+ else -+ fprintf(stderr, "DEBUG: Unsupported print-quality %d.\n", quality); -+ } -+ -+ /* Leave "reserved" fields (h->cupsInteger[9..13]) on 0 */ -+ -+ if ((val = cupsGetOption("vendor-identifier", num_options, -+ options)) != NULL || -+ (val = cupsGetOption("VendorIdentifier", num_options, -+ options)) != NULL) -+ { -+ int vendorid = atoi(val); /* USB ID of manufacturer */ -+ h->cupsInteger[14] = vendorid; -+ } -+ -+ if ((val = cupsGetOption("vendor-length", num_options, -+ options)) != NULL || -+ (val = cupsGetOption("VendorLength", num_options, -+ options)) != NULL) -+ { -+ int vendorlength = atoi(val); /* How many bytes of vendor -+ data? */ -+ if (vendorlength <= 1088) -+ { -+ h->cupsInteger[15] = vendorlength; -+ if ((val = cupsGetOption("vendor-data", num_options, -+ options)) != NULL || -+ (val = cupsGetOption("VendorData", num_options, -+ options)) != NULL) -+ /* TODO - How to enter binary data here? */ -+ _strlcpy((char *)&(h->cupsReal[0]), val, 1088); -+ } -+ } -+ } -+ -+ if (pwg_raster || set_defaults) -+ { -+ /* Set "reserved" fields to 0 */ -+ memset(h->cupsMarkerType, 0, 64); -+ } -+ -+ if ((val = cupsGetOption("print-rendering-intent", num_options, -+ options)) != NULL || -+ (val = cupsGetOption("PrintRenderingIntent", num_options, -+ options)) != NULL || -+ (val = cupsGetOption("RenderingIntent", num_options, -+ options)) != NULL) -+ { -+ if (!strcmp(val, "absolute")) -+ _strlcpy(h->cupsRenderingIntent, "Absolute", -+ sizeof(h->cupsRenderingIntent)); -+ else if (!strcmp(val, "automatic")) -+ _strlcpy(h->cupsRenderingIntent, "Automatic", -+ sizeof(h->cupsRenderingIntent)); -+ else if (!strcmp(val, "perceptual")) -+ _strlcpy(h->cupsRenderingIntent, "Perceptual", -+ sizeof(h->cupsRenderingIntent)); -+ else if (!strcmp(val, "relative")) -+ _strlcpy(h->cupsRenderingIntent, "Relative", -+ sizeof(h->cupsRenderingIntent)); -+ else if (!strcmp(val, "relative-bpc")) -+ _strlcpy(h->cupsRenderingIntent, "RelativeBpc", -+ sizeof(h->cupsRenderingIntent)); -+ else if (!strcmp(val, "saturation")) -+ _strlcpy(h->cupsRenderingIntent, "Saturation", -+ sizeof(h->cupsRenderingIntent)); -+ else -+ fprintf(stderr, "DEBUG: Unsupported print-rendering-intent \"%s\".\n", -+ val); -+ } -+ else if (set_defaults) -+ h->cupsRenderingIntent[0] = '\0'; -+ -+ return (0); -+} -+ -+ -+/* -+ * End -+ */ -diff -up cups-filters-1.0.35/cupsfilters/raster.h.gs-filters cups-filters-1.0.35/cupsfilters/raster.h ---- cups-filters-1.0.35/cupsfilters/raster.h.gs-filters 2013-08-13 10:36:31.983178087 +0100 -+++ cups-filters-1.0.35/cupsfilters/raster.h 2013-08-13 10:36:31.983178087 +0100 -@@ -0,0 +1,55 @@ -+/* -+ * CUPS/PWG Raster utilities header file for CUPS. -+ * -+ * Copyright 2013 by Till Kamppeter. -+ * -+ * Distribution and use rights are outlined in the file "COPYING" -+ * which should have been included with this file. -+ */ -+ -+#ifndef _CUPSFILTERS_RASTER_H_ -+# define _CUPSFILTERS_RASTER_H_ -+ -+# ifdef __cplusplus -+extern "C" { -+# endif /* __cplusplus */ -+ -+/* -+ * Include necessary headers... -+ */ -+ -+# include -+# include -+# include -+# include -+ -+# if defined(WIN32) || defined(__EMX__) -+# include -+# else -+# include -+# include -+# endif /* WIN32 || __EMX__ */ -+ -+# include -+# include -+ -+/* -+ * Prototypes... -+ */ -+ -+extern int cupsRasterParseIPPOptions(cups_page_header2_t *h, -+ int num_options, -+ cups_option_t *options, -+ int pwg_raster, -+ int set_defaults); -+ -+# ifdef __cplusplus -+} -+# endif /* __cplusplus */ -+ -+#endif /* !_CUPSFILTERS_RASTER_H_ */ -+ -+/* -+ * End -+ */ -+ -diff -up cups-filters-1.0.35/filter/colord.c.gs-filters cups-filters-1.0.35/filter/colord.c ---- cups-filters-1.0.35/filter/colord.c.gs-filters 2013-08-13 10:36:31.984178091 +0100 -+++ cups-filters-1.0.35/filter/colord.c 2013-08-13 10:36:31.984178091 +0100 -@@ -0,0 +1,462 @@ -+/* -+Copyright (c) 2011, Tim Waugh -+Copyright (c) 2011-2013, Richard Hughes -+ -+Permission is hereby granted, free of charge, to any person obtaining -+a copy of this software and associated documentation files (the -+"Software"), to deal in the Software without restriction, including -+without limitation the rights to use, copy, modify, merge, publish, -+distribute, sublicense, and/or sell copies of the Software, and to -+permit persons to whom the Software is furnished to do so, subject to -+the following conditions: -+ -+The above copyright notice and this permission notice shall be included -+in all copies or substantial portions of the Software. -+ -+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -+ -+MIT Open Source License - http://www.opensource.org/ -+ -+*/ -+ -+ -+/* Common routines for accessing the colord CMS framework */ -+ -+#include -+#include -+#include -+ -+#ifdef HAVE_DBUS -+ #include -+#endif -+ -+#include "colord.h" -+ -+#define QUAL_COLORSPACE 0 -+#define QUAL_MEDIA 1 -+#define QUAL_RESOLUTION 2 -+#define QUAL_SIZE 3 -+ -+char ** -+colord_get_qualifier_for_ppd (ppd_file_t *ppd) -+{ -+ char q_keyword[PPD_MAX_NAME]; -+ char **tuple = NULL; -+ const char *q1_choice; -+ const char *q2_choice; -+ const char *q3_choice; -+ ppd_attr_t *attr; -+ ppd_attr_t *q1_attr; -+ ppd_attr_t *q2_attr; -+ ppd_attr_t *q3_attr; -+ -+ /* get colorspace */ -+ if ((attr = ppdFindAttr (ppd, "cupsICCQualifier1", NULL)) != NULL && -+ attr->value && attr->value[0]) -+ { -+ snprintf (q_keyword, sizeof (q_keyword), "Default%s", attr->value); -+ q1_attr = ppdFindAttr (ppd, q_keyword, NULL); -+ } -+ else if ((q1_attr = ppdFindAttr (ppd, "DefaultColorModel", NULL)) == NULL) -+ q1_attr = ppdFindAttr (ppd, "DefaultColorSpace", NULL); -+ -+ if (q1_attr && q1_attr->value && q1_attr->value[0]) -+ q1_choice = q1_attr->value; -+ else -+ q1_choice = ""; -+ -+ /* get media */ -+ if ((attr = ppdFindAttr(ppd, "cupsICCQualifier2", NULL)) != NULL && -+ attr->value && attr->value[0]) -+ { -+ snprintf(q_keyword, sizeof(q_keyword), "Default%s", attr->value); -+ q2_attr = ppdFindAttr(ppd, q_keyword, NULL); -+ } -+ else -+ q2_attr = ppdFindAttr(ppd, "DefaultMediaType", NULL); -+ -+ if (q2_attr && q2_attr->value && q2_attr->value[0]) -+ q2_choice = q2_attr->value; -+ else -+ q2_choice = ""; -+ -+ /* get resolution */ -+ if ((attr = ppdFindAttr(ppd, "cupsICCQualifier3", NULL)) != NULL && -+ attr->value && attr->value[0]) -+ { -+ snprintf(q_keyword, sizeof(q_keyword), "Default%s", attr->value); -+ q3_attr = ppdFindAttr(ppd, q_keyword, NULL); -+ } -+ else -+ q3_attr = ppdFindAttr(ppd, "DefaultResolution", NULL); -+ -+ if (q3_attr && q3_attr->value && q3_attr->value[0]) -+ q3_choice = q3_attr->value; -+ else -+ q3_choice = ""; -+ -+ /* return a NULL terminated array so we don't have to break it up later */ -+ tuple = calloc(QUAL_SIZE + 1, sizeof(char*)); -+ tuple[QUAL_COLORSPACE] = strdup(q1_choice); -+ tuple[QUAL_MEDIA] = strdup(q2_choice); -+ tuple[QUAL_RESOLUTION] = strdup(q3_choice); -+ return tuple; -+} -+ -+#ifdef HAVE_DBUS -+ -+static char * -+get_filename_for_profile_path (DBusConnection *con, -+ const char *object_path) -+{ -+ char *filename = NULL; -+ const char *interface = "org.freedesktop.ColorManager.Profile"; -+ const char *property = "Filename"; -+ const char *tmp; -+ DBusError error; -+ DBusMessageIter args; -+ DBusMessage *message = NULL; -+ DBusMessage *reply = NULL; -+ DBusMessageIter sub; -+ -+ message = dbus_message_new_method_call("org.freedesktop.ColorManager", -+ object_path, -+ "org.freedesktop.DBus.Properties", -+ "Get"); -+ -+ dbus_message_iter_init_append(message, &args); -+ dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &interface); -+ dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &property); -+ -+ /* send syncronous */ -+ dbus_error_init(&error); -+ fprintf(stderr, "DEBUG: Calling %s.Get(%s)\n", interface, property); -+ reply = dbus_connection_send_with_reply_and_block(con, -+ message, -+ -1, -+ &error); -+ if (reply == NULL) { -+ fprintf(stderr, "DEBUG: Failed to send: %s:%s\n", -+ error.name, error.message); -+ dbus_error_free(&error); -+ goto out; -+ } -+ -+ /* get reply data */ -+ dbus_message_iter_init(reply, &args); -+ if (dbus_message_iter_get_arg_type(&args) != DBUS_TYPE_VARIANT) { -+ fprintf(stderr, "DEBUG: Incorrect reply type\n"); -+ goto out; -+ } -+ -+ dbus_message_iter_recurse(&args, &sub); -+ dbus_message_iter_get_basic(&sub, &tmp); -+ filename = strdup(tmp); -+out: -+ if (message != NULL) -+ dbus_message_unref(message); -+ if (reply != NULL) -+ dbus_message_unref(reply); -+ return filename; -+} -+ -+static char * -+get_profile_for_device_path (DBusConnection *con, -+ const char *object_path, -+ const char **split) -+{ -+ char **key = NULL; -+ char *profile = NULL; -+ char str[256]; -+ const char *tmp; -+ DBusError error; -+ DBusMessageIter args; -+ DBusMessageIter entry; -+ DBusMessage *message = NULL; -+ DBusMessage *reply = NULL; -+ int i = 0; -+ const int max_keys = 7; -+ -+ message = dbus_message_new_method_call("org.freedesktop.ColorManager", -+ object_path, -+ "org.freedesktop.ColorManager.Device", -+ "GetProfileForQualifiers"); -+ dbus_message_iter_init_append(message, &args); -+ -+ /* create the fallbacks */ -+ key = calloc(max_keys + 1, sizeof(char*)); -+ -+ /* exact match */ -+ i = 0; -+ snprintf(str, sizeof(str), "%s.%s.%s", -+ split[QUAL_COLORSPACE], -+ split[QUAL_MEDIA], -+ split[QUAL_RESOLUTION]); -+ key[i++] = strdup(str); -+ snprintf(str, sizeof(str), "%s.%s.*", -+ split[QUAL_COLORSPACE], -+ split[QUAL_MEDIA]); -+ key[i++] = strdup(str); -+ snprintf(str, sizeof(str), "%s.*.%s", -+ split[QUAL_COLORSPACE], -+ split[QUAL_RESOLUTION]); -+ key[i++] = strdup(str); -+ snprintf(str, sizeof(str), "%s.*.*", -+ split[QUAL_COLORSPACE]); -+ key[i++] = strdup(str); -+ key[i++] = strdup("*"); -+ dbus_message_iter_open_container(&args, -+ DBUS_TYPE_ARRAY, -+ "s", -+ &entry); -+ for (i=0; key[i] != NULL; i++) { -+ dbus_message_iter_append_basic(&entry, -+ DBUS_TYPE_STRING, -+ &key[i]); -+ } -+ dbus_message_iter_close_container(&args, &entry); -+ -+ /* send syncronous */ -+ dbus_error_init(&error); -+ fprintf(stderr, "DEBUG: Calling GetProfileForQualifiers(%s...)\n", key[0]); -+ reply = dbus_connection_send_with_reply_and_block(con, -+ message, -+ -1, -+ &error); -+ if (reply == NULL) { -+ fprintf(stderr, "DEBUG: Failed to send: %s:%s\n", -+ error.name, error.message); -+ dbus_error_free(&error); -+ goto out; -+ } -+ -+ /* get reply data */ -+ dbus_message_iter_init(reply, &args); -+ if (dbus_message_iter_get_arg_type(&args) != DBUS_TYPE_OBJECT_PATH) { -+ fprintf(stderr, "DEBUG: Incorrect reply type\n"); -+ goto out; -+ } -+ dbus_message_iter_get_basic(&args, &tmp); -+ fprintf(stderr, "DEBUG: Found profile %s\n", tmp); -+ -+ /* get filename */ -+ profile = get_filename_for_profile_path(con, tmp); -+ -+out: -+ if (message != NULL) -+ dbus_message_unref(message); -+ if (reply != NULL) -+ dbus_message_unref(reply); -+ if (key != NULL) { -+ for (i=0; i < max_keys; i++) -+ free(key[i]); -+ free(key); -+ } -+ return profile; -+} -+ -+static char * -+get_device_path_for_device_id (DBusConnection *con, -+ const char *device_id) -+{ -+ char *device_path = NULL; -+ const char *device_path_tmp; -+ DBusError error; -+ DBusMessageIter args; -+ DBusMessage *message = NULL; -+ DBusMessage *reply = NULL; -+ -+ message = dbus_message_new_method_call("org.freedesktop.ColorManager", -+ "/org/freedesktop/ColorManager", -+ "org.freedesktop.ColorManager", -+ "FindDeviceById"); -+ dbus_message_iter_init_append(message, &args); -+ dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &device_id); -+ -+ /* send syncronous */ -+ dbus_error_init(&error); -+ fprintf(stderr, "DEBUG: Calling FindDeviceById(%s)\n", device_id); -+ reply = dbus_connection_send_with_reply_and_block(con, -+ message, -+ -1, -+ &error); -+ if (reply == NULL) { -+ fprintf(stderr, "DEBUG: Failed to send: %s:%s\n", -+ error.name, error.message); -+ dbus_error_free(&error); -+ goto out; -+ } -+ -+ /* get reply data */ -+ dbus_message_iter_init(reply, &args); -+ if (dbus_message_iter_get_arg_type(&args) != DBUS_TYPE_OBJECT_PATH) { -+ fprintf(stderr, "DEBUG: Incorrect reply type\n"); -+ goto out; -+ } -+ dbus_message_iter_get_basic(&args, &device_path_tmp); -+ fprintf(stderr, "DEBUG: Found device %s\n", device_path_tmp); -+ device_path = strdup(device_path_tmp); -+out: -+ if (message != NULL) -+ dbus_message_unref(message); -+ if (reply != NULL) -+ dbus_message_unref(reply); -+ return device_path; -+} -+ -+char * -+colord_get_profile_for_device_id (const char *device_id, -+ const char **qualifier_tuple) -+{ -+ DBusConnection *con = NULL; -+ char *device_path = NULL; -+ char *filename = NULL; -+ -+ if (device_id == NULL) { -+ fprintf(stderr, "DEBUG: No colord device ID available\n"); -+ goto out; -+ } -+ -+ /* connect to system bus */ -+ con = dbus_bus_get(DBUS_BUS_SYSTEM, NULL); -+ if (con == NULL) { -+ fprintf(stderr, "ERROR: Failed to connect to system bus\n"); -+ goto out; -+ } -+ -+ /* find the device */ -+ device_path = get_device_path_for_device_id (con, device_id); -+ if (device_path == NULL) { -+ fprintf(stderr, "DEBUG: Failed to get find device %s\n", device_id); -+ goto out; -+ } -+ -+ /* get the best profile for the device */ -+ filename = get_profile_for_device_path(con, device_path, qualifier_tuple); -+ if (filename == NULL) { -+ fprintf(stderr, "DEBUG: Failed to get profile filename for %s\n", device_id); -+ goto out; -+ } -+ fprintf(stderr, "DEBUG: Use profile filename: '%s'\n", filename); -+out: -+ free(device_path); -+ if (con != NULL) -+ dbus_connection_unref(con); -+ return filename; -+} -+ -+int -+get_profile_inhibitors (DBusConnection *con, const char *object_path) -+{ -+ char *tmp; -+ const char *interface = "org.freedesktop.ColorManager.Device"; -+ const char *property = "ProfilingInhibitors"; -+ DBusError error; -+ DBusMessageIter args; -+ DBusMessageIter sub; -+ DBusMessageIter sub2; -+ DBusMessage *message = NULL; -+ DBusMessage *reply = NULL; -+ int inhibitors = 0; -+ -+ message = dbus_message_new_method_call("org.freedesktop.ColorManager", -+ object_path, -+ "org.freedesktop.DBus.Properties", -+ "Get"); -+ -+ dbus_message_iter_init_append(message, &args); -+ dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &interface); -+ dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &property); -+ -+ /* send syncronous */ -+ dbus_error_init(&error); -+ fprintf(stderr, "DEBUG: Calling %s.Get(%s)\n", interface, property); -+ reply = dbus_connection_send_with_reply_and_block(con, -+ message, -+ -1, -+ &error); -+ if (reply == NULL) { -+ fprintf(stderr, "DEBUG: Failed to send: %s:%s\n", -+ error.name, error.message); -+ dbus_error_free(&error); -+ goto out; -+ } -+ -+ /* get reply data */ -+ dbus_message_iter_init(reply, &args); -+ if (dbus_message_iter_get_arg_type(&args) != DBUS_TYPE_VARIANT) { -+ fprintf(stderr, "DEBUG: Incorrect reply type\n"); -+ goto out; -+ } -+ -+ /* count the size of the array */ -+ dbus_message_iter_recurse(&args, &sub2); -+ dbus_message_iter_recurse(&sub2, &sub); -+ while (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_INVALID) { -+ dbus_message_iter_get_basic(&sub, &tmp); -+ fprintf(stderr, "DEBUG: Inhibitor %s exists\n", tmp); -+ dbus_message_iter_next(&sub); -+ inhibitors++; -+ } -+out: -+ if (message != NULL) -+ dbus_message_unref(message); -+ if (reply != NULL) -+ dbus_message_unref(reply); -+ return inhibitors; -+} -+ -+int -+colord_get_inhibit_for_device_id (const char *device_id) -+{ -+ DBusConnection *con; -+ char *device_path = NULL; -+ int has_inhibitors = FALSE; -+ -+ /* connect to system bus */ -+ con = dbus_bus_get(DBUS_BUS_SYSTEM, NULL); -+ if (con == NULL) { -+ fprintf(stderr, "ERROR: Failed to connect to system bus\n"); -+ goto out; -+ } -+ -+ /* find the device */ -+ device_path = get_device_path_for_device_id (con, device_id); -+ if (device_path == NULL) { -+ fprintf(stderr, "DEBUG: Failed to get find device %s\n", device_id); -+ goto out; -+ } -+ -+ /* get the best profile for the device */ -+ has_inhibitors = get_profile_inhibitors(con, device_path); -+out: -+ free(device_path); -+ if (con != NULL) -+ dbus_connection_unref(con); -+ return has_inhibitors; -+} -+ -+#else -+ -+char * -+colord_get_profile_for_device_id (const char *device_id, -+ const char **qualifier_tuple) -+{ -+ fprintf(stderr, "WARN: not compiled with DBus support\n"); -+ return NULL; -+} -+ -+int -+colord_get_inhibit_for_device_id (const char *device_id) -+{ -+ fprintf(stderr, "WARN: not compiled with DBus support\n"); -+ return 0; -+} -+ -+#endif -diff -up cups-filters-1.0.35/filter/colord.h.gs-filters cups-filters-1.0.35/filter/colord.h ---- cups-filters-1.0.35/filter/colord.h.gs-filters 2013-08-13 10:36:31.984178091 +0100 -+++ cups-filters-1.0.35/filter/colord.h 2013-08-13 10:36:31.984178091 +0100 -@@ -0,0 +1,35 @@ -+/* -+Copyright (c) 2011-2013, Richard Hughes -+ -+Permission is hereby granted, free of charge, to any person obtaining -+a copy of this software and associated documentation files (the -+"Software"), to deal in the Software without restriction, including -+without limitation the rights to use, copy, modify, merge, publish, -+distribute, sublicense, and/or sell copies of the Software, and to -+permit persons to whom the Software is furnished to do so, subject to -+the following conditions: -+ -+The above copyright notice and this permission notice shall be included -+in all copies or substantial portions of the Software. -+ -+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -+ -+MIT Open Source License - http://www.opensource.org/ -+ -+*/ -+ -+ -+/* Common routines for accessing the colord CMS framework */ -+ -+#include -+ -+char **colord_get_qualifier_for_ppd (ppd_file_t *ppd); -+char *colord_get_profile_for_device_id (const char *device_id, -+ const char **qualifier_tuple); -+int colord_get_inhibit_for_device_id (const char *device_id); -diff -up cups-filters-1.0.35/filter/gstopxl.in.gs-filters cups-filters-1.0.35/filter/gstopxl.in ---- cups-filters-1.0.35/filter/gstopxl.in.gs-filters 2013-08-13 10:36:31.985178096 +0100 -+++ cups-filters-1.0.35/filter/gstopxl.in 2013-08-13 10:36:31.985178096 +0100 -@@ -0,0 +1,184 @@ -+#!/bin/sh -+# -+# -+# CUPS PCL XL/PCL 6 filter script for Ghostscript. -+# -+# Copyright 2001-2005 by Easy Software Products. -+# -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 2, or (at your option) -+# any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program; if not, write to the Free Software -+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -+# -+ -+# Set the library/font path... -+GS_LIB="${CUPS_FONTPATH:=/usr/share/cups/fonts}" -+export GS_LIB -+ -+# Determine the PCL XL/PCL 6 driver to use... -+if test "x$PPD" != x; then -+ colordevice=`grep '^*ColorDevice:' "$PPD" | awk -F: '{print $2}'` -+ case "$colordevice" in -+ *True* | *true*) -+ device="pxlcolor" -+ ;; -+ *) -+ device="pxlmono" -+ ;; -+ esac -+else -+ device="pxlmono" -+fi -+ -+# Apply PPD settings. -+ -+ps_code= -+ppd_opts= -+ -+resolution= -+eval "$(printf "%s" "$5" | sed @SED_EXTENDED_REGEX_OPT@ 's/.*(^|[[:space:]])Resolution=([0-9.]+(x[0-9.]+)?).*/resolution="${resolution:-\2}"/p')" -+if test -e "$PPD"; then -+ eval "$(sed @SED_EXTENDED_REGEX_OPT@ 's/^\*DefaultResolution:[[:space:]]+([0-9.]+(x[0-9.]+)?).*/resolution="${resolution:-\1}"/p' "$PPD")" -+fi -+echo "DEBUG: Resolution: $resolution" >&2 -+if test -n "$resolution"; then -+ ppd_opts="${ppd_opts:+$ppd_opts }-r$resolution" -+fi -+ -+pagesize= -+eval "$(printf "%s" "$5" | sed @SED_EXTENDED_REGEX_OPT@ 's/.*(^|[[:space:]])(media|PageSize)=([^[:space:]]+).*/pagesize="${pagesize:-\3}"/p')" -+if test -e "$PPD"; then -+ eval "$(sed @SED_EXTENDED_REGEX_OPT@ 's/^\*DefaultPageSize:[[:space:]]+([^[:space:]]+).*/pagesize="${pagesize:-\1}"/p' "$PPD")" -+fi -+echo "DEBUG: Page size: $pagesize" >&2 -+width= -+height= -+if test -n "$pagesize" && test -e "$PPD"; then -+ eval "$(sed @SED_EXTENDED_REGEX_OPT@ 's|^\*PaperDimension[[:space:]]+'"$pagesize"'/[^:]+:[[:space:]]+"([^[:space:]]+)[[:space:]]+([^[:space:]]+)".*|width="\1"; height="\2"|p' "$PPD")" -+fi -+echo "DEBUG: Width: $width, height: $height" >&2 -+if test -n "$width"; then -+ ppd_opts="${ppd_opts:+$ppd_opts }-dDEVICEWIDTHPOINTS=$width" -+fi -+if test -n "$height"; then -+ ppd_opts="${ppd_opts:+$ppd_opts }-dDEVICEHEIGHTPOINTS=$height" -+fi -+ -+bl_x= -+bl_y= -+tr_x= -+tr_y= -+if test -n "$pagesize" && test -e "$PPD"; then -+ eval "$(sed @SED_EXTENDED_REGEX_OPT@ 's|^\*ImageableArea[[:space:]]+'"$pagesize"'/[^:]+:[[:space:]]+"([^[:space:]]+)[[:space:]]+([^[:space:]]+)[[:space:]]+([^[:space:]]+)[[:space:]]+([^[:space:]]+)".*|bl_x="\1"; bl_y="\2"; tr_x="\3"; tr_y="\4"|p' "$PPD")" -+fi -+echo "DEBUG: Absolute margins: $bl_x, $bl_y, $tr_x, $tr_y" >&2 -+margin_l= -+margin_b= -+margin_r= -+margin_t= -+if test -n "$width" && test -n "$height" && \ -+ test -n "$bl_x" && test -n "$bl_y" && \ -+ test -n "$tr_x" && test -n "$tr_y"; then -+ margin_l="$bl_x" -+ margin_b="$bl_y" -+ margin_r="$(printf "scale=8; (%s)-(%s)\n" "$width" "$tr_x" | bc)" -+ margin_t="$(printf "scale=8; (%s)-(%s)\n" "$height" "$tr_y" | bc)" -+fi -+echo "DEBUG: Relative margins: $margin_l, $margin_b, $margin_r, $margin_t" >&2 -+if test -n "$margin_l" && test -n "$margin_b" && \ -+ test -n "$margin_r" && test -n "$margin_t"; then -+ ps_code="${ps_code:+$ps_code }<>setpagedevice" -+fi -+ -+inputslot= -+eval "$(printf "%s" "$5" | sed @SED_EXTENDED_REGEX_OPT@ 's/.*(^|[[:space:]])(InputSlot)=([^[:space:]]+).*/inputslot="${inputslot:-\3}"/p')" -+if test -e "$PPD"; then -+ eval "$(sed @SED_EXTENDED_REGEX_OPT@ 's/^\*DefaultInputSlot:[[:space:]]+([^[:space:]]+).*/inputslot="${inputslot:-\1}"/p' "$PPD")" -+fi -+echo "DEBUG: InputSlot: $inputslot" >&2 -+inputslot_val= -+if test -n "$inputslot" && test -e "$PPD"; then -+ eval "$(sed @SED_EXTENDED_REGEX_OPT@ 's|^\*InputSlot[[:space:]]+'"$inputslot"'/[^:]+:[[:space:]]+"[[:space:]]*<[[:space:]]*<[[:space:]]*/MediaPosition[[:space:]]*([0-9]+)[[:space:]]*>[[:space:]]*>[[:space:]]*setpagedevice[[:space:]]*".*|inputslot_val="\1"|p' "$PPD")" -+fi -+echo "DEBUG: Value for MediaPosition: $inputslot_val" >&2 -+if test -n "$inputslot_val"; then -+ ppd_opts="${ppd_opts:+$ppd_opts }-dMediaPosition=$inputslot_val" -+fi -+ -+colormodel= -+eval "$(printf "%s" "$5" | sed @SED_EXTENDED_REGEX_OPT@ 's/.*(^|[[:space:]])(ColorModel)=([^[:space:]]+).*/colormodel="${colormodel:-\3}"/p')" -+if test -e "$PPD"; then -+ eval "$(sed @SED_EXTENDED_REGEX_OPT@ 's/^\*DefaultColorModel:[[:space:]]+([^[:space:]]+).*/colormodel="${colormodel:-\1}"/p' "$PPD")" -+fi -+echo "DEBUG: ColorModel: $colormodel" >&2 -+if test "$colormodel" = "Gray"; then -+ device=pxlmono -+fi -+colormodel_val= -+if test -n "$colormodel" && test -e "$PPD"; then -+ eval "$(sed @SED_EXTENDED_REGEX_OPT@ 's|^\*ColorModel[[:space:]]+'"$colormodel"'/[^:]+:[[:space:]]+"[[:space:]]*<[[:space:]]*<[[:space:]]*/BitsPerPixel[[:space:]]*([0-9]*)[[:space:]]*>[[:space:]]*>[[:space:]]*setpagedevice[[:space:]]*".*|colormodel_val="\1"|p' "$PPD")" -+fi -+echo "DEBUG: Value for BitsPerPixel: $colormodel_val" >&2 -+if test -n "$colormodel_val"; then -+ ppd_opts="${ppd_opts:+$ppd_opts }-dBitsPerPixel=$colormodel_val" -+fi -+ -+duplex= -+eval "$(printf "%s" "$5" | sed @SED_EXTENDED_REGEX_OPT@ 's/.*(^|[[:space:]])(Duplex)=([^[:space:]]+).*/duplex="${duplex:-\3}"/p')" -+if test -e "$PPD"; then -+ eval "$(sed @SED_EXTENDED_REGEX_OPT@ 's/^\*DefaultDuplex:[[:space:]]+([^[:space:]]+).*/duplex="${duplex:-\1}"/p' "$PPD")" -+fi -+echo "DEBUG: Duplex: $duplex" >&2 -+duplex_val= -+tumble_val= -+if test -n "$duplex" && test -e "$PPD"; then -+ eval "$(sed @SED_EXTENDED_REGEX_OPT@ 's|^\*Duplex[[:space:]]+'"$duplex"'/[^:]+:[[:space:]]+"[[:space:]]*<[[:space:]]*<[[:space:]]*/Duplex[[:space:]]*([^[:space:]]*)[[:space:]]*(/Tumble[[:space:]]*([^[:space:]]*)[[:space:]]*)?>[[:space:]]*>[[:space:]]*setpagedevice[[:space:]]*".*|duplex_val="\1"; tumble_val="\3"|p' "$PPD")" -+fi -+echo "DEBUG: Value for Duplex: $duplex_val; Value for Tumble: $tumble_val" >&2 -+if test -n "$duplex_val"; then -+ ppd_opts="${ppd_opts:+$ppd_opts }-dDuplex=$duplex_val" -+fi -+if test -n "$tumble_val"; then -+ ppd_opts="${ppd_opts:+$ppd_opts }-dTumble=$tumble_val" -+fi -+ -+ -+echo "DEBUG: PPD options: $ppd_opts" >&2 -+echo "DEBUG: PostScript code from options: $ps_code" >&2 -+ -+# Options we use with Ghostscript... -+gsopts="-dQUIET -dPARANOIDSAFER -dNOPAUSE -dBATCH -dNOINTERPOLATE" -+gsopts="$gsopts -sDEVICE=$device -sstdout=%stderr" -+ -+# See if we have a filename on the command-line... -+if [ -n "$6" ]; then -+ exec <"$6" -+fi -+ -+# We read the data into a temporary file as Ghostscript needs this to be -+# able to also work with PDF input -+tempfiles= -+trap 'rm -f $tempfiles' 0 1 2 13 15 -+ -+ifile=$(mktemp -t gstopxl.XXXXXX) -+tempfiles="$tempfiles $ifile" -+ -+cat >"$ifile" -+ -+echo INFO: Starting GPL Ghostscript `@CUPS_GHOSTSCRIPT@ --version`... 1>&2 -+echo DEBUG: Running @CUPS_GHOSTSCRIPT@ $gsopts $ppd_opts -sOUTPUTFILE="%stdout" -c "$ps_code" -f "$ifile" 1>&2 -+ -+# Now run Ghostscript... -+@CUPS_GHOSTSCRIPT@ $gsopts $ppd_opts -sOUTPUTFILE="%stdout" -c "$ps_code" -f "$ifile" -+ -+# -+# -diff -up cups-filters-1.0.35/filter/gstoraster.c.gs-filters cups-filters-1.0.35/filter/gstoraster.c ---- cups-filters-1.0.35/filter/gstoraster.c.gs-filters 2013-08-13 10:36:31.986178101 +0100 -+++ cups-filters-1.0.35/filter/gstoraster.c 2013-08-13 10:36:31.986178101 +0100 -@@ -0,0 +1,745 @@ -+/* -+ -+Copyright (c) 2008-2013, Till Kamppeter -+Copyright (c) 2011, Tim Waugh -+Copyright (c) 2011-2013, Richard Hughes -+ -+Permission is hereby granted, free of charge, to any person obtaining -+a copy of this software and associated documentation files (the -+"Software"), to deal in the Software without restriction, including -+without limitation the rights to use, copy, modify, merge, publish, -+distribute, sublicense, and/or sell copies of the Software, and to -+permit persons to whom the Software is furnished to do so, subject to -+the following conditions: -+ -+The above copyright notice and this permission notice shall be included -+in all copies or substantial portions of the Software. -+ -+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -+ -+MIT Open Source License - http://www.opensource.org/ -+ -+*/ -+ -+ -+/* PS/PDF to CUPS Raster filter based on Ghostscript */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "colord.h" -+ -+#define PDF_MAX_CHECK_COMMENT_LINES 20 -+ -+#ifndef GS -+#define GS "gs" -+#endif -+#ifndef BINDIR -+#define BINDIR "/usr/bin" -+#endif -+#ifndef CUPS_FONTPATH -+#define CUPS_FONTPATH "/usr/share/cups/fonts" -+#endif -+#ifndef CUPSDATA -+#define CUPSDATA "/usr/share/cups" -+#endif -+ -+typedef enum { -+ GS_DOC_TYPE_PDF, -+ GS_DOC_TYPE_PS, -+ GS_DOC_TYPE_UNKNOWN -+} GsDocType; -+ -+#ifdef CUPS_RASTER_SYNCv1 -+typedef cups_page_header2_t gs_page_header; -+#else -+typedef cups_page_header_t gs_page_header; -+#endif /* CUPS_RASTER_SYNCv1 */ -+ -+static GsDocType -+parse_doc_type(FILE *fp) -+{ -+ char buf[5]; -+ GsDocType doc_type; -+ char *rc; -+ -+ /* get the first few bytes of the file */ -+ doc_type = GS_DOC_TYPE_UNKNOWN; -+ rewind(fp); -+ rc = fgets(buf,sizeof(buf),fp); -+ if (rc == NULL) -+ goto out; -+ -+ /* is PDF */ -+ if (strncmp(buf,"%PDF",4) == 0) { -+ doc_type = GS_DOC_TYPE_PDF; -+ goto out; -+ } -+ -+ /* is PS */ -+ if (strncmp(buf,"%!",2) == 0) { -+ doc_type = GS_DOC_TYPE_PS; -+ goto out; -+ } -+out: -+ return doc_type; -+} -+ -+static void -+parse_pdf_header_options(FILE *fp, gs_page_header *h) -+{ -+ char buf[4096]; -+ int i; -+ -+ rewind(fp); -+ /* skip until PDF start header */ -+ while (fgets(buf,sizeof(buf),fp) != 0) { -+ if (strncmp(buf,"%PDF",4) == 0) { -+ break; -+ } -+ } -+ for (i = 0;i < PDF_MAX_CHECK_COMMENT_LINES;i++) { -+ if (fgets(buf,sizeof(buf),fp) == 0) break; -+ if (strncmp(buf,"%%PDFTOPDFNumCopies",19) == 0) { -+ char *p; -+ -+ p = strchr(buf+19,':'); -+ h->NumCopies = atoi(p+1); -+ } else if (strncmp(buf,"%%PDFTOPDFCollate",17) == 0) { -+ char *p; -+ -+ p = strchr(buf+17,':'); -+ while (*p == ' ' || *p == '\t') p++; -+ if (strncasecmp(p,"true",4) == 0) { -+ h->Collate = CUPS_TRUE; -+ } else { -+ h->Collate = CUPS_FALSE; -+ } -+ } -+ } -+} -+ -+static void -+add_pdf_header_options(gs_page_header *h, cups_array_t *gs_args) -+{ -+ int i; -+ char tmpstr[1024]; -+ -+ /* Simple boolean, enumerated choice, numerical, and string parameters */ -+ if (h->MediaClass[0] |= '\0') { -+ snprintf(tmpstr, sizeof(tmpstr), "-sMediaClass=%s", h->MediaClass); -+ cupsArrayAdd(gs_args, strdup(tmpstr)); -+ } -+ if (h->MediaColor[0] |= '\0') { -+ snprintf(tmpstr, sizeof(tmpstr), "-sMediaColor=%s", h->MediaColor); -+ cupsArrayAdd(gs_args, strdup(tmpstr)); -+ } -+ if (h->MediaType[0] |= '\0') { -+ snprintf(tmpstr, sizeof(tmpstr), "-sMediaType=%s", h->MediaType); -+ cupsArrayAdd(gs_args, strdup(tmpstr)); -+ } -+ if (h->OutputType[0] |= '\0') { -+ snprintf(tmpstr, sizeof(tmpstr), "-sOutputType=%s", h->OutputType); -+ cupsArrayAdd(gs_args, strdup(tmpstr)); -+ } -+ if (h->AdvanceDistance) { -+ snprintf(tmpstr, sizeof(tmpstr), "-dAdvanceDistance=%d", -+ (unsigned)(h->AdvanceDistance)); -+ cupsArrayAdd(gs_args, strdup(tmpstr)); -+ } -+ if (h->AdvanceMedia) { -+ snprintf(tmpstr, sizeof(tmpstr), "-dAdvanceMedia=%d", -+ (unsigned)(h->AdvanceMedia)); -+ cupsArrayAdd(gs_args, strdup(tmpstr)); -+ } -+ if (h->Collate) { -+ cupsArrayAdd(gs_args, strdup("-dCollate")); -+ } -+ if (h->CutMedia) { -+ snprintf(tmpstr, sizeof(tmpstr), "-dCutMedia=%d", -+ (unsigned)(h->CutMedia)); -+ cupsArrayAdd(gs_args, strdup(tmpstr)); -+ } -+ if (h->Duplex) { -+ cupsArrayAdd(gs_args, strdup("-dDuplex")); -+ } -+ if ((h->HWResolution[0] != 100) || (h->HWResolution[1] != 100)) -+ snprintf(tmpstr, sizeof(tmpstr), "-r%dx%d", -+ (unsigned)(h->HWResolution[0]), (unsigned)(h->HWResolution[1])); -+ else -+ snprintf(tmpstr, sizeof(tmpstr), "-r100x100"); -+ cupsArrayAdd(gs_args, strdup(tmpstr)); -+ if (h->InsertSheet) { -+ cupsArrayAdd(gs_args, strdup("-dInsertSheet")); -+ } -+ if (h->Jog) { -+ snprintf(tmpstr, sizeof(tmpstr), "-dJog=%d", -+ (unsigned)(h->Jog)); -+ cupsArrayAdd(gs_args, strdup(tmpstr)); -+ } -+ if (h->LeadingEdge) { -+ snprintf(tmpstr, sizeof(tmpstr), "-dLeadingEdge=%d", -+ (unsigned)(h->LeadingEdge)); -+ cupsArrayAdd(gs_args, strdup(tmpstr)); -+ } -+ if (h->ManualFeed) { -+ cupsArrayAdd(gs_args, strdup("-dManualFeed")); -+ } -+ if (h->MediaPosition) { -+ snprintf(tmpstr, sizeof(tmpstr), "-dMediaPosition=%d", -+ (unsigned)(h->MediaPosition)); -+ cupsArrayAdd(gs_args, strdup(tmpstr)); -+ } -+ if (h->MediaWeight) { -+ snprintf(tmpstr, sizeof(tmpstr), "-dMediaWeight=%d", -+ (unsigned)(h->MediaWeight)); -+ cupsArrayAdd(gs_args, strdup(tmpstr)); -+ } -+ if (h->MirrorPrint) { -+ cupsArrayAdd(gs_args, strdup("-dMirrorPrint")); -+ } -+ if (h->NegativePrint) { -+ cupsArrayAdd(gs_args, strdup("-dNegativePrint")); -+ } -+ if (h->NumCopies != 1) { -+ snprintf(tmpstr, sizeof(tmpstr), "-dNumCopies=%d", -+ (unsigned)(h->NumCopies)); -+ cupsArrayAdd(gs_args, strdup(tmpstr)); -+ } -+ if (h->Orientation) { -+ snprintf(tmpstr, sizeof(tmpstr), "-dOrientation=%d", -+ (unsigned)(h->Orientation)); -+ cupsArrayAdd(gs_args, strdup(tmpstr)); -+ } -+ if (h->OutputFaceUp) { -+ cupsArrayAdd(gs_args, strdup("-dOutputFaceUp")); -+ } -+ if (h->PageSize[0] != 612) -+ snprintf(tmpstr, sizeof(tmpstr), "-dDEVICEWIDTHPOINTS=%d", -+ (unsigned)(h->PageSize[0])); -+ else -+ snprintf(tmpstr, sizeof(tmpstr), "-dDEVICEWIDTHPOINTS=612"); -+ cupsArrayAdd(gs_args, strdup(tmpstr)); -+ if (h->PageSize[1] != 792) -+ snprintf(tmpstr, sizeof(tmpstr), "-dDEVICEHEIGHTPOINTS=%d", -+ (unsigned)(h->PageSize[1])); -+ else -+ snprintf(tmpstr, sizeof(tmpstr), "-dDEVICEHEIGHTPOINTS=792"); -+ cupsArrayAdd(gs_args, strdup(tmpstr)); -+ if (h->Separations) { -+ cupsArrayAdd(gs_args, strdup("-dSeparations")); -+ } -+ if (h->TraySwitch) { -+ cupsArrayAdd(gs_args, strdup("-dTraySwitch")); -+ } -+ if (h->Tumble) { -+ cupsArrayAdd(gs_args, strdup("-dTumble")); -+ } -+ if (h->cupsMediaType) { -+ snprintf(tmpstr, sizeof(tmpstr), "-dcupsMediaType=%d", -+ (unsigned)(h->cupsMediaType)); -+ cupsArrayAdd(gs_args, strdup(tmpstr)); -+ } -+ if (h->cupsBitsPerColor != 1) -+ snprintf(tmpstr, sizeof(tmpstr), "-dcupsBitsPerColor=%d", -+ (unsigned)(h->cupsBitsPerColor)); -+ else -+ snprintf(tmpstr, sizeof(tmpstr), "-dcupsBitsPerColor=1"); -+ cupsArrayAdd(gs_args, strdup(tmpstr)); -+ if (h->cupsColorOrder != CUPS_ORDER_CHUNKED) -+ snprintf(tmpstr, sizeof(tmpstr), "-dcupsColorOrder=%d", -+ (unsigned)(h->cupsColorOrder)); -+ else -+ snprintf(tmpstr, sizeof(tmpstr), "-dcupsColorOrder=%d", -+ CUPS_ORDER_CHUNKED); -+ cupsArrayAdd(gs_args, strdup(tmpstr)); -+ if (h->cupsColorSpace != CUPS_CSPACE_K) -+ snprintf(tmpstr, sizeof(tmpstr), "-dcupsColorSpace=%d", -+ (unsigned)(h->cupsColorSpace)); -+ else -+ snprintf(tmpstr, sizeof(tmpstr), "-dcupsColorSpace=%d", -+ CUPS_CSPACE_K); -+ cupsArrayAdd(gs_args, strdup(tmpstr)); -+ if (h->cupsCompression) { -+ snprintf(tmpstr, sizeof(tmpstr), "-dcupsCompression=%d", -+ (unsigned)(h->cupsCompression)); -+ cupsArrayAdd(gs_args, strdup(tmpstr)); -+ } -+ if (h->cupsRowCount) { -+ snprintf(tmpstr, sizeof(tmpstr), "-dcupsRowCount=%d", -+ (unsigned)(h->cupsRowCount)); -+ cupsArrayAdd(gs_args, strdup(tmpstr)); -+ } -+ if (h->cupsRowFeed) { -+ snprintf(tmpstr, sizeof(tmpstr), "-dcupsRowFeed=%d", -+ (unsigned)(h->cupsRowFeed)); -+ cupsArrayAdd(gs_args, strdup(tmpstr)); -+ } -+ if (h->cupsRowStep) { -+ snprintf(tmpstr, sizeof(tmpstr), "-dcupsRowStep=%d", -+ (unsigned)(h->cupsRowStep)); -+ cupsArrayAdd(gs_args, strdup(tmpstr)); -+ } -+#ifdef CUPS_RASTER_SYNCv1 -+ if (h->cupsBorderlessScalingFactor != 1.0f) { -+ snprintf(tmpstr, sizeof(tmpstr), "-dcupsBorderlessScalingFactor=%.4f", -+ h->cupsBorderlessScalingFactor); -+ cupsArrayAdd(gs_args, strdup(tmpstr)); -+ } -+ for (i=0; i <= 15; i ++) -+ if (h->cupsInteger[i]) { -+ snprintf(tmpstr, sizeof(tmpstr), "-dcupsInteger%d=%d", -+ i, (unsigned)(h->cupsInteger[i])); -+ cupsArrayAdd(gs_args, strdup(tmpstr)); -+ } -+ for (i=0; i <= 15; i ++) -+ if (h->cupsReal[i]) { -+ snprintf(tmpstr, sizeof(tmpstr), "-dcupsReal%d=%.4f", -+ i, h->cupsReal[i]); -+ cupsArrayAdd(gs_args, strdup(tmpstr)); -+ } -+ for (i=0; i <= 15; i ++) -+ if (h->cupsString[i][0] != '\0') { -+ snprintf(tmpstr, sizeof(tmpstr), "-scupsString%d=%s", -+ i, h->cupsString[i]); -+ cupsArrayAdd(gs_args, strdup(tmpstr)); -+ } -+ if (h->cupsMarkerType[0] != '\0') { -+ snprintf(tmpstr, sizeof(tmpstr), "-scupsMarkerType=%s", -+ h->cupsMarkerType); -+ cupsArrayAdd(gs_args, strdup(tmpstr)); -+ } -+ if (h->cupsRenderingIntent[0] != '\0') { -+ snprintf(tmpstr, sizeof(tmpstr), "-scupsRenderingIntent=%s", -+ h->cupsRenderingIntent); -+ cupsArrayAdd(gs_args, strdup(tmpstr)); -+ } -+ if (h->cupsPageSizeName[0] != '\0') { -+ snprintf(tmpstr, sizeof(tmpstr), "-scupsPageSizeName=%s", -+ h->cupsPageSizeName); -+ cupsArrayAdd(gs_args, strdup(tmpstr)); -+ } -+#endif /* CUPS_RASTER_SYNCv1 */ -+} -+ -+static int -+gs_spawn (const char *filename, -+ cups_array_t *gs_args, -+ char **envp, -+ FILE *fp) -+{ -+ char *argument; -+ char buf[BUFSIZ]; -+ char **gsargv; -+ const char* apos; -+ int fds[2]; -+ int i; -+ int n; -+ int numargs; -+ int pid; -+ int status = 1; -+ -+ /* Put Ghostscript command line argument into an array for the "exec()" -+ call */ -+ numargs = cupsArrayCount(gs_args); -+ gsargv = calloc(numargs + 1, sizeof(char *)); -+ for (argument = (char *)cupsArrayFirst(gs_args), i = 0; argument; -+ argument = (char *)cupsArrayNext(gs_args), i++) { -+ gsargv[i] = argument; -+ } -+ gsargv[i] = NULL; -+ -+ /* Debug output: Full Ghostscript command line and environment variables */ -+ fprintf(stderr, "DEBUG: Ghostscript command line:"); -+ for (i = 0; gsargv[i]; i ++) { -+ if ((strchr(gsargv[i],' ')) || (strchr(gsargv[i],'\t'))) -+ apos = "'"; -+ else -+ apos = ""; -+ fprintf(stderr, " %s%s%s", apos, gsargv[i], apos); -+ } -+ fprintf(stderr, "\n"); -+ -+ for (i = 0; envp[i]; i ++) -+ fprintf(stderr, "DEBUG: envp[%d]=\"%s\"\n", i, envp[i]); -+ -+ /* Create a pipe for feeding the job into Ghostscript */ -+ if (pipe(fds)) -+ { -+ fds[0] = -1; -+ fds[1] = -1; -+ fprintf(stderr, "ERROR: Unable to establish pipe for Ghostscript call\n"); -+ goto out; -+ } -+ -+ /* Set the "close on exec" flag on each end of the pipe... */ -+ if (fcntl(fds[0], F_SETFD, fcntl(fds[0], F_GETFD) | FD_CLOEXEC)) -+ { -+ close(fds[0]); -+ close(fds[1]); -+ fds[0] = -1; -+ fds[1] = -1; -+ fprintf(stderr, "ERROR: Unable to set \"close on exec\" flag on read end of the pipe for Ghostscript call\n"); -+ goto out; -+ } -+ if (fcntl(fds[1], F_SETFD, fcntl(fds[1], F_GETFD) | FD_CLOEXEC)) -+ { -+ close(fds[0]); -+ close(fds[1]); -+ fprintf(stderr, "ERROR: Unable to set \"close on exec\" flag on write end of the pipe for Ghostscript call\n"); -+ goto out; -+ } -+ -+ if ((pid = fork()) == 0) -+ { -+ /* Couple pipe with STDIN of Ghostscript process */ -+ if (fds[0] != 0) { -+ close(0); -+ if (fds[0] > 0) { -+ if (dup(fds[0]) < 0) { -+ fprintf(stderr, "ERROR: Unable to couple pipe with STDIN of Ghostscript process\n"); -+ goto out; -+ } -+ } else { -+ fprintf(stderr, "ERROR: Unable to couple pipe with STDIN of Ghostscript process\n"); -+ goto out; -+ } -+ } -+ -+ /* Execute Ghostscript command line ... */ -+ execve(filename, gsargv, envp); -+ perror(filename); -+ goto out; -+ } -+ -+ /* Feed job data into Ghostscript */ -+ while ((n = fread(buf, 1, BUFSIZ, fp)) > 0) { -+ int count = write(fds[1], buf, n); -+ if (count != n) { -+ if (count == -1) -+ fprintf(stderr, "ERROR: write failed: %s\n", strerror(errno)); -+ fprintf(stderr, "ERROR: Can't feed job data into Ghostscript\n"); -+ goto out; -+ } -+ } -+ close (fds[1]); -+ -+ if (waitpid (pid, &status, 0) == -1) { -+ perror ("gs"); -+ goto out; -+ } -+out: -+ free(gsargv); -+ return status; -+} -+ -+static char * -+get_ppd_icc_fallback (ppd_file_t *ppd, char **qualifier) -+{ -+ char full_path[1024]; -+ char *icc_profile = NULL; -+ char qualifer_tmp[1024]; -+ const char *profile_key; -+ ppd_attr_t *attr; -+ -+ /* get profile attr, falling back to CUPS */ -+ profile_key = "APTiogaProfile"; -+ attr = ppdFindAttr(ppd, profile_key, NULL); -+ if (attr == NULL) { -+ profile_key = "cupsICCProfile"; -+ attr = ppdFindAttr(ppd, profile_key, NULL); -+ } -+ -+ /* create a string for a quick comparion */ -+ snprintf(qualifer_tmp, sizeof(qualifer_tmp), -+ "%s.%s.%s", -+ qualifier[0], -+ qualifier[1], -+ qualifier[2]); -+ -+ /* neither */ -+ if (attr == NULL) { -+ fprintf(stderr, "INFO: no profiles specified in PPD\n"); -+ goto out; -+ } -+ -+ /* try to find a profile that matches the qualifier exactly */ -+ for (;attr != NULL; attr = ppdFindNextAttr(ppd, profile_key, NULL)) { -+ fprintf(stderr, "INFO: found profile %s in PPD with qualifier '%s'\n", -+ attr->value, attr->spec); -+ -+ /* invalid entry */ -+ if (attr->spec == NULL || attr->value == NULL) -+ continue; -+ -+ /* expand to a full path if not already specified */ -+ if (attr->value[0] != '/') -+ snprintf(full_path, sizeof(full_path), -+ "%s/profiles/%s", CUPSDATA, attr->value); -+ else -+ strncpy(full_path, attr->value, sizeof(full_path)); -+ -+ /* check the file exists */ -+ if (access(full_path, 0)) { -+ fprintf(stderr, "INFO: found profile %s in PPD that does not exist\n", -+ full_path); -+ continue; -+ } -+ -+ /* matches the qualifier */ -+ if (strcmp(qualifer_tmp, attr->spec) == 0) { -+ icc_profile = strdup(full_path); -+ goto out; -+ } -+ } -+ -+ /* no match */ -+ if (attr == NULL) { -+ fprintf(stderr, "INFO: no profiles in PPD for qualifier '%s'\n", -+ qualifer_tmp); -+ goto out; -+ } -+ -+out: -+ return icc_profile; -+} -+ -+static void -+child_reaper (int signum) -+{ -+ wait(NULL); -+} -+ -+int -+main (int argc, char **argv, char *envp[]) -+{ -+ char buf[BUFSIZ]; -+ char *icc_profile = NULL; -+ char **qualifier = NULL; -+ char *tmp; -+ char tmpstr[1024]; -+ const char *t = NULL; -+ cups_array_t *gs_args = NULL; -+ cups_option_t *options = NULL; -+ FILE *fp = NULL; -+ GsDocType doc_type; -+ gs_page_header h; -+ int fd; -+ int device_inhibited; -+ int i; -+ int n; -+ int num_options; -+ int status = 1; -+ ppd_file_t *ppd = NULL; -+ struct sigaction sa; -+ -+ if (argc < 6 || argc > 7) { -+ fprintf(stderr, "ERROR: %s job-id user title copies options [file]\n", -+ argv[0]); -+ goto out; -+ } -+ -+ memset(&sa, 0, sizeof(sa)); -+ /* Ignore SIGPIPE and have write return an error instead */ -+ sa.sa_handler = SIG_IGN; -+ sigaction(SIGPIPE, &sa, NULL); -+ -+ sa.sa_handler = child_reaper; -+ sigaction(SIGCHLD, &sa, NULL); -+ -+ num_options = cupsParseOptions(argv[5], 0, &options); -+ -+ t = getenv("PPD"); -+ if (t && t[0] != '\0') -+ if ((ppd = ppdOpenFile(t)) == NULL) { -+ fprintf(stderr, "ERROR: Failed to open PPD: %s\n", t); -+ } -+ -+ if (ppd) { -+ ppdMarkDefaults (ppd); -+ cupsMarkOptions (ppd, num_options, options); -+ } -+ -+ if (argc == 6) { -+ /* stdin */ -+ -+ fd = cupsTempFd(buf,BUFSIZ); -+ if (fd < 0) { -+ fprintf(stderr, "ERROR: Can't create temporary file\n"); -+ goto out; -+ } -+ /* remove name */ -+ unlink(buf); -+ -+ /* copy stdin to the tmp file */ -+ while ((n = read(0,buf,BUFSIZ)) > 0) { -+ if (write(fd,buf,n) != n) { -+ fprintf(stderr, "ERROR: Can't copy stdin to temporary file\n"); -+ close(fd); -+ goto out; -+ } -+ } -+ if (lseek(fd,0,SEEK_SET) < 0) { -+ fprintf(stderr, "ERROR: Can't rewind temporary file\n"); -+ close(fd); -+ goto out; -+ } -+ -+ if ((fp = fdopen(fd,"rb")) == 0) { -+ fprintf(stderr, "ERROR: Can't fdopen temporary file\n"); -+ close(fd); -+ goto out; -+ } -+ } else { -+ /* argc == 7 filename is specified */ -+ -+ if ((fp = fopen(argv[6],"rb")) == 0) { -+ fprintf(stderr, "ERROR: Can't open input file %s\n",argv[6]); -+ goto out; -+ } -+ } -+ -+ /* find out file type */ -+ doc_type = parse_doc_type(fp); -+ if (doc_type == GS_DOC_TYPE_UNKNOWN) { -+ fprintf(stderr, "ERROR: Can't detect file type\n"); -+ goto out; -+ } -+ -+ /* support colord and the "color-management=off" option */ -+ snprintf (tmpstr, sizeof(tmpstr), "cups-%s", getenv("PRINTER")); -+ device_inhibited = colord_get_inhibit_for_device_id (tmpstr); -+ t = cupsGetOption("color-management", num_options, options); -+ if (t != NULL && strcmp(t, "off") == 0) -+ device_inhibited = 1; -+ if (device_inhibited) -+ fprintf(stderr, "DEBUG: Device is inhibited, no CM performed\n"); -+ if (ppd) -+ qualifier = colord_get_qualifier_for_ppd (ppd); -+ if (qualifier != NULL) { -+ -+ fprintf(stderr, "DEBUG: PPD uses qualifier '%s.%s.%s'\n", -+ qualifier[0], qualifier[1], qualifier[2]); -+ -+ snprintf (tmpstr, sizeof(tmpstr), "cups-%s", getenv("PRINTER")); -+ icc_profile = colord_get_profile_for_device_id (tmpstr, -+ (const char**) qualifier); -+ -+ /* fall back to the PPD */ -+ if (icc_profile == NULL) -+ icc_profile = get_ppd_icc_fallback (ppd, qualifier); -+ -+ if(icc_profile != NULL) -+ fprintf(stderr, "DEBUG: Using ICC Profile '%s'\n", icc_profile); -+ } -+ -+ /* Ghostscript parameters */ -+ gs_args = cupsArrayNew(NULL, NULL); -+ if (!gs_args) { -+ fprintf(stderr, "ERROR: Unable to allocate memory for Ghostscript arguments array\n"); -+ exit(1); -+ } -+ -+ /* Part of Ghostscript command line which is not dependent on the job and/or -+ the driver */ -+ snprintf(tmpstr, sizeof(tmpstr), "%s/%s", BINDIR, GS); -+ cupsArrayAdd(gs_args, strdup(tmpstr)); -+ cupsArrayAdd(gs_args, strdup("-dQUIET")); -+ /*cupsArrayAdd(gs_args, strdup("-dDEBUG"));*/ -+ cupsArrayAdd(gs_args, strdup("-dPARANOIDSAFER")); -+ cupsArrayAdd(gs_args, strdup("-dNOPAUSE")); -+ cupsArrayAdd(gs_args, strdup("-dBATCH")); -+ cupsArrayAdd(gs_args, strdup("-dNOINTERPOLATE")); -+ if (doc_type == GS_DOC_TYPE_PS) -+ cupsArrayAdd(gs_args, strdup("-dNOMEDIAATTRS")); -+ if (device_inhibited) -+ cupsArrayAdd(gs_args, strdup("-dUseFastColor")); -+ cupsArrayAdd(gs_args, strdup("-sDEVICE=cups")); -+ cupsArrayAdd(gs_args, strdup("-sstdout=%stderr")); -+ cupsArrayAdd(gs_args, strdup("-sOutputFile=%stdout")); -+ -+ if (ppd) -+ cupsRasterInterpretPPD(&h,ppd,num_options,options,0); -+ else -+ cupsRasterParseIPPOptions(&h,num_options,options,1,1); -+ -+ /* setPDF specific options */ -+ if (doc_type == GS_DOC_TYPE_PDF) { -+ parse_pdf_header_options(fp, &h); -+ } -+ -+ /* fixed other values that pdftopdf handles */ -+ h.MirrorPrint = CUPS_FALSE; -+ h.Orientation = CUPS_ORIENT_0; -+ -+ /* get all the data from the header and pass it to ghostscript */ -+ add_pdf_header_options (&h, gs_args); -+ -+ /* CUPS font path */ -+ if ((t = getenv("CUPS_FONTPATH")) == NULL) -+ t = CUPS_FONTPATH; -+ snprintf(tmpstr, sizeof(tmpstr), "-I%s", t); -+ cupsArrayAdd(gs_args, strdup(tmpstr)); -+ -+ /* set the device output ICC profile */ -+ if(icc_profile != NULL && icc_profile[0] != '\0') { -+ snprintf(tmpstr, sizeof(tmpstr), "-sOutputICCProfile=%s", icc_profile); -+ cupsArrayAdd(gs_args, strdup(tmpstr)); -+ } -+ -+ /* Switch to taking PostScript commands on the Ghostscript command line */ -+ cupsArrayAdd(gs_args, strdup("-c")); -+ -+ if ((t = cupsGetOption("profile", num_options, options)) != NULL) { -+ snprintf(tmpstr, sizeof(tmpstr), "<>setpagedevice", t); -+ cupsArrayAdd(gs_args, strdup(tmpstr)); -+ } -+ -+ /* Mark the end of PostScript commands supplied on the Ghostscript command -+ line (with the "-c" option), so that we can supply the input file name */ -+ cupsArrayAdd(gs_args, strdup("-f")); -+ -+ /* Let Ghostscript read from STDIN */ -+ cupsArrayAdd(gs_args, strdup("-_")); -+ -+ /* Execute Ghostscript command line ... */ -+ snprintf(tmpstr, sizeof(tmpstr), "%s/%s", BINDIR, GS); -+ -+ /* call Ghostscript */ -+ rewind(fp); -+ status = gs_spawn (tmpstr, gs_args, envp, fp); -+out: -+ if (fp) -+ fclose(fp); -+ if (qualifier != NULL) { -+ for (i=0; qualifier[i] != NULL; i++) -+ free(qualifier[i]); -+ free(qualifier); -+ } -+ if (gs_args) { -+ while ((tmp = cupsArrayFirst(gs_args)) != NULL) { -+ cupsArrayRemove(gs_args,tmp); -+ free(tmp); -+ } -+ cupsArrayDelete(gs_args); -+ } -+ free(icc_profile); -+ if (ppd) -+ ppdClose(ppd); -+ return status; -+} -diff -up cups-filters-1.0.35/filter/pdftoraster.cxx.gs-filters cups-filters-1.0.35/filter/pdftoraster.cxx ---- cups-filters-1.0.35/filter/pdftoraster.cxx.gs-filters 2013-06-26 16:05:04.000000000 +0100 -+++ cups-filters-1.0.35/filter/pdftoraster.cxx 2013-08-13 10:36:31.999178161 +0100 -@@ -48,6 +48,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN - #include "GlobalParams.h" - #include - #include -+#include - #include - #include - #include -@@ -357,80 +358,82 @@ static void parseOpts(int argc, char **a - } - - ppd = ppdOpenFile(getenv("PPD")); -- if (ppd == NULL) { -- pdfError(-1,const_cast("PPD file is not specified")); -- exit(1); -- } -- ppdMarkDefaults(ppd); -+ if (ppd == NULL) -+ fprintf(stderr, "DEBUG: PPD file is not specified.\n"); -+ if (ppd) -+ ppdMarkDefaults(ppd); - options = NULL; - num_options = cupsParseOptions(argv[5],0,&options); -- cupsMarkOptions(ppd,num_options,options); -- handleRqeuiresPageRegion(); -- cupsRasterInterpretPPD(&header,ppd,num_options,options,0); -- attr = ppdFindAttr(ppd,"pdftorasterRenderingIntent",NULL); -- if (attr != NULL && attr->value != NULL) { -- if (strcasecmp(attr->value,"PERCEPTUAL") != 0) { -- renderingIntent = INTENT_PERCEPTUAL; -- } else if (strcasecmp(attr->value,"RELATIVE_COLORIMETRIC") != 0) { -- renderingIntent = INTENT_RELATIVE_COLORIMETRIC; -- } else if (strcasecmp(attr->value,"SATURATION") != 0) { -- renderingIntent = INTENT_SATURATION; -- } else if (strcasecmp(attr->value,"ABSOLUTE_COLORIMETRIC") != 0) { -- renderingIntent = INTENT_ABSOLUTE_COLORIMETRIC; -- } -- } -- if (header.Duplex) { -- /* analyze options relevant to Duplex */ -- const char *backside = ""; -- /* APDuplexRequiresFlippedMargin */ -- enum { -- FM_NO, FM_FALSE, FM_TRUE -- } flippedMargin = FM_NO; -- -- attr = ppdFindAttr(ppd,"cupsBackSide",NULL); -- if (attr != NULL && attr->value != NULL) { -- ppd->flip_duplex = 0; -- backside = attr->value; -- } else if (ppd->flip_duplex) { -- backside = "Rotated"; /* compatible with Max OS and GS 8.71 */ -- } -- -- attr = ppdFindAttr(ppd,"APDuplexRequiresFlippedMargin",NULL); -+ if (ppd) { -+ cupsMarkOptions(ppd,num_options,options); -+ handleRqeuiresPageRegion(); -+ cupsRasterInterpretPPD(&header,ppd,num_options,options,0); -+ attr = ppdFindAttr(ppd,"pdftorasterRenderingIntent",NULL); - if (attr != NULL && attr->value != NULL) { -- if (strcasecmp(attr->value,"true") == 0) { -- flippedMargin = FM_TRUE; -- } else { -- flippedMargin = FM_FALSE; -+ if (strcasecmp(attr->value,"PERCEPTUAL") != 0) { -+ renderingIntent = INTENT_PERCEPTUAL; -+ } else if (strcasecmp(attr->value,"RELATIVE_COLORIMETRIC") != 0) { -+ renderingIntent = INTENT_RELATIVE_COLORIMETRIC; -+ } else if (strcasecmp(attr->value,"SATURATION") != 0) { -+ renderingIntent = INTENT_SATURATION; -+ } else if (strcasecmp(attr->value,"ABSOLUTE_COLORIMETRIC") != 0) { -+ renderingIntent = INTENT_ABSOLUTE_COLORIMETRIC; - } - } -- if (strcasecmp(backside,"ManualTumble") == 0 && header.Tumble) { -- swap_image_x = swap_image_y = true; -- swap_margin_x = swap_margin_y = true; -- if (flippedMargin == FM_TRUE) { -- swap_margin_y = false; -- } -- } else if (strcasecmp(backside,"Rotated") == 0 && !header.Tumble) { -- swap_image_x = swap_image_y = true; -- swap_margin_x = swap_margin_y = true; -- if (flippedMargin == FM_TRUE) { -- swap_margin_y = false; -+ if (header.Duplex) { -+ /* analyze options relevant to Duplex */ -+ const char *backside = ""; -+ /* APDuplexRequiresFlippedMargin */ -+ enum { -+ FM_NO, FM_FALSE, FM_TRUE -+ } flippedMargin = FM_NO; -+ -+ attr = ppdFindAttr(ppd,"cupsBackSide",NULL); -+ if (attr != NULL && attr->value != NULL) { -+ ppd->flip_duplex = 0; -+ backside = attr->value; -+ } else if (ppd->flip_duplex) { -+ backside = "Rotated"; /* compatible with Max OS and GS 8.71 */ - } -- } else if (strcasecmp(backside,"Flipped") == 0) { -- if (header.Tumble) { -- swap_image_x = true; -- swap_margin_x = swap_margin_y = true; -- } else { -- swap_image_y = true; -+ -+ attr = ppdFindAttr(ppd,"APDuplexRequiresFlippedMargin",NULL); -+ if (attr != NULL && attr->value != NULL) { -+ if (strcasecmp(attr->value,"true") == 0) { -+ flippedMargin = FM_TRUE; -+ } else { -+ flippedMargin = FM_FALSE; -+ } - } -- if (flippedMargin == FM_FALSE) { -- swap_margin_y = !swap_margin_y; -+ if (strcasecmp(backside,"ManualTumble") == 0 && header.Tumble) { -+ swap_image_x = swap_image_y = true; -+ swap_margin_x = swap_margin_y = true; -+ if (flippedMargin == FM_TRUE) { -+ swap_margin_y = false; -+ } -+ } else if (strcasecmp(backside,"Rotated") == 0 && !header.Tumble) { -+ swap_image_x = swap_image_y = true; -+ swap_margin_x = swap_margin_y = true; -+ if (flippedMargin == FM_TRUE) { -+ swap_margin_y = false; -+ } -+ } else if (strcasecmp(backside,"Flipped") == 0) { -+ if (header.Tumble) { -+ swap_image_x = true; -+ swap_margin_x = swap_margin_y = true; -+ } else { -+ swap_image_y = true; -+ } -+ if (flippedMargin == FM_FALSE) { -+ swap_margin_y = !swap_margin_y; -+ } - } - } -- } -- if (getColorProfilePath(ppd,&profilePath)) { -- /* ICCProfile is specified */ -- colorProfile = cmsOpenProfileFromFile(profilePath.getCString(),"r"); -- } -+ if (getColorProfilePath(ppd,&profilePath)) { -+ /* ICCProfile is specified */ -+ colorProfile = cmsOpenProfileFromFile(profilePath.getCString(),"r"); -+ } -+ } else -+ cupsRasterParseIPPOptions(&header,num_options,options,1,1); - } - - static void parsePDFTOPDFComment(FILE *fp) -@@ -1548,48 +1551,23 @@ static void outPage(PDFDoc *doc, Catalog - - memset(paperdimensions, 0, sizeof(paperdimensions)); - memset(margins, 0, sizeof(margins)); -- for (i = ppd->num_sizes, size = ppd->sizes; -- i > 0; -- i --, size ++) { -- /* Skip page sizes which conflict with settings of the other options */ -- /* TODO XXX */ -- /* Find size of document's page under the PPD page sizes */ -- if (fabs(header.PageSize[1] - size->length) < 5.0 && -- fabs(header.PageSize[0] - size->width) < 5.0) -- break; -- } -- if (i > 0) { -- /* -- * Standard size... -- */ -- fprintf(stderr, "DEBUG: size = %s\n", size->name); -- landscape = 0; -- paperdimensions[0] = size->width; -- paperdimensions[1] = size->length; -- margins[0] = size->left; -- margins[1] = size->bottom; -- margins[2] = size->width - size->right; -- margins[3] = size->length - size->top; -- strncpy(header.cupsPageSizeName, size->name, 64); -- } else { -- /* -- * No matching portrait size; look for a matching size in -- * landscape orientation... -- */ -- -+ if (ppd) { - for (i = ppd->num_sizes, size = ppd->sizes; - i > 0; -- i --, size ++) -- if (fabs(header.PageSize[0] - size->length) < 5.0 && -- fabs(header.PageSize[1] - size->width) < 5.0) -+ i --, size ++) { -+ /* Skip page sizes which conflict with settings of the other options */ -+ /* TODO XXX */ -+ /* Find size of document's page under the PPD page sizes */ -+ if (fabs(header.PageSize[1] - size->length) < 5.0 && -+ fabs(header.PageSize[0] - size->width) < 5.0) - break; -- -+ } - if (i > 0) { - /* -- * Standard size in landscape orientation... -+ * Standard size... - */ -- fprintf(stderr, "DEBUG: landscape size = %s\n", size->name); -- landscape = 1; -+ fprintf(stderr, "DEBUG: size = %s\n", size->name); -+ landscape = 0; - paperdimensions[0] = size->width; - paperdimensions[1] = size->length; - margins[0] = size->left; -@@ -1599,17 +1577,53 @@ static void outPage(PDFDoc *doc, Catalog - strncpy(header.cupsPageSizeName, size->name, 64); - } else { - /* -- * Custom size... -+ * No matching portrait size; look for a matching size in -+ * landscape orientation... - */ -- fprintf(stderr, "DEBUG: size = Custom\n"); -- landscape = 0; -- paperdimensions[1] = size->length; -- for (i = 0; i < 2; i ++) -- paperdimensions[i] = header.PageSize[i]; -- for (i = 0; i < 4; i ++) -- margins[i] = ppd->custom_margins[i]; -- header.cupsPageSizeName[0] = '\0'; -+ -+ for (i = ppd->num_sizes, size = ppd->sizes; -+ i > 0; -+ i --, size ++) -+ if (fabs(header.PageSize[0] - size->length) < 5.0 && -+ fabs(header.PageSize[1] - size->width) < 5.0) -+ break; -+ -+ if (i > 0) { -+ /* -+ * Standard size in landscape orientation... -+ */ -+ fprintf(stderr, "DEBUG: landscape size = %s\n", size->name); -+ landscape = 1; -+ paperdimensions[0] = size->width; -+ paperdimensions[1] = size->length; -+ margins[0] = size->left; -+ margins[1] = size->bottom; -+ margins[2] = size->width - size->right; -+ margins[3] = size->length - size->top; -+ strncpy(header.cupsPageSizeName, size->name, 64); -+ } else { -+ /* -+ * Custom size... -+ */ -+ fprintf(stderr, "DEBUG: size = Custom\n"); -+ landscape = 0; -+ paperdimensions[1] = size->length; -+ for (i = 0; i < 2; i ++) -+ paperdimensions[i] = header.PageSize[i]; -+ for (i = 0; i < 4; i ++) -+ margins[i] = ppd->custom_margins[i]; -+ header.cupsPageSizeName[0] = '\0'; -+ } - } -+ } else { -+ for (i = 0; i < 2; i ++) -+ paperdimensions[i] = header.PageSize[i]; -+ for (i = 0; i < 4; i ++) -+ margins[i] = 0.0; -+ /*margins[0] = 0.0; -+ margins[1] = 0.0; -+ margins[2] = header.PageSize[0]; -+ margins[3] = header.PageSize[1];*/ - } - - if (header.Duplex && (pageNo & 1) == 0) { -diff -up cups-filters-1.0.35/Makefile.am.gs-filters cups-filters-1.0.35/Makefile.am ---- cups-filters-1.0.35/Makefile.am.gs-filters 2013-07-29 16:10:21.793413604 +0100 -+++ cups-filters-1.0.35/Makefile.am 2013-08-13 10:36:31.967178014 +0100 -@@ -79,7 +79,8 @@ EXTRA_DIST += $(pkgcharset_DATA) - pkgfiltersincludedir = $(includedir)/cupsfilters - pkgfiltersinclude_DATA = \ - cupsfilters/driver.h \ -- cupsfilters/image.h -+ cupsfilters/image.h \ -+ cupsfilters/raster.h - - lib_LTLIBRARIES = libcupsfilters.la - -@@ -127,6 +128,7 @@ libcupsfilters_la_SOURCES = \ - cupsfilters/image-zoom.c \ - cupsfilters/lut.c \ - cupsfilters/pack.c \ -+ cupsfilters/raster.c \ - cupsfilters/rgb.c \ - cupsfilters/srgb.c \ - $(pkgfiltersinclude_DATA) -@@ -389,6 +391,7 @@ pdftopdf_LDADD = \ - # Simple filter binaries - # ====================== - pkgfilter_SCRIPTS = \ -+ filter/gstopxl \ - filter/imagetops \ - filter/pstopdf \ - filter/textonly \ -@@ -397,6 +400,7 @@ pkgfilter_PROGRAMS += \ - bannertopdf \ - commandtoescpx \ - commandtopclx \ -+ gstoraster \ - pdftoijs \ - pdftops \ - pdftoraster \ -@@ -459,6 +463,18 @@ commandtopclx_CFLAGS = \ - -I$(srcdir)/cupsfilters/ - commandtopclx_LDADD = $(CUPS_LIBS) - -+gstoraster_SOURCES = \ -+ filter/gstoraster.c \ -+ filter/colord.c \ -+ filter/colord.h \ -+ cupsfilters/raster.h -+gstoraster_CFLAGS = \ -+ $(CUPS_CFLAGS) \ -+ -I$(srcdir)/cupsfilters/ -+gstoraster_LDADD = \ -+ $(CUPS_LIBS) \ -+ -lcupsfilters -+ - imagetopdf_SOURCES = \ - cupsfilters/image.h \ - filter/common.c \ -@@ -649,6 +665,8 @@ ppd_DATA = \ - ppd/Generic-PDF_Printer-PDF.ppd \ - ppd/HP-Color_LaserJet_CM3530_MFP-PDF.ppd \ - ppd/HP-PhotoSmart_Pro_B8300-hpijs-pdftoijs.ppd \ -+ ppd/pxlcolor.ppd \ -+ ppd/pxlmono.ppd \ - ppd/textonly.ppd - - EXTRA_DIST += $(ppd_DATA) -diff -up cups-filters-1.0.35/mime/cupsfilters.convs.gs-filters cups-filters-1.0.35/mime/cupsfilters.convs ---- cups-filters-1.0.35/mime/cupsfilters.convs.gs-filters 2013-07-29 16:10:21.799413632 +0100 -+++ cups-filters-1.0.35/mime/cupsfilters.convs 2013-08-13 10:36:32.004178184 +0100 -@@ -84,6 +84,8 @@ application/vnd.cups-pdf application/vnd - # Raster filters... - # - -+application/vnd.cups-pdf application/vnd.cups-raster 66 gstoraster -+application/vnd.cups-postscript application/vnd.cups-raster 100 gstoraster - application/vnd.cups-pdf application/vnd.cups-raster 100 pdftoraster - image/gif application/vnd.cups-raster 100 imagetoraster - image/png application/vnd.cups-raster 100 imagetoraster -diff -up cups-filters-1.0.35/NEWS.gs-filters cups-filters-1.0.35/NEWS -diff -up cups-filters-1.0.35/ppd/pxlcolor.ppd.gs-filters cups-filters-1.0.35/ppd/pxlcolor.ppd ---- cups-filters-1.0.35/ppd/pxlcolor.ppd.gs-filters 2013-08-13 10:36:32.005178188 +0100 -+++ cups-filters-1.0.35/ppd/pxlcolor.ppd 2013-08-13 10:36:32.005178188 +0100 -@@ -0,0 +1,215 @@ -+*PPD-Adobe: "4.3" -+*% -+*% -+*% Sample color PCL XL/PCL 6 driver PPD file for the Common UNIX -+*% Printing System (CUPS). -+*% -+*% Copyright 1997-2005 by Easy Software Products. -+*% -+*% These coded instructions, statements, and computer programs are the -+*% property of Easy Software Products and are protected by Federal -+*% copyright law. Distribution and use rights are outlined in the file -+*% "LICENSE.txt" which should have been included with this file. If this -+*% file is missing or damaged please contact Easy Software Products -+*% at: -+*% -+*% Attn: CUPS Licensing Information -+*% Easy Software Products -+*% 44141 Airport View Drive, Suite 204 -+*% Hollywood, Maryland 20636 USA -+*% -+*% Voice: (301) 373-9600 -+*% EMail: cups-info@cups.org -+*% WWW: http://www.cups.org -+*% -+*FormatVersion: "4.3" -+*FileVersion: "1.1" -+*LanguageVersion: English -+*LanguageEncoding: ISOLatin1 -+*PCFileName: "PXLCOLOR.PPD" -+*Manufacturer: "HP" -+*Product: "(GPL Ghostscript)" -+*cupsVersion: 1.1 -+*cupsManualCopies: False -+*cupsFilter: "application/vnd.cups-postscript 100 gstopxl" -+*cupsFilter: "application/vnd.cups-pdf 0 gstopxl" -+*ModelName: "HP Color LaserJet Series PCL 6" -+*ShortNickName: "HP Color LaserJet Series PCL 6" -+*NickName: "HP Color LaserJet Series PCL 6 CUPS" -+*PSVersion: "(3010.000) 86000" -+*LanguageLevel: "3" -+*ColorDevice: True -+*DefaultColorSpace: RGB -+*FileSystem: False -+*Throughput: "8" -+*LandscapeOrientation: Plus90 -+*TTRasterizer: Type42 -+ -+*UIConstraints: *PageSize Executive *InputSlot Envelope -+*UIConstraints: *PageSize Letter *InputSlot Envelope -+*UIConstraints: *PageSize Legal *InputSlot Envelope -+*UIConstraints: *PageSize Tabloid *InputSlot Envelope -+*UIConstraints: *PageSize A3 *InputSlot Envelope -+*UIConstraints: *PageSize A4 *InputSlot Envelope -+*UIConstraints: *PageSize A5 *InputSlot Envelope -+*UIConstraints: *PageSize B5 *InputSlot Envelope -+*UIConstraints: *Duplex *OptionDuplex False -+*UIConstraints: *InputSlot Envelope *PageSize Executive -+*UIConstraints: *InputSlot Envelope *PageSize Letter -+*UIConstraints: *InputSlot Envelope *PageSize Legal -+*UIConstraints: *InputSlot Envelope *PageSize Tabloid -+*UIConstraints: *InputSlot Envelope *PageSize A3 -+*UIConstraints: *InputSlot Envelope *PageSize A4 -+*UIConstraints: *InputSlot Envelope *PageSize A5 -+*UIConstraints: *InputSlot Envelope *PageSize B5 -+*UIConstraints: *OptionDuplex False *Duplex -+ -+*OpenUI *PageSize/Media Size: PickOne -+*OrderDependency: 10 AnySetup *PageSize -+*DefaultPageSize: Letter -+*PageSize Letter/US Letter: "<>setpagedevice" -+*PageSize Legal/US Legal: "<>setpagedevice" -+*PageSize Executive/US Executive: "<>setpagedevice" -+*PageSize Tabloid/US Tabloid: "<>setpagedevice" -+*PageSize A3/A3: "<>setpagedevice" -+*PageSize A4/A4: "<>setpagedevice" -+*PageSize A5/A5: "<>setpagedevice" -+*PageSize B5/B5 (JIS): "<>setpagedevice" -+*PageSize EnvISOB5/Envelope B5: "<>setpagedevice" -+*PageSize Env10/Envelope #10: "<>setpagedevice" -+*PageSize EnvC5/Envelope C5: "<>setpagedevice" -+*PageSize EnvDL/Envelope DL: "<>setpagedevice" -+*PageSize EnvMonarch/Envelope Monarch: "<>setpagedevice" -+*CloseUI: *PageSize -+ -+*OpenUI *PageRegion: PickOne -+*OrderDependency: 10 AnySetup *PageRegion -+*DefaultPageRegion: Letter -+*PageRegion Letter/US Letter: "<>setpagedevice" -+*PageRegion Legal/US Legal: "<>setpagedevice" -+*PageRegion Executive/US Executive: "<>setpagedevice" -+*PageRegion Tabloid/US Tabloid: "<>setpagedevice" -+*PageRegion A3/A3: "<>setpagedevice" -+*PageRegion A4/A4: "<>setpagedevice" -+*PageRegion A5/A5: "<>setpagedevice" -+*PageRegion B5/B5 (JIS): "<>setpagedevice" -+*PageRegion EnvISOB5/Envelope B5: "<>setpagedevice" -+*PageRegion Env10/Envelope #10: "<>setpagedevice" -+*PageRegion EnvC5/Envelope C5: "<>setpagedevice" -+*PageRegion EnvDL/Envelope DL: "<>setpagedevice" -+*PageRegion EnvMonarch/Envelope Monarch: "<>setpagedevice" -+*CloseUI: *PageRegion -+ -+*DefaultImageableArea: Letter -+*ImageableArea Letter/US Letter: "12 12 600 780" -+*ImageableArea Legal/US Legal: "12 12 600 996" -+*ImageableArea Executive/US Executive: "12 12 510 708" -+*ImageableArea Tabloid/US Tabloid: "12 12 780 1212" -+*ImageableArea A3/A3: "12 12 830 1179" -+*ImageableArea A4/A4: "12 12 583 830" -+*ImageableArea A5/A5: "12 12 409 583" -+*ImageableArea B5/JIS B5: "12 12 504 717" -+*ImageableArea EnvISOB5/B5 (ISO): "12 12 469 697" -+*ImageableArea Env10/Com-10: "12 12 285 672" -+*ImageableArea EnvC5/EnvC5: "12 12 447 637" -+*ImageableArea EnvDL/EnvDL: "12 12 300 612" -+*ImageableArea EnvMonarch/Envelope Monarch: "12 12 267 528" -+ -+*DefaultPaperDimension: Letter -+*PaperDimension Letter/US Letter: "612 792" -+*PaperDimension Legal/US Legal: "612 1008" -+*PaperDimension Executive/US Executive: "522 756" -+*PaperDimension Tabloid/US Tabloid: "792 1224" -+*PaperDimension A3/A3: "842 1191" -+*PaperDimension A4/A4: "595 842" -+*PaperDimension A5/A5: "421 595" -+*PaperDimension B5/B5 (JIS): "516 729" -+*PaperDimension EnvISOB5/Envelope B5: "499 709" -+*PaperDimension Env10/Envelope #10: "297 684" -+*PaperDimension EnvC5/Envelope C5: "459 649" -+*PaperDimension EnvDL/Envelope DL: "312 624" -+*PaperDimension EnvMonarch/Envelope Monarch: "279 540" -+ -+*OpenUI *InputSlot/Media Source: PickOne -+*OrderDependency: 10 AnySetup *InputSlot -+*DefaultInputSlot: Default -+*InputSlot Default/Default: "<>setpagedevice" -+*InputSlot Auto/Automatically Select: "<>setpagedevice" -+*InputSlot MultiPurpose/Tray 1: "<>setpagedevice" -+*InputSlot Upper/Tray 2: "<>setpagedevice" -+*InputSlot Lower/Tray 3: "<>setpagedevice" -+*InputSlot LargeCapacity/Tray 4: "<>setpagedevice" -+*InputSlot Manual/Manual Feed: "<>setpagedevice" -+*InputSlot Envelope/Envelope Feed: "<>setpagedevice" -+*CloseUI: *InputSlot -+ -+*OpenUI *ColorModel/Output Mode: PickOne -+*OrderDependency: 10 AnySetup *ColorModel -+*DefaultColorModel: RGB -+*ColorModel RGB/Color: "<>setpagedevice" -+*ColorModel Gray/Grayscale: "<>setpagedevice" -+*CloseUI: *ColorModel -+ -+*OpenUI *Resolution/Output Resolution: PickOne -+*OrderDependency: 20 AnySetup *Resolution -+*DefaultResolution: 600dpi -+*Resolution 150dpi/150 DPI: "<>setpagedevice" -+*Resolution 300dpi/300 DPI: "<>setpagedevice" -+*Resolution 600dpi/600 DPI: "<>setpagedevice" -+*Resolution 1200dpi/1200 DPI: "<>setpagedevice" -+*CloseUI: *Resolution -+ -+*OpenUI *Duplex/Double-Sided Printing: PickOne -+*OrderDependency: 20 AnySetup *Duplex -+*DefaultDuplex: None -+*Duplex None/Off: "<>setpagedevice" -+*Duplex DuplexNoTumble/Long Edge (Standard): "<>setpagedevice" -+*Duplex DuplexTumble/Short Edge (Flip): "<>setpagedevice" -+*CloseUI: *Duplex -+ -+*OpenGroup: InstallableOptions -+*OpenUI *OptionDuplex/Duplexer: Boolean -+*DefaultOptionDuplex: False -+*OptionDuplex True/Installed: "" -+*OptionDuplex False/Not Installed: "" -+*CloseUI: *OptionDuplex -+*CloseGroup: InstallableOptions -+ -+*DefaultFont: Courier -+*Font AvantGarde-Book: Standard "(001.006S)" Standard ROM -+*Font AvantGarde-BookOblique: Standard "(001.006S)" Standard ROM -+*Font AvantGarde-Demi: Standard "(001.007S)" Standard ROM -+*Font AvantGarde-DemiOblique: Standard "(001.007S)" Standard ROM -+*Font Bookman-Demi: Standard "(001.004S)" Standard ROM -+*Font Bookman-DemiItalic: Standard "(001.004S)" Standard ROM -+*Font Bookman-Light: Standard "(001.004S)" Standard ROM -+*Font Bookman-LightItalic: Standard "(001.004S)" Standard ROM -+*Font Courier: Standard "(002.004S)" Standard ROM -+*Font Courier-Bold: Standard "(002.004S)" Standard ROM -+*Font Courier-BoldOblique: Standard "(002.004S)" Standard ROM -+*Font Courier-Oblique: Standard "(002.004S)" Standard ROM -+*Font Helvetica: Standard "(001.006S)" Standard ROM -+*Font Helvetica-Bold: Standard "(001.007S)" Standard ROM -+*Font Helvetica-BoldOblique: Standard "(001.007S)" Standard ROM -+*Font Helvetica-Narrow: Standard "(001.006S)" Standard ROM -+*Font Helvetica-Narrow-Bold: Standard "(001.007S)" Standard ROM -+*Font Helvetica-Narrow-BoldOblique: Standard "(001.007S)" Standard ROM -+*Font Helvetica-Narrow-Oblique: Standard "(001.006S)" Standard ROM -+*Font Helvetica-Oblique: Standard "(001.006S)" Standard ROM -+*Font NewCenturySchlbk-Bold: Standard "(001.009S)" Standard ROM -+*Font NewCenturySchlbk-BoldItalic: Standard "(001.007S)" Standard ROM -+*Font NewCenturySchlbk-Italic: Standard "(001.006S)" Standard ROM -+*Font NewCenturySchlbk-Roman: Standard "(001.007S)" Standard ROM -+*Font Palatino-Bold: Standard "(001.005S)" Standard ROM -+*Font Palatino-BoldItalic: Standard "(001.005S)" Standard ROM -+*Font Palatino-Italic: Standard "(001.005S)" Standard ROM -+*Font Palatino-Roman: Standard "(001.005S)" Standard ROM -+*Font Symbol: Special "(001.007S)" Special ROM -+*Font Times-Bold: Standard "(001.007S)" Standard ROM -+*Font Times-BoldItalic: Standard "(001.009S)" Standard ROM -+*Font Times-Italic: Standard "(001.007S)" Standard ROM -+*Font Times-Roman: Standard "(001.007S)" Standard ROM -+*Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM -+*Font ZapfDingbats: Special "(001.004S)" Standard ROM -+*% -+*% -diff -up cups-filters-1.0.35/ppd/pxlmono.ppd.gs-filters cups-filters-1.0.35/ppd/pxlmono.ppd ---- cups-filters-1.0.35/ppd/pxlmono.ppd.gs-filters 2013-08-13 10:36:32.006178193 +0100 -+++ cups-filters-1.0.35/ppd/pxlmono.ppd 2013-08-13 10:36:32.006178193 +0100 -@@ -0,0 +1,208 @@ -+*PPD-Adobe: "4.3" -+*% -+*% -+*% Sample monochrome PCL XL/PCL 6 driver PPD file for the Common UNIX -+*% Printing System (CUPS). -+*% -+*% Copyright 1997-2005 by Easy Software Products. -+*% -+*% These coded instructions, statements, and computer programs are the -+*% property of Easy Software Products and are protected by Federal -+*% copyright law. Distribution and use rights are outlined in the file -+*% "LICENSE.txt" which should have been included with this file. If this -+*% file is missing or damaged please contact Easy Software Products -+*% at: -+*% -+*% Attn: CUPS Licensing Information -+*% Easy Software Products -+*% 44141 Airport View Drive, Suite 204 -+*% Hollywood, Maryland 20636 USA -+*% -+*% Voice: (301) 373-9600 -+*% EMail: cups-info@cups.org -+*% WWW: http://www.cups.org -+*% -+*FormatVersion: "4.3" -+*FileVersion: "1.1" -+*LanguageVersion: English -+*LanguageEncoding: ISOLatin1 -+*PCFileName: "PXLMONO.PPD" -+*Manufacturer: "HP" -+*Product: "(GPL Ghostscript)" -+*cupsVersion: 1.1 -+*cupsManualCopies: False -+*cupsFilter: "application/vnd.cups-postscript 100 gstopxl" -+*cupsFilter: "application/vnd.cups-pdf 0 gstopxl" -+*ModelName: "HP LaserJet Series PCL 6" -+*ShortNickName: "HP LaserJet Series PCL 6" -+*NickName: "HP LaserJet Series PCL 6 CUPS" -+*PSVersion: "(3010.000) 86000" -+*LanguageLevel: "3" -+*ColorDevice: False -+*DefaultColorSpace: Gray -+*FileSystem: False -+*Throughput: "8" -+*LandscapeOrientation: Plus90 -+*TTRasterizer: Type42 -+ -+*UIConstraints: *PageSize Executive *InputSlot Envelope -+*UIConstraints: *PageSize Letter *InputSlot Envelope -+*UIConstraints: *PageSize Legal *InputSlot Envelope -+*UIConstraints: *PageSize Tabloid *InputSlot Envelope -+*UIConstraints: *PageSize A3 *InputSlot Envelope -+*UIConstraints: *PageSize A4 *InputSlot Envelope -+*UIConstraints: *PageSize A5 *InputSlot Envelope -+*UIConstraints: *PageSize B5 *InputSlot Envelope -+*UIConstraints: *Duplex *OptionDuplex False -+*UIConstraints: *InputSlot Envelope *PageSize Executive -+*UIConstraints: *InputSlot Envelope *PageSize Letter -+*UIConstraints: *InputSlot Envelope *PageSize Legal -+*UIConstraints: *InputSlot Envelope *PageSize Tabloid -+*UIConstraints: *InputSlot Envelope *PageSize A3 -+*UIConstraints: *InputSlot Envelope *PageSize A4 -+*UIConstraints: *InputSlot Envelope *PageSize A5 -+*UIConstraints: *InputSlot Envelope *PageSize B5 -+*UIConstraints: *OptionDuplex False *Duplex -+ -+*OpenUI *PageSize/Media Size: PickOne -+*OrderDependency: 10 AnySetup *PageSize -+*DefaultPageSize: Letter -+*PageSize Letter/US Letter: "<>setpagedevice" -+*PageSize Legal/US Legal: "<>setpagedevice" -+*PageSize Executive/US Executive: "<>setpagedevice" -+*PageSize Tabloid/US Tabloid: "<>setpagedevice" -+*PageSize A3/A3: "<>setpagedevice" -+*PageSize A4/A4: "<>setpagedevice" -+*PageSize A5/A5: "<>setpagedevice" -+*PageSize B5/B5 (JIS): "<>setpagedevice" -+*PageSize EnvISOB5/Envelope B5: "<>setpagedevice" -+*PageSize Env10/Envelope #10: "<>setpagedevice" -+*PageSize EnvC5/Envelope C5: "<>setpagedevice" -+*PageSize EnvDL/Envelope DL: "<>setpagedevice" -+*PageSize EnvMonarch/Envelope Monarch: "<>setpagedevice" -+*CloseUI: *PageSize -+ -+*OpenUI *PageRegion: PickOne -+*OrderDependency: 10 AnySetup *PageRegion -+*DefaultPageRegion: Letter -+*PageRegion Letter/US Letter: "<>setpagedevice" -+*PageRegion Legal/US Legal: "<>setpagedevice" -+*PageRegion Executive/US Executive: "<>setpagedevice" -+*PageRegion Tabloid/US Tabloid: "<>setpagedevice" -+*PageRegion A3/A3: "<>setpagedevice" -+*PageRegion A4/A4: "<>setpagedevice" -+*PageRegion A5/A5: "<>setpagedevice" -+*PageRegion B5/B5 (JIS): "<>setpagedevice" -+*PageRegion EnvISOB5/Envelope B5: "<>setpagedevice" -+*PageRegion Env10/Envelope #10: "<>setpagedevice" -+*PageRegion EnvC5/Envelope C5: "<>setpagedevice" -+*PageRegion EnvDL/Envelope DL: "<>setpagedevice" -+*PageRegion EnvMonarch/Envelope Monarch: "<>setpagedevice" -+*CloseUI: *PageRegion -+ -+*DefaultImageableArea: Letter -+*ImageableArea Letter/US Letter: "12 12 600 780" -+*ImageableArea Legal/US Legal: "12 12 600 996" -+*ImageableArea Executive/US Executive: "12 12 510 708" -+*ImageableArea Tabloid/US Tabloid: "12 12 780 1212" -+*ImageableArea A3/A3: "12 12 830 1179" -+*ImageableArea A4/A4: "12 12 583 830" -+*ImageableArea A5/A5: "12 12 409 583" -+*ImageableArea B5/JIS B5: "12 12 504 717" -+*ImageableArea EnvISOB5/B5 (ISO): "12 12 469 697" -+*ImageableArea Env10/Com-10: "12 12 285 672" -+*ImageableArea EnvC5/EnvC5: "12 12 447 637" -+*ImageableArea EnvDL/EnvDL: "12 12 300 612" -+*ImageableArea EnvMonarch/Envelope Monarch: "12 12 267 528" -+ -+*DefaultPaperDimension: Letter -+*PaperDimension Letter/US Letter: "612 792" -+*PaperDimension Legal/US Legal: "612 1008" -+*PaperDimension Executive/US Executive: "522 756" -+*PaperDimension Tabloid/US Tabloid: "792 1224" -+*PaperDimension A3/A3: "842 1191" -+*PaperDimension A4/A4: "595 842" -+*PaperDimension A5/A5: "421 595" -+*PaperDimension B5/B5 (JIS): "516 729" -+*PaperDimension EnvISOB5/Envelope B5: "499 709" -+*PaperDimension Env10/Envelope #10: "297 684" -+*PaperDimension EnvC5/Envelope C5: "459 649" -+*PaperDimension EnvDL/Envelope DL: "312 624" -+*PaperDimension EnvMonarch/Envelope Monarch: "279 540" -+ -+*OpenUI *InputSlot/Media Source: PickOne -+*OrderDependency: 10 AnySetup *InputSlot -+*DefaultInputSlot: Default -+*InputSlot Default/Default: "<>setpagedevice" -+*InputSlot Auto/Automatically Select: "<>setpagedevice" -+*InputSlot MultiPurpose/Tray 1: "<>setpagedevice" -+*InputSlot Upper/Tray 2: "<>setpagedevice" -+*InputSlot Lower/Tray 3: "<>setpagedevice" -+*InputSlot LargeCapacity/Tray 4: "<>setpagedevice" -+*InputSlot Manual/Manual Feed: "<>setpagedevice" -+*InputSlot Envelope/Envelope Feed: "<>setpagedevice" -+*CloseUI: *InputSlot -+ -+*OpenUI *Resolution/Output Resolution: PickOne -+*OrderDependency: 20 AnySetup *Resolution -+*DefaultResolution: 600dpi -+*Resolution 150dpi/150 DPI: "<>setpagedevice" -+*Resolution 300dpi/300 DPI: "<>setpagedevice" -+*Resolution 600dpi/600 DPI: "<>setpagedevice" -+*Resolution 1200dpi/1200 DPI: "<>setpagedevice" -+*CloseUI: *Resolution -+ -+*OpenUI *Duplex/Double-Sided Printing: PickOne -+*OrderDependency: 20 AnySetup *Duplex -+*DefaultDuplex: None -+*Duplex None/Off: "<>setpagedevice" -+*Duplex DuplexNoTumble/Long Edge (Standard): "<>setpagedevice" -+*Duplex DuplexTumble/Short Edge (Flip): "<>setpagedevice" -+*CloseUI: *Duplex -+ -+*OpenGroup: InstallableOptions -+*OpenUI *OptionDuplex/Duplexer: Boolean -+*DefaultOptionDuplex: False -+*OptionDuplex True/Installed: "" -+*OptionDuplex False/Not Installed: "" -+*CloseUI: *OptionDuplex -+*CloseGroup: InstallableOptions -+ -+*DefaultFont: Courier -+*Font AvantGarde-Book: Standard "(001.006S)" Standard ROM -+*Font AvantGarde-BookOblique: Standard "(001.006S)" Standard ROM -+*Font AvantGarde-Demi: Standard "(001.007S)" Standard ROM -+*Font AvantGarde-DemiOblique: Standard "(001.007S)" Standard ROM -+*Font Bookman-Demi: Standard "(001.004S)" Standard ROM -+*Font Bookman-DemiItalic: Standard "(001.004S)" Standard ROM -+*Font Bookman-Light: Standard "(001.004S)" Standard ROM -+*Font Bookman-LightItalic: Standard "(001.004S)" Standard ROM -+*Font Courier: Standard "(002.004S)" Standard ROM -+*Font Courier-Bold: Standard "(002.004S)" Standard ROM -+*Font Courier-BoldOblique: Standard "(002.004S)" Standard ROM -+*Font Courier-Oblique: Standard "(002.004S)" Standard ROM -+*Font Helvetica: Standard "(001.006S)" Standard ROM -+*Font Helvetica-Bold: Standard "(001.007S)" Standard ROM -+*Font Helvetica-BoldOblique: Standard "(001.007S)" Standard ROM -+*Font Helvetica-Narrow: Standard "(001.006S)" Standard ROM -+*Font Helvetica-Narrow-Bold: Standard "(001.007S)" Standard ROM -+*Font Helvetica-Narrow-BoldOblique: Standard "(001.007S)" Standard ROM -+*Font Helvetica-Narrow-Oblique: Standard "(001.006S)" Standard ROM -+*Font Helvetica-Oblique: Standard "(001.006S)" Standard ROM -+*Font NewCenturySchlbk-Bold: Standard "(001.009S)" Standard ROM -+*Font NewCenturySchlbk-BoldItalic: Standard "(001.007S)" Standard ROM -+*Font NewCenturySchlbk-Italic: Standard "(001.006S)" Standard ROM -+*Font NewCenturySchlbk-Roman: Standard "(001.007S)" Standard ROM -+*Font Palatino-Bold: Standard "(001.005S)" Standard ROM -+*Font Palatino-BoldItalic: Standard "(001.005S)" Standard ROM -+*Font Palatino-Italic: Standard "(001.005S)" Standard ROM -+*Font Palatino-Roman: Standard "(001.005S)" Standard ROM -+*Font Symbol: Special "(001.007S)" Special ROM -+*Font Times-Bold: Standard "(001.007S)" Standard ROM -+*Font Times-BoldItalic: Standard "(001.009S)" Standard ROM -+*Font Times-Italic: Standard "(001.007S)" Standard ROM -+*Font Times-Roman: Standard "(001.007S)" Standard ROM -+*Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM -+*Font ZapfDingbats: Special "(001.004S)" Standard ROM -+*% -+*% diff --git a/cups-filters-lookup.patch b/cups-filters-lookup.patch deleted file mode 100644 index 95ed1bd..0000000 --- a/cups-filters-lookup.patch +++ /dev/null @@ -1,27 +0,0 @@ -diff -up cups-filters-1.0.34/utils/cups-browsed.c.lookup cups-filters-1.0.34/utils/cups-browsed.c ---- cups-filters-1.0.34/utils/cups-browsed.c.lookup 2013-06-26 16:23:38.000000000 +0200 -+++ cups-filters-1.0.34/utils/cups-browsed.c 2013-06-26 16:24:28.491804795 +0200 -@@ -990,23 +990,6 @@ found_cups_printer (const char *remote_h - debug_printf("cups-browsed: browsed queue name is %s\n", - local_resource + 9); - -- /* Does the host need resolving? */ -- if (host[strspn (host, "0123456789.")] == '\0') { -- /* Yes. Resolve it. */ -- struct addrinfo hints, *addr; -- memset(&hints, 0, sizeof(struct addrinfo)); -- hints.ai_family = AF_UNSPEC; -- hints.ai_socktype = SOCK_DGRAM; -- hints.ai_flags = 0; -- hints.ai_protocol = 0; -- if (!getaddrinfo (host, NULL, &hints, &addr)) { -- getnameinfo (addr->ai_addr, addr->ai_addrlen, -- host, sizeof(host), -- NULL, 0, 0); -- freeaddrinfo (addr); -- } -- } -- - generate_local_queue(host, port, local_resource, info ? info : "", "", ""); - } - diff --git a/cups-filters-man.patch b/cups-filters-man.patch deleted file mode 100644 index efc5011..0000000 --- a/cups-filters-man.patch +++ /dev/null @@ -1,179 +0,0 @@ -diff -up cups-filters-1.0.35/Makefile.am.man cups-filters-1.0.35/Makefile.am ---- cups-filters-1.0.35/Makefile.am.man 2013-05-15 20:46:22.000000000 +0200 -+++ cups-filters-1.0.35/Makefile.am 2013-07-01 14:03:58.395572035 +0200 -@@ -618,7 +618,6 @@ EXTRA_DIST += \ - # UTILS - # ===== - --EXTRA_DIST += utils/cups-browsed.in - sbin_PROGRAMS = \ - cups-browsed - cups_browsed_SOURCES = \ -@@ -636,6 +635,11 @@ cups_browsed_LDADD = \ - $(GLIB_LIBS) - initrcdir = $(INITDDIR) - initrc_SCRIPTS = utils/cups-browsed -+man_MANS = \ -+ utils/cups-browsed.8 \ -+ utils/cups-browsed.conf.5 -+EXTRA_DIST += utils/cups-browsed.in \ -+ $(man_MANS) - - # === - # PPD -diff -up cups-filters-1.0.35/utils/cups-browsed.8.man cups-filters-1.0.35/utils/cups-browsed.8 ---- cups-filters-1.0.35/utils/cups-browsed.8.man 2013-07-01 14:03:58.404571910 +0200 -+++ cups-filters-1.0.35/utils/cups-browsed.8 2013-07-01 14:03:58.404571910 +0200 -@@ -0,0 +1,56 @@ -+.\"Text automatically generated by txt2man -+.TH cups-browsed 8 "29 June 2013" "" "" -+.SH NAME -+\fBcups-browsed \fP- A daemon for browsing the Bonjour broadcasts of shared, remote CUPS printers -+\fB -+.SH SYNOPSIS -+.nf -+.fam C -+\fBcups-browsed\fP [\fB-v\fP | \fB-d\fP | \fB--debug\fP] -+ -+.fam T -+.fi -+.fam T -+.fi -+.SH DESCRIPTION -+\fBcups-browsed\fP has three independently switchable functions: -+.IP 1. 4 -+Browse Bonjour broadcasts of remote printers and create/remove local -+raw queues pointing to these printers. -+.IP 2. 4 -+Browse CUPS broadcasts of remote printers and create/remove local raw -+queues pointing to these printers. -+.IP 3. 4 -+Broadcast local queues with the CUPS protocol. -+.SH OPTIONS -+.TP -+.B -+\fB-v\fP, \fB-d\fP, \fB--debug\fP -+Debug mode -+.SH FILES -+/etc/cups/cups-browsed.conf -+.SH NOTES -+Please take references to cups 1.6.x to include newer versions. -+Similarily, cups 1.5.x is intended to encompass older versions too. -+.PP -+In environments with only cups 1.6.x servers and clients (plus -+\fBcups-browsed\fP on either server or client or both) the function described in 1. -+enables the automatic discovery of remote queues and their display in -+printing dialogues of applications and with command line tools. -+.PP -+The facility provided by 3. means that servers running cups 1.6.x plus -+\fBcups-browsed\fP can broadcast their local queues so that clients with cups -+1.5.x get these queues automatically available. The outcome of 2. is -+that clients running cups 1.6.x plus \fBcups-browsed\fP can use the CUPS -+broadcasts from servers with cups 1.5.x. As with browsing of Bonjour -+broadcasts, the created local raw queues are available to applications -+and command line tools. -+.SH SEE ALSO -+ -+\fBcups-browsed.conf\fP(5) -+.PP -+/usr/share/doc/\fBcups-filters\fP/README -+.SH AUTHOR -+The authors of \fBcups-browsed\fP are listed in /usr/share/doc/\fBcups-filters\fP/AUTHORS. -+.PP -+This manual page was written for the Debian Project, but it may be used by others. -diff -up cups-filters-1.0.35/utils/cups-browsed.conf.5.man cups-filters-1.0.35/utils/cups-browsed.conf.5 ---- cups-filters-1.0.35/utils/cups-browsed.conf.5.man 2013-07-01 14:03:58.404571910 +0200 -+++ cups-filters-1.0.35/utils/cups-browsed.conf.5 2013-07-01 14:03:58.404571910 +0200 -@@ -0,0 +1,92 @@ -+.\"Text automatically generated by txt2man -+.TH cups-browsed.conf 5 "29 June 2013" "" "" -+.SH NAME -+\fBcups-browsed.conf \fP- server configuration file for cups-browsed -+\fB -+.SH DESCRIPTION -+The cups-browsed.conf file configures the cups-browsed daemon. It is normally -+located in the /etc/cups directory. Each line in the file can be a -+configuration directive, a blank line, or a comment. Comment lines start -+with the # character. -+.SH DIRECTIVES -+ -+The BrowseAllow directive specifies a system or network to accept -+CUPS browse packets from. The default is to accept browse packets from -+all hosts when BrowseRemoteProtocols uses the CUPS protocol. -+.PP -+.nf -+.fam C -+ BrowseAllow 192.168.7.20 -+ BrowseAllow 192.168.7.0/24 -+ BrowseAllow 192.168.7.0/255.255.255.0 -+ -+ -+.fam T -+.fi -+The BrowsePoll directive polls a server for available printers once -+every 60 seconds. Multiple BrowsePoll directives can be specified -+to poll multiple servers. The default port to connect to is 631. -+BrowsePoll works independently of whether CUPS browsing is activated -+in BrowseRemoteProtocols. -+.PP -+.nf -+.fam C -+ BrowsePoll 192.168.7.20 -+ BrowsePoll 192.168.7.65:631 -+ BrowsePoll host.example.com:631 -+ -+ -+.fam T -+.fi -+The BrowseLocalProtocols directive specifies the protocols to use -+when advertising local shared printers on the network. The default -+is "none". Control of advertising of local shared printers using -+dnssd is done in /etc/cups/cupsd.conf. -+.PP -+.nf -+.fam C -+ BrowseLocalProtocols none -+ BrowseLocalProtocols CUPS -+ -+ -+.fam T -+.fi -+The BrowseRemoteProtocols directive specifies the protocols to use -+when finding remote shared printers on the network. Multiple -+protocols can be specified by separating them with spaces. -+The default is "dnssd cups". -+.PP -+.nf -+.fam C -+ BrowseRemoteProtocols none -+ BrowseRemoteProtocols CUPS dnssd -+ BrowseRemoteProtocols CUPS -+ BrowseRemoteProtocols dnssd -+ -+.fam T -+.fi -+The BrowseProtocols directive specifies the protocols to use when -+finding remote shared printers on the network and advertising local -+shared printers. "dnssd" is ignored for BrowseLocalProtocols. Multiple -+protocols can be specified by separating them with spaces. The -+default is "none" for BrowseLocalProtocols and "dnssd cups" for -+BrowseRemoteProtocols. -+.PP -+.nf -+.fam C -+ BrowseProtocols none -+ BrowseProtocols CUPS dnssd -+ BrowseProtocols CUPS -+ BrowseProtocols dnssd -+ -+.fam T -+.fi -+.SH SEE ALSO -+ -+\fBcups-browsed\fP(8) -+.PP -+/usr/share/doc/cups-filters/README -+.SH AUTHOR -+The authors of cups-browsed are listed in /usr/share/doc/cups-filters/AUTHORS. -+.PP -+This manual page was written for the Debian Project, but it may be used by others. diff --git a/cups-filters-page-label.patch b/cups-filters-page-label.patch deleted file mode 100644 index 2008e99..0000000 --- a/cups-filters-page-label.patch +++ /dev/null @@ -1,229 +0,0 @@ -diff -up cups-filters-1.0.35/filter/pdftopdf/pdftopdf.cc.page-label cups-filters-1.0.35/filter/pdftopdf/pdftopdf.cc ---- cups-filters-1.0.35/filter/pdftopdf/pdftopdf.cc.page-label 2013-04-09 19:14:42.000000000 +0100 -+++ cups-filters-1.0.35/filter/pdftopdf/pdftopdf.cc 2013-07-24 08:49:23.919081384 +0100 -@@ -9,6 +9,8 @@ - #include - #include - #include -+#include -+#include - #include - - #include "pdftopdf_processor.h" -@@ -402,8 +404,27 @@ void getParameters(ppd_file_t *ppd,int n - param.reverse=ppdDefaultOrder(ppd); - } - -- // TODO: pageLabel (not used) -- // param.pageLabel=cupsGetOption("page-label",num_options,options); // strdup? -+ std::string rawlabel; -+ char *classification = getenv("CLASSIFICATION"); -+ if (classification) -+ rawlabel.append (classification); -+ -+ if ( (val=cupsGetOption("page-label", num_options, options)) != NULL) { -+ if (!rawlabel.empty()) -+ rawlabel.append (" - "); -+ rawlabel.append(cupsGetOption("page-label",num_options,options)); -+ } -+ -+ std::ostringstream cookedlabel; -+ for (std::string::iterator it = rawlabel.begin(); -+ it != rawlabel.end (); -+ ++it) { -+ if (*it < 32 || *it > 126) -+ cookedlabel << "\\" << std::oct << std::setfill('0') << std::setw(3) << (unsigned int) *it; -+ else -+ cookedlabel.put (*it); -+ } -+ param.pageLabel = cookedlabel.str (); - - if ( (val=cupsGetOption("page-set",num_options,options)) != NULL) { - if (strcasecmp(val,"even")==0) { -diff -up cups-filters-1.0.35/filter/pdftopdf/pdftopdf_processor.cc.page-label cups-filters-1.0.35/filter/pdftopdf/pdftopdf_processor.cc ---- cups-filters-1.0.35/filter/pdftopdf/pdftopdf_processor.cc.page-label 2013-02-15 17:37:59.000000000 +0000 -+++ cups-filters-1.0.35/filter/pdftopdf/pdftopdf_processor.cc 2013-07-24 09:50:04.437720618 +0100 -@@ -80,12 +80,8 @@ void ProcessingParameters::dump() const - fprintf(stderr,"evenDuplex: %s\n", - (evenDuplex)?"true":"false"); - --/* -- // std::string pageLabel; // or NULL? must stay/dup! -- ... -- ... -- --*/ -+ fprintf(stderr,"pageLabel: %s\n", -+ pageLabel.empty () ? "(none)" : pageLabel.c_str()); - - fprintf(stderr,"bookletMode: "); - BookletMode_dump(booklet); -@@ -206,6 +202,10 @@ bool processPDFTOPDF(PDFTOPDF_Processor - page->mirror(); - } - -+ if (!param.pageLabel.empty()) { -+ page->add_label(param.page, param.pageLabel); -+ } -+ - // place border - if ( (param.border!=BorderType::NONE)&&(iAadd_border_rect(rect,param.border,1.0/pgedit.scale); - } - -+ if (!param.pageLabel.empty()) { -+ page->add_label(param.page, param.pageLabel); -+ } -+ - if (!param.fitplot) { - curpage->add_subpage(page,pgedit.xpos+xpos,pgedit.ypos+ypos,pgedit.scale,&rect); - } else { -diff -up cups-filters-1.0.35/filter/pdftopdf/pdftopdf_processor.h.page-label cups-filters-1.0.35/filter/pdftopdf/pdftopdf_processor.h ---- cups-filters-1.0.35/filter/pdftopdf/pdftopdf_processor.h.page-label 2012-11-15 15:58:39.000000000 +0000 -+++ cups-filters-1.0.35/filter/pdftopdf/pdftopdf_processor.h 2013-07-24 08:49:23.920081389 +0100 -@@ -20,7 +20,7 @@ struct ProcessingParameters { - border(NONE), - reverse(false), - --// pageLabel(NULL), -+ pageLabel(), - evenPages(true),oddPages(true), - - mirror(false), -@@ -60,7 +60,7 @@ struct ProcessingParameters { - NupParameters nup; - bool reverse; - -- // std::string pageLabel; // or NULL? must stay/dup! -+ std::string pageLabel; - bool evenPages,oddPages; - IntervalSet pageRange; - -@@ -105,6 +105,7 @@ public: - virtual void add_subpage(const std::shared_ptr &sub,float xpos,float ypos,float scale,const PageRect *crop=NULL) =0; - virtual void mirror() =0; - virtual void rotate(Rotation rot) =0; -+ virtual void add_label(const PageRect &rect, const std::string label) =0; - }; - - // TODO: ... error output? -diff -up cups-filters-1.0.35/filter/pdftopdf/qpdf_pdftopdf_processor.cc.page-label cups-filters-1.0.35/filter/pdftopdf/qpdf_pdftopdf_processor.cc ---- cups-filters-1.0.35/filter/pdftopdf/qpdf_pdftopdf_processor.cc.page-label 2013-03-14 20:32:42.000000000 +0000 -+++ cups-filters-1.0.35/filter/pdftopdf/qpdf_pdftopdf_processor.cc 2013-07-24 08:49:23.920081389 +0100 -@@ -257,6 +257,94 @@ void QPDF_PDFTOPDF_PageHandle::rotate(Ro - } - // }}} - -+void QPDF_PDFTOPDF_PageHandle::add_label(const PageRect &_rect, const std::string label) // {{{ -+{ -+ assert(isExisting()); -+ -+ PageRect rect = ungetRect (_rect, *this, rotation, page); -+ -+ assert (rect.left <= rect.right); -+ assert (rect.bottom <= rect.top); -+ -+ // TODO: Only add in the font once, not once per page. -+ QPDFObjectHandle font = page.getOwningQPDF()->makeIndirectObject ( -+ QPDFObjectHandle::parse( -+ "<<" -+ " /Type /Font" -+ " /Subtype /Type1" -+ " /Name /pagelabel-font" -+ " /BaseFont /Helvetica" // TODO: support UTF-8 labels? -+ ">>")); -+ QPDFObjectHandle resources = page.getKey ("/Resources"); -+ QPDFObjectHandle rfont = resources.getKey ("/Font"); -+ rfont.replaceKey ("/pagelabel-font", font); -+ -+ double margin = 2.25; -+ double height = 12; -+ -+ std::string boxcmd = "q\n"; -+ -+ // White filled rectangle (top) -+ boxcmd += " 1 1 1 rg\n"; -+ boxcmd += " " + QUtil::double_to_string(rect.left + margin) + " " + -+ QUtil::double_to_string(rect.top - height - 2 * margin) + " " + -+ QUtil::double_to_string(rect.right - rect.left - 2 * margin) + " " + -+ QUtil::double_to_string(height + 2 * margin) + " re f\n"; -+ -+ // White filled rectangle (bottom) -+ boxcmd += " " + QUtil::double_to_string(rect.left + margin) + " " + -+ QUtil::double_to_string(rect.bottom + height + margin) + " " + -+ QUtil::double_to_string(rect.right - rect.left - 2 * margin) + " " + -+ QUtil::double_to_string(height + 2 * margin) + " re f\n"; -+ -+ // Black outline (top) -+ boxcmd += " 0 0 0 RG\n"; -+ boxcmd += " " + QUtil::double_to_string(rect.left + margin) + " " + -+ QUtil::double_to_string(rect.top - height - 2 * margin) + " " + -+ QUtil::double_to_string(rect.right - rect.left - 2 * margin) + " " + -+ QUtil::double_to_string(height + 2 * margin) + " re S\n"; -+ -+ // Black outline (bottom) -+ boxcmd += " " + QUtil::double_to_string(rect.left + margin) + " " + -+ QUtil::double_to_string(rect.bottom + height + margin) + " " + -+ QUtil::double_to_string(rect.right - rect.left - 2 * margin) + " " + -+ QUtil::double_to_string(height + 2 * margin) + " re S\n"; -+ -+ // Black text (top) -+ boxcmd += " 0 0 0 rg\n"; -+ boxcmd += " BT\n"; -+ boxcmd += " /pagelabel-font 12 Tf\n"; -+ boxcmd += " " + QUtil::double_to_string(rect.left + 2 * margin) + " " + -+ QUtil::double_to_string(rect.top - height - margin) + " Td\n"; -+ boxcmd += " (" + label + ") Tj\n"; -+ boxcmd += " ET\n"; -+ -+ // Black text (bottom) -+ boxcmd += " BT\n"; -+ boxcmd += " /pagelabel-font 12 Tf\n"; -+ boxcmd += " " + QUtil::double_to_string(rect.left + 2 * margin) + " " + -+ QUtil::double_to_string(rect.bottom + height + 2 * margin) + " Td\n"; -+ boxcmd += " (" + label + ") Tj\n"; -+ boxcmd += " ET\n"; -+ -+ boxcmd += "Q\n"; -+ -+ assert(page.getOwningQPDF()); // existing pages are always indirect -+ static const char *pre="%pdftopdf q\n" -+ "q\n", -+ *post="%pdftopdf Q\n" -+ "Q\n"; -+ -+ QPDFObjectHandle stm1=QPDFObjectHandle::newStream(page.getOwningQPDF(), -+ pre), -+ stm2=QPDFObjectHandle::newStream(page.getOwningQPDF(), -+ std::string(post) + boxcmd); -+ -+ page.addPageContents(stm1,true); // before -+ page.addPageContents(stm2,false); // after -+} -+// }}} -+ - void QPDF_PDFTOPDF_PageHandle::debug(const PageRect &rect,float xpos,float ypos) // {{{ - { - assert(!isExisting()); -@@ -264,7 +352,7 @@ void QPDF_PDFTOPDF_PageHandle::debug(con - } - // }}} - -- -+// }}} - void QPDF_PDFTOPDF_Processor::closeFile() // {{{ - { - pdf.reset(); -diff -up cups-filters-1.0.35/filter/pdftopdf/qpdf_pdftopdf_processor.h.page-label cups-filters-1.0.35/filter/pdftopdf/qpdf_pdftopdf_processor.h ---- cups-filters-1.0.35/filter/pdftopdf/qpdf_pdftopdf_processor.h.page-label 2012-11-15 15:58:39.000000000 +0000 -+++ cups-filters-1.0.35/filter/pdftopdf/qpdf_pdftopdf_processor.h 2013-07-24 08:49:23.920081389 +0100 -@@ -11,6 +11,7 @@ public: - virtual void add_subpage(const std::shared_ptr &sub,float xpos,float ypos,float scale,const PageRect *crop=NULL); - virtual void mirror(); - virtual void rotate(Rotation rot); -+ virtual void add_label(const PageRect &rect, const std::string label); - - void debug(const PageRect &rect,float xpos,float ypos); - private: diff --git a/cups-filters.spec b/cups-filters.spec index dbca71f..c21d78a 100644 --- a/cups-filters.spec +++ b/cups-filters.spec @@ -3,8 +3,8 @@ Summary: OpenPrinting CUPS filters and backends Name: cups-filters -Version: 1.0.35 -Release: 7%{?dist} +Version: 1.0.36 +Release: 1%{?dist} # For a breakdown of the licensing, see COPYING file # GPLv2: filters: commandto*, imagetoraster, pdftops, rasterto*, @@ -22,11 +22,7 @@ Url: http://www.linuxfoundation.org/collaborate/workgroups/openprinting/cups Source0: http://www.openprinting.org/download/cups-filters/cups-filters-%{version}.tar.xz Source1: cups-browsed.service -Patch1: cups-filters-man.patch -Patch2: cups-filters-lookup.patch -Patch3: cups-filters-page-label.patch -Patch4: cups-filters-textfilters.patch -Patch5: cups-filters-gs-filters.patch +Patch1: cups-filters-textfilters.patch Requires: cups-filters-libs%{?_isa} = %{version}-%{release} @@ -105,17 +101,9 @@ This is the development package for OpenPrinting CUPS filters and backends. %prep %setup -q -%patch1 -p1 -b .man -%patch2 -p1 -b .lookup - -# Added support for page-label (bug #987515). -%patch3 -p1 -b .page-label # Set cost for text filters to 200 (bug #988909). -%patch4 -p1 -b .textfilters - -# Upstream patch to move in filters from ghostscript. -%patch5 -p1 -b .gs-filters +%patch1 -p1 -b .textfilters %build # work-around Rpath @@ -212,18 +200,22 @@ fi %files libs %doc __doc/COPYING fontembed/README -%attr(0755,root,root) %{_libdir}/libcupsfilters.so.* -%attr(0755,root,root) %{_libdir}/libfontembed.so.* +%{_libdir}/libcupsfilters.so.* +%{_libdir}/libfontembed.so.* %files devel %{_includedir}/cupsfilters %{_includedir}/fontembed +%{_datadir}/cups/ppdc/escp.h %{_libdir}/pkgconfig/libcupsfilters.pc %{_libdir}/pkgconfig/libfontembed.pc %{_libdir}/libcupsfilters.so %{_libdir}/libfontembed.so %changelog +* Tue Aug 13 2013 Tim Waugh - 1.0.36-1 +- 1.0.36. + * Tue Aug 13 2013 Tim Waugh - 1.0.35-7 - Upstream patch to move in filters from ghostscript. diff --git a/sources b/sources index aa01467..82461f9 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -f722074dfa8efd3fcb8502cede13a608 cups-filters-1.0.35.tar.xz +595c41a7e16136fc8c0fed1d35f583f6 cups-filters-1.0.36.tar.xz