3407 lines
113 KiB
Diff
3407 lines
113 KiB
Diff
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 <config.h>
|
|
+#include <string.h>
|
|
+#include <ctype.h>
|
|
+#include <cups/pwg.h>
|
|
+
|
|
+/*
|
|
+ * '_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 <stdio.h>
|
|
+# include <stdlib.h>
|
|
+# include <time.h>
|
|
+# include <math.h>
|
|
+
|
|
+# if defined(WIN32) || defined(__EMX__)
|
|
+# include <io.h>
|
|
+# else
|
|
+# include <unistd.h>
|
|
+# include <fcntl.h>
|
|
+# endif /* WIN32 || __EMX__ */
|
|
+
|
|
+# include <cups/cups.h>
|
|
+# include <cups/raster.h>
|
|
+
|
|
+/*
|
|
+ * 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 <cups/raster.h>
|
|
+#include <stdio.h>
|
|
+#include <sys/types.h>
|
|
+
|
|
+#ifdef HAVE_DBUS
|
|
+ #include <dbus/dbus.h>
|
|
+#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 <cups/raster.h>
|
|
+
|
|
+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 }<</.HWMargins[$margin_l $margin_b $margin_r $margin_t] /Margins[0 0]>>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 <stdio.h>
|
|
+#include <stdlib.h>
|
|
+#include <cups/cups.h>
|
|
+#include <stdarg.h>
|
|
+#include <fcntl.h>
|
|
+#include <cups/raster.h>
|
|
+#include <cupsfilters/raster.h>
|
|
+#include <sys/types.h>
|
|
+#include <sys/wait.h>
|
|
+#include <signal.h>
|
|
+#include <errno.h>
|
|
+
|
|
+#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), "<</cupsProfile(%s)>>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 <cups/raster.h>
|
|
#include <cupsfilters/image.h>
|
|
+#include <cupsfilters/raster.h>
|
|
#include <splash/SplashTypes.h>
|
|
#include <splash/SplashBitmap.h>
|
|
#include <strings.h>
|
|
@@ -357,80 +358,82 @@ static void parseOpts(int argc, char **a
|
|
}
|
|
|
|
ppd = ppdOpenFile(getenv("PPD"));
|
|
- if (ppd == NULL) {
|
|
- pdfError(-1,const_cast<char *>("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: "<</PageSize[612 792]/ImagingBBox null>>setpagedevice"
|
|
+*PageSize Legal/US Legal: "<</PageSize[612 1008]/ImagingBBox null>>setpagedevice"
|
|
+*PageSize Executive/US Executive: "<</PageSize[522 756]/ImagingBBox null>>setpagedevice"
|
|
+*PageSize Tabloid/US Tabloid: "<</PageSize[792 1224]/ImagingBBox null>>setpagedevice"
|
|
+*PageSize A3/A3: "<</PageSize[842 1191]/ImagingBBox null>>setpagedevice"
|
|
+*PageSize A4/A4: "<</PageSize[595 842]/ImagingBBox null>>setpagedevice"
|
|
+*PageSize A5/A5: "<</PageSize[421 595]/ImagingBBox null>>setpagedevice"
|
|
+*PageSize B5/B5 (JIS): "<</PageSize[516 729]/ImagingBBox null>>setpagedevice"
|
|
+*PageSize EnvISOB5/Envelope B5: "<</PageSize[499 709]/ImagingBBox null>>setpagedevice"
|
|
+*PageSize Env10/Envelope #10: "<</PageSize[297 684]/ImagingBBox null>>setpagedevice"
|
|
+*PageSize EnvC5/Envelope C5: "<</PageSize[459 649]/ImagingBBox null>>setpagedevice"
|
|
+*PageSize EnvDL/Envelope DL: "<</PageSize[312 624]/ImagingBBox null>>setpagedevice"
|
|
+*PageSize EnvMonarch/Envelope Monarch: "<</PageSize[279 540]/ImagingBBox null>>setpagedevice"
|
|
+*CloseUI: *PageSize
|
|
+
|
|
+*OpenUI *PageRegion: PickOne
|
|
+*OrderDependency: 10 AnySetup *PageRegion
|
|
+*DefaultPageRegion: Letter
|
|
+*PageRegion Letter/US Letter: "<</PageSize[612 792]/ImagingBBox null>>setpagedevice"
|
|
+*PageRegion Legal/US Legal: "<</PageSize[612 1008]/ImagingBBox null>>setpagedevice"
|
|
+*PageRegion Executive/US Executive: "<</PageSize[522 756]/ImagingBBox null>>setpagedevice"
|
|
+*PageRegion Tabloid/US Tabloid: "<</PageSize[792 1224]/ImagingBBox null>>setpagedevice"
|
|
+*PageRegion A3/A3: "<</PageSize[842 1191]/ImagingBBox null>>setpagedevice"
|
|
+*PageRegion A4/A4: "<</PageSize[595 842]/ImagingBBox null>>setpagedevice"
|
|
+*PageRegion A5/A5: "<</PageSize[421 595]/ImagingBBox null>>setpagedevice"
|
|
+*PageRegion B5/B5 (JIS): "<</PageSize[516 729]/ImagingBBox null>>setpagedevice"
|
|
+*PageRegion EnvISOB5/Envelope B5: "<</PageSize[499 709]/ImagingBBox null>>setpagedevice"
|
|
+*PageRegion Env10/Envelope #10: "<</PageSize[297 684]/ImagingBBox null>>setpagedevice"
|
|
+*PageRegion EnvC5/Envelope C5: "<</PageSize[459 649]/ImagingBBox null>>setpagedevice"
|
|
+*PageRegion EnvDL/Envelope DL: "<</PageSize[312 624]/ImagingBBox null>>setpagedevice"
|
|
+*PageRegion EnvMonarch/Envelope Monarch: "<</PageSize[279 540]/ImagingBBox null>>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: "<</MediaPosition 0>>setpagedevice"
|
|
+*InputSlot Auto/Automatically Select: "<</MediaPosition 1>>setpagedevice"
|
|
+*InputSlot MultiPurpose/Tray 1: "<</MediaPosition 3>>setpagedevice"
|
|
+*InputSlot Upper/Tray 2: "<</MediaPosition 4>>setpagedevice"
|
|
+*InputSlot Lower/Tray 3: "<</MediaPosition 5>>setpagedevice"
|
|
+*InputSlot LargeCapacity/Tray 4: "<</MediaPosition 7>>setpagedevice"
|
|
+*InputSlot Manual/Manual Feed: "<</MediaPosition 2>>setpagedevice"
|
|
+*InputSlot Envelope/Envelope Feed: "<</MediaPosition 6>>setpagedevice"
|
|
+*CloseUI: *InputSlot
|
|
+
|
|
+*OpenUI *ColorModel/Output Mode: PickOne
|
|
+*OrderDependency: 10 AnySetup *ColorModel
|
|
+*DefaultColorModel: RGB
|
|
+*ColorModel RGB/Color: "<</BitsPerPixel 24>>setpagedevice"
|
|
+*ColorModel Gray/Grayscale: "<</BitsPerPixel 8>>setpagedevice"
|
|
+*CloseUI: *ColorModel
|
|
+
|
|
+*OpenUI *Resolution/Output Resolution: PickOne
|
|
+*OrderDependency: 20 AnySetup *Resolution
|
|
+*DefaultResolution: 600dpi
|
|
+*Resolution 150dpi/150 DPI: "<</HWResolution[150 150]>>setpagedevice"
|
|
+*Resolution 300dpi/300 DPI: "<</HWResolution[300 300]>>setpagedevice"
|
|
+*Resolution 600dpi/600 DPI: "<</HWResolution[600 600]>>setpagedevice"
|
|
+*Resolution 1200dpi/1200 DPI: "<</HWResolution[1200 1200]>>setpagedevice"
|
|
+*CloseUI: *Resolution
|
|
+
|
|
+*OpenUI *Duplex/Double-Sided Printing: PickOne
|
|
+*OrderDependency: 20 AnySetup *Duplex
|
|
+*DefaultDuplex: None
|
|
+*Duplex None/Off: "<</Duplex false>>setpagedevice"
|
|
+*Duplex DuplexNoTumble/Long Edge (Standard): "<</Duplex true/Tumble false>>setpagedevice"
|
|
+*Duplex DuplexTumble/Short Edge (Flip): "<</Duplex true/Tumble true>>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: "<</PageSize[612 792]/ImagingBBox null>>setpagedevice"
|
|
+*PageSize Legal/US Legal: "<</PageSize[612 1008]/ImagingBBox null>>setpagedevice"
|
|
+*PageSize Executive/US Executive: "<</PageSize[522 756]/ImagingBBox null>>setpagedevice"
|
|
+*PageSize Tabloid/US Tabloid: "<</PageSize[792 1224]/ImagingBBox null>>setpagedevice"
|
|
+*PageSize A3/A3: "<</PageSize[842 1191]/ImagingBBox null>>setpagedevice"
|
|
+*PageSize A4/A4: "<</PageSize[595 842]/ImagingBBox null>>setpagedevice"
|
|
+*PageSize A5/A5: "<</PageSize[421 595]/ImagingBBox null>>setpagedevice"
|
|
+*PageSize B5/B5 (JIS): "<</PageSize[516 729]/ImagingBBox null>>setpagedevice"
|
|
+*PageSize EnvISOB5/Envelope B5: "<</PageSize[499 709]/ImagingBBox null>>setpagedevice"
|
|
+*PageSize Env10/Envelope #10: "<</PageSize[297 684]/ImagingBBox null>>setpagedevice"
|
|
+*PageSize EnvC5/Envelope C5: "<</PageSize[459 649]/ImagingBBox null>>setpagedevice"
|
|
+*PageSize EnvDL/Envelope DL: "<</PageSize[312 624]/ImagingBBox null>>setpagedevice"
|
|
+*PageSize EnvMonarch/Envelope Monarch: "<</PageSize[279 540]/ImagingBBox null>>setpagedevice"
|
|
+*CloseUI: *PageSize
|
|
+
|
|
+*OpenUI *PageRegion: PickOne
|
|
+*OrderDependency: 10 AnySetup *PageRegion
|
|
+*DefaultPageRegion: Letter
|
|
+*PageRegion Letter/US Letter: "<</PageSize[612 792]/ImagingBBox null>>setpagedevice"
|
|
+*PageRegion Legal/US Legal: "<</PageSize[612 1008]/ImagingBBox null>>setpagedevice"
|
|
+*PageRegion Executive/US Executive: "<</PageSize[522 756]/ImagingBBox null>>setpagedevice"
|
|
+*PageRegion Tabloid/US Tabloid: "<</PageSize[792 1224]/ImagingBBox null>>setpagedevice"
|
|
+*PageRegion A3/A3: "<</PageSize[842 1191]/ImagingBBox null>>setpagedevice"
|
|
+*PageRegion A4/A4: "<</PageSize[595 842]/ImagingBBox null>>setpagedevice"
|
|
+*PageRegion A5/A5: "<</PageSize[421 595]/ImagingBBox null>>setpagedevice"
|
|
+*PageRegion B5/B5 (JIS): "<</PageSize[516 729]/ImagingBBox null>>setpagedevice"
|
|
+*PageRegion EnvISOB5/Envelope B5: "<</PageSize[499 709]/ImagingBBox null>>setpagedevice"
|
|
+*PageRegion Env10/Envelope #10: "<</PageSize[297 684]/ImagingBBox null>>setpagedevice"
|
|
+*PageRegion EnvC5/Envelope C5: "<</PageSize[459 649]/ImagingBBox null>>setpagedevice"
|
|
+*PageRegion EnvDL/Envelope DL: "<</PageSize[312 624]/ImagingBBox null>>setpagedevice"
|
|
+*PageRegion EnvMonarch/Envelope Monarch: "<</PageSize[279 540]/ImagingBBox null>>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: "<</MediaPosition 0>>setpagedevice"
|
|
+*InputSlot Auto/Automatically Select: "<</MediaPosition 1>>setpagedevice"
|
|
+*InputSlot MultiPurpose/Tray 1: "<</MediaPosition 3>>setpagedevice"
|
|
+*InputSlot Upper/Tray 2: "<</MediaPosition 4>>setpagedevice"
|
|
+*InputSlot Lower/Tray 3: "<</MediaPosition 5>>setpagedevice"
|
|
+*InputSlot LargeCapacity/Tray 4: "<</MediaPosition 7>>setpagedevice"
|
|
+*InputSlot Manual/Manual Feed: "<</MediaPosition 2>>setpagedevice"
|
|
+*InputSlot Envelope/Envelope Feed: "<</MediaPosition 6>>setpagedevice"
|
|
+*CloseUI: *InputSlot
|
|
+
|
|
+*OpenUI *Resolution/Output Resolution: PickOne
|
|
+*OrderDependency: 20 AnySetup *Resolution
|
|
+*DefaultResolution: 600dpi
|
|
+*Resolution 150dpi/150 DPI: "<</HWResolution[150 150]>>setpagedevice"
|
|
+*Resolution 300dpi/300 DPI: "<</HWResolution[300 300]>>setpagedevice"
|
|
+*Resolution 600dpi/600 DPI: "<</HWResolution[600 600]>>setpagedevice"
|
|
+*Resolution 1200dpi/1200 DPI: "<</HWResolution[1200 1200]>>setpagedevice"
|
|
+*CloseUI: *Resolution
|
|
+
|
|
+*OpenUI *Duplex/Double-Sided Printing: PickOne
|
|
+*OrderDependency: 20 AnySetup *Duplex
|
|
+*DefaultDuplex: None
|
|
+*Duplex None/Off: "<</Duplex false>>setpagedevice"
|
|
+*Duplex DuplexNoTumble/Long Edge (Standard): "<</Duplex true/Tumble false>>setpagedevice"
|
|
+*Duplex DuplexTumble/Short Edge (Flip): "<</Duplex true/Tumble true>>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
|
|
+*%
|
|
+*%
|