summaryrefslogtreecommitdiff
path: root/src/main/print-pcl.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/print-pcl.c')
-rw-r--r--src/main/print-pcl.c2722
1 files changed, 2722 insertions, 0 deletions
diff --git a/src/main/print-pcl.c b/src/main/print-pcl.c
new file mode 100644
index 0000000..52fbfbe
--- /dev/null
+++ b/src/main/print-pcl.c
@@ -0,0 +1,2722 @@
+/*
+ * "$Id: print-pcl.c,v 1.47 2001/10/15 18:39:12 davehill Exp $"
+ *
+ * Print plug-in HP PCL driver for the GIMP.
+ *
+ * Copyright 1997-2000 Michael Sweet (mike@easysw.com),
+ * Robert Krawitz (rlk@alum.mit.edu) and
+ * Dave Hill (dave@minnie.demon.co.uk)
+ *
+ * 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 of the 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. 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.
+ */
+
+/*
+ * This file must include only standard C header files. The core code must
+ * compile on generic platforms that don't support glib, gimp, gtk, etc.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <gimp-print/gimp-print.h>
+#include "gimp-print-internal.h"
+#include <gimp-print/gimp-print-intl-internal.h>
+#include <stdio.h>
+#include <string.h>
+
+/* #define DEBUG */
+/* #define PCL_DEBUG_DISABLE_COMPRESSION */
+/* #define PCL_DEBUG_DISABLE_BLANKLINE_REMOVAL */
+
+/*
+ * Local functions...
+ */
+static void pcl_mode0(const stp_vars_t, unsigned char *, int, int);
+static void pcl_mode2(const stp_vars_t, unsigned char *, int, int);
+
+/*
+ * Generic define for a name/value set
+ */
+
+typedef struct
+{
+ const char *pcl_name;
+ const char *pcl_text;
+ int pcl_code;
+ int p0;
+ int p1;
+} pcl_t;
+
+/*
+ * Media size to PCL media size code table
+ *
+ * Note, you can force the list of papersizes given in the GUI to be only those
+ * supported by defining PCL_NO_CUSTOM_PAPERSIZES
+ */
+
+/* #define PCL_NO_CUSTOM_PAPERSIZES */
+
+#define PCL_PAPERSIZE_EXECUTIVE 1
+#define PCL_PAPERSIZE_LETTER 2
+#define PCL_PAPERSIZE_LEGAL 3
+#define PCL_PAPERSIZE_TABLOID 6 /* "Ledger" */
+#define PCL_PAPERSIZE_STATEMENT 15 /* Called "Manual" in print-util */
+#define PCL_PAPERSIZE_SUPER_B 16 /* Called "13x19" in print-util */
+#define PCL_PAPERSIZE_A5 25
+#define PCL_PAPERSIZE_A4 26
+#define PCL_PAPERSIZE_A3 27
+#define PCL_PAPERSIZE_JIS_B5 45
+#define PCL_PAPERSIZE_JIS_B4 46
+#define PCL_PAPERSIZE_HAGAKI_CARD 71
+#define PCL_PAPERSIZE_OUFUKU_CARD 72
+#define PCL_PAPERSIZE_A6_CARD 73
+#define PCL_PAPERSIZE_4x6 74
+#define PCL_PAPERSIZE_5x8 75
+#define PCL_PAPERSIZE_3x5 78
+#define PCL_PAPERSIZE_MONARCH_ENV 80
+#define PCL_PAPERSIZE_COMMERCIAL10_ENV 81
+#define PCL_PAPERSIZE_DL_ENV 90
+#define PCL_PAPERSIZE_C5_ENV 91
+#define PCL_PAPERSIZE_C6_ENV 92
+#define PCL_PAPERSIZE_CUSTOM 101 /* Custom size */
+#define PCL_PAPERSIZE_INVITATION_ENV 109
+#define PCL_PAPERSIZE_JAPANESE_3_ENV 110
+#define PCL_PAPERSIZE_JAPANESE_4_ENV 111
+#define PCL_PAPERSIZE_KAKU_ENV 113
+#define PCL_PAPERSIZE_HP_CARD 114 /* HP Greeting card!?? */
+
+/*
+ * This data comes from the HP documentation "Deskjet 1220C and 1120C
+ * PCL reference guide 2.0, Nov 1999". NOTE: The names *must* match
+ * those in print-util.c for the lookups to work properly!
+ */
+
+static const pcl_t pcl_media_sizes[] =
+{
+ { "Executive", N_ ("Executive"), PCL_PAPERSIZE_EXECUTIVE}, /* US Exec (7.25 x 10.5 in) */
+ { "Letter", N_ ("Letter"), PCL_PAPERSIZE_LETTER}, /* US Letter (8.5 x 11 in) */
+ { "Legal", N_ ("Legal"), PCL_PAPERSIZE_LEGAL}, /* US Legal (8.5 x 14 in) */
+ { "Tabloid", N_ ("Tabloid"), PCL_PAPERSIZE_TABLOID}, /* US Tabloid (11 x 17 in) */
+ { "Statement", N_ ("Manual"), PCL_PAPERSIZE_STATEMENT}, /* US Manual/Statement (5.5 x 8.5 in) */
+ { "SuperB", N_ ("13x19"), PCL_PAPERSIZE_SUPER_B}, /* US 13x19/Super B (13 x 19 in) */
+ { "A5", N_ ("A5"), PCL_PAPERSIZE_A5}, /* ISO/JIS A5 (148 x 210 mm) */
+ { "A4", N_ ("A4"), PCL_PAPERSIZE_A4}, /* ISO/JIS A4 (210 x 297 mm) */
+ { "A3", N_ ("A3"), PCL_PAPERSIZE_A3}, /* ISO/JIS A3 (297 x 420 mm) */
+ { "B5", N_ ("B5 JIS"), PCL_PAPERSIZE_JIS_B5}, /* JIS B5 (182 x 257 mm). */
+ { "B4", N_ ("B4 JIS"), PCL_PAPERSIZE_JIS_B4}, /* JIS B4 (257 x 364 mm). */
+ { "w283h420", N_ ("Hagaki Card"), PCL_PAPERSIZE_HAGAKI_CARD}, /* Japanese Hagaki Card (100 x 148 mm) */
+ { "w420h567", N_ ("Oufuku Card"), PCL_PAPERSIZE_OUFUKU_CARD}, /* Japanese Oufuku Card (148 x 200 mm) */
+ { "A6", N_ ("A6"), PCL_PAPERSIZE_A6_CARD}, /* ISO/JIS A6 card */
+ { "w288h432", N_ ("4x6"), PCL_PAPERSIZE_4x6}, /* US Index card (4 x 6 in) */
+ { "w360h576", N_ ("5x8"), PCL_PAPERSIZE_5x8}, /* US Index card (5 x 8 in) */
+ { "w216h360", N_ ("3x5"), PCL_PAPERSIZE_3x5}, /* US Index card (3 x 5 in) */
+ { "Monarch", N_ ("Monarch"), PCL_PAPERSIZE_MONARCH_ENV}, /* Monarch Envelope (3 7/8 x 7 1/2 in) */
+ { "COM10", N_ ("Commercial 10"), PCL_PAPERSIZE_COMMERCIAL10_ENV}, /* US Commercial 10 Envelope (4.125 x 9.5 in) Portrait */
+ { "DL", N_ ("DL"), PCL_PAPERSIZE_DL_ENV}, /* DL envelope (110 x 220 mm) Portrait */
+ { "C5", N_ ("C5"), PCL_PAPERSIZE_C5_ENV}, /* C5 envelope (162 x 229 mm) */
+ { "C6", N_ ("C6"), PCL_PAPERSIZE_C6_ENV}, /* C6 envelope (114 x 162 mm) */
+ { "ENVA2", N_ ("A2 Invitation"), PCL_PAPERSIZE_INVITATION_ENV}, /* US A2 Invitation envelope (4 3/8 x 5 3/4 in) */
+ { "w340h666", N_ ("Long 3"), PCL_PAPERSIZE_JAPANESE_3_ENV}, /* Japanese Long Envelope #3 (120 x 235 mm) */
+ { "w255h581", N_ ("Long 4"), PCL_PAPERSIZE_JAPANESE_4_ENV}, /* Japanese Long Envelope #4 (90 x 205 mm) */
+ { "w680h941", N_ ("Kaku"), PCL_PAPERSIZE_KAKU_ENV}, /* Japanese Kaku Envelope (240 x 332.1 mm) */
+/**** MRS: this size not supported by print-util funcs! ****/
+ { "w612h792", N_ ("HP Greeting Card"), PCL_PAPERSIZE_HP_CARD}, /* Hp greeting card (size?? */
+};
+#define NUM_PRINTER_PAPER_SIZES (sizeof(pcl_media_sizes) / sizeof(pcl_t))
+
+/*
+ * Media type to code table
+ */
+
+#define PCL_PAPERTYPE_PLAIN 0
+#define PCL_PAPERTYPE_BOND 1
+#define PCL_PAPERTYPE_PREMIUM 2
+#define PCL_PAPERTYPE_GLOSSY 3 /* or photo */
+#define PCL_PAPERTYPE_TRANS 4
+#define PCL_PAPERTYPE_QPHOTO 5 /* Quick dry photo (2000 only) */
+#define PCL_PAPERTYPE_QTRANS 6 /* Quick dry transparency (2000 only) */
+
+static const pcl_t pcl_media_types[] =
+{
+ { "Plain", N_ ("Plain"), PCL_PAPERTYPE_PLAIN},
+ { "Bond", N_ ("Bond"), PCL_PAPERTYPE_BOND},
+ { "Premium", N_ ("Premium"), PCL_PAPERTYPE_PREMIUM},
+ { "Glossy", N_ ("Glossy Photo"), PCL_PAPERTYPE_GLOSSY},
+ { "Transparency", N_ ("Transparency"), PCL_PAPERTYPE_TRANS},
+ { "GlossyQD", N_ ("Quick-dry Photo"), PCL_PAPERTYPE_QPHOTO},
+ { "TransparencyQD", N_ ("Quick-dry Transparency"), PCL_PAPERTYPE_QTRANS},
+};
+#define NUM_PRINTER_PAPER_TYPES (sizeof(pcl_media_types) / sizeof(pcl_t))
+
+/*
+ * Media feed to code table. There are different names for the same code,
+ * so we encode them by adding "lumps" of "PAPERSOURCE_MOD".
+ * This is removed later to get back to the main codes.
+ */
+
+#define PAPERSOURCE_MOD 16
+
+#define PCL_PAPERSOURCE_STANDARD 0 /* Don't output code */
+#define PCL_PAPERSOURCE_MANUAL 2
+#define PCL_PAPERSOURCE_ENVELOPE 3 /* Not used */
+
+/* LaserJet types */
+#define PCL_PAPERSOURCE_LJ_TRAY2 1
+#define PCL_PAPERSOURCE_LJ_TRAY3 4
+#define PCL_PAPERSOURCE_LJ_TRAY4 5
+#define PCL_PAPERSOURCE_LJ_TRAY1 8
+
+/* Deskjet 340 types */
+#define PCL_PAPERSOURCE_340_PCSF 1 + PAPERSOURCE_MOD
+ /* Portable sheet feeder for 340 */
+#define PCL_PAPERSOURCE_340_DCSF 4 + PAPERSOURCE_MOD
+ /* Desktop sheet feeder for 340 */
+
+/* Other Deskjet types */
+#define PCL_PAPERSOURCE_DJ_TRAY 1 + PAPERSOURCE_MOD + PAPERSOURCE_MOD
+#define PCL_PAPERSOURCE_DJ_TRAY2 4 + PAPERSOURCE_MOD + PAPERSOURCE_MOD
+ /* Tray 2 for 2500 */
+#define PCL_PAPERSOURCE_DJ_OPTIONAL 5 + PAPERSOURCE_MOD + PAPERSOURCE_MOD
+ /* Optional source for 2500 */
+#define PCL_PAPERSOURCE_DJ_AUTO 7 + PAPERSOURCE_MOD + PAPERSOURCE_MOD
+ /* Autoselect for 2500 */
+
+static const pcl_t pcl_media_sources[] =
+{
+ { "Standard", N_ ("Standard"), PCL_PAPERSOURCE_STANDARD},
+ { "Manual", N_ ("Manual"), PCL_PAPERSOURCE_MANUAL},
+/* {"Envelope", PCL_PAPERSOURCE_ENVELOPE}, */
+ { "MultiPurpose", N_ ("Tray 1"), PCL_PAPERSOURCE_LJ_TRAY1},
+ { "Upper", N_ ("Tray 2"), PCL_PAPERSOURCE_LJ_TRAY2},
+ { "Lower", N_ ("Tray 3"), PCL_PAPERSOURCE_LJ_TRAY3},
+ { "LargeCapacity", N_ ("Tray 4"), PCL_PAPERSOURCE_LJ_TRAY4},
+ { "Portable", N_ ("Portable Sheet Feeder"), PCL_PAPERSOURCE_340_PCSF},
+ { "Desktop", N_ ("Desktop Sheet Feeder"), PCL_PAPERSOURCE_340_DCSF},
+ { "Tray", N_ ("Tray"), PCL_PAPERSOURCE_DJ_TRAY},
+ { "Tray2", N_ ("Tray 2"), PCL_PAPERSOURCE_DJ_TRAY2},
+ { "Optional", N_ ("Optional Source"), PCL_PAPERSOURCE_DJ_OPTIONAL},
+ { "Auto", N_ ("Autoselect"), PCL_PAPERSOURCE_DJ_AUTO},
+};
+#define NUM_PRINTER_PAPER_SOURCES (sizeof(pcl_media_sources) / sizeof(pcl_t))
+
+#define PCL_RES_150_150 1
+#define PCL_RES_300_300 2
+#define PCL_RES_600_300 4 /* DJ 600 series */
+#define PCL_RES_600_600_MONO 8 /* DJ 600/800/1100/2000 b/w only */
+#define PCL_RES_600_600 16 /* DJ 9xx/1220C/PhotoSmart */
+#define PCL_RES_1200_600 32 /* DJ 9xx/1220C/PhotoSmart */
+#define PCL_RES_2400_600 64 /* DJ 9xx/1220C/PhotoSmart */
+
+static const pcl_t pcl_resolutions[] =
+{
+ { "150dpi", N_("150x150 DPI"), PCL_RES_150_150, 150, 150},
+ { "300dpi", N_("300x300 DPI"), PCL_RES_300_300, 300, 300},
+ { "600x300dpi", N_("600x300 DPI"), PCL_RES_600_300, 600, 300},
+ { "600mono", N_("600x600 DPI monochrome"), PCL_RES_600_600_MONO, 600, 600},
+ { "600dpi", N_("600x600 DPI"), PCL_RES_600_600, 600, 600},
+ { "1200x600dpi", N_("1200x600 DPI"), PCL_RES_1200_600, 1200, 600},
+ { "2400x600dpi", N_("2400x600 DPI"), PCL_RES_2400_600, 2400, 600},
+};
+#define NUM_RESOLUTIONS (sizeof(pcl_resolutions) / sizeof (pcl_t))
+
+static void
+pcl_describe_resolution(const stp_printer_t printer,
+ const char *resolution, int *x, int *y)
+{
+ int i;
+ for (i = 0; i < NUM_RESOLUTIONS; i++)
+ {
+ if (!strcmp(resolution, pcl_resolutions[i].pcl_name))
+ {
+ *x = pcl_resolutions[i].p0;
+ *y = pcl_resolutions[i].p1;
+ return;
+ }
+ }
+ *x = -1;
+ *y = -1;
+}
+
+/*
+ * Printer capability data
+ */
+
+typedef struct {
+ int model;
+ int custom_max_width;
+ int custom_max_height;
+ int custom_min_width;
+ int custom_min_height;
+ int resolutions;
+ int top_margin;
+ int bottom_margin;
+ int left_margin;
+ int right_margin;
+ int color_type; /* 2 print head or one, 2 level or 4 */
+ int stp_printer_type; /* Deskjet/Laserjet and quirks */
+/* The paper size, paper type and paper source codes cannot be combined */
+ const int paper_sizes[NUM_PRINTER_PAPER_SIZES + 1];
+ /* Paper sizes */
+ const int paper_types[NUM_PRINTER_PAPER_TYPES + 1];
+ /* Paper types */
+ const int paper_sources[NUM_PRINTER_PAPER_SOURCES + 1];
+ /* Paper sources */
+ } pcl_cap_t;
+
+#define PCL_COLOR_NONE 0
+#define PCL_COLOR_CMY 1 /* One print head */
+#define PCL_COLOR_CMYK 2 /* Two print heads */
+#define PCL_COLOR_CMYK4 4 /* CRet printing */
+#define PCL_COLOR_CMYKcm 8 /* CMY + Photo Cart */
+#define PCL_COLOR_CMYK4b 16 /* CRet for HP840c */
+
+#define PCL_PRINTER_LJ 1
+#define PCL_PRINTER_DJ 2
+#define PCL_PRINTER_NEW_ERG 4 /* use "\033*rC" to end raster graphics,
+ instead of "\033*rB" */
+#define PCL_PRINTER_TIFF 8 /* Use TIFF compression */
+#define PCL_PRINTER_MEDIATYPE 16 /* Use media type & print quality */
+#define PCL_PRINTER_CUSTOM_SIZE 32 /* Custom sizes supported */
+#define PCL_PRINTER_BLANKLINE 64 /* Blank line removal supported */
+
+/*
+ * FIXME - the 520 shouldn't be lumped in with the 500 as it supports
+ * more paper sizes.
+ *
+ * The following models use depletion, raster quality and shingling:-
+ * 500, 500c, 510, 520, 550c, 560c.
+ * The rest use Media Type and Print Quality.
+ *
+ * This data comes from the HP documentation "Deskjet 1220C and 1120C
+ * PCL reference guide 2.0, Nov 1999".
+ */
+
+static const pcl_cap_t pcl_model_capabilities[] =
+{
+ /* Default/unknown printer - assume laserjet */
+ { 0,
+ 17 * 72 / 2, 14 * 72, /* Max paper size */
+ 1, 1, /* Min paper size */
+ PCL_RES_150_150 | PCL_RES_300_300, /* Resolutions */
+ 12, 12, 18, 18, /* Margins */
+ PCL_COLOR_NONE,
+ PCL_PRINTER_LJ,
+ {
+ PCL_PAPERSIZE_EXECUTIVE,
+ PCL_PAPERSIZE_STATEMENT,
+ PCL_PAPERSIZE_LETTER,
+ PCL_PAPERSIZE_LEGAL,
+ PCL_PAPERSIZE_A4,
+ 0,
+ },
+ { -1, /* No selectable paper types */
+ },
+ { -1, /* No selectable paper sources */
+ },
+ },
+ /* DesignJet 750C */
+ { 750,
+ 36 * 72, 100 * 12 * 72, /* Length limited to 51" in sheet mode */
+ 5 * 72, 583 * 72 / 100, /* Min paper size */
+ PCL_RES_300_300 | PCL_RES_600_600_MONO,
+ 30, 30, 15, 15,
+ PCL_COLOR_CMYK,
+ PCL_PRINTER_DJ | PCL_PRINTER_TIFF | PCL_PRINTER_BLANKLINE | PCL_PRINTER_CUSTOM_SIZE | PCL_PRINTER_NEW_ERG,
+ {
+ PCL_PAPERSIZE_LETTER,
+ -1,
+ },
+ {
+ PCL_PAPERTYPE_PLAIN,
+ PCL_PAPERTYPE_BOND,
+ PCL_PAPERTYPE_PREMIUM,
+ PCL_PAPERTYPE_GLOSSY,
+ PCL_PAPERTYPE_TRANS,
+ -1,
+ },
+ {
+ PCL_PAPERSOURCE_STANDARD,
+ -1,
+ },
+ },
+ /* Deskjet 340 */
+ { 340,
+ 17 * 72 / 2, 14 * 72,
+ 1, 1, /* Min paper size */
+ PCL_RES_150_150 | PCL_RES_300_300,
+ 7, 41, 18, 18,
+ PCL_COLOR_CMY,
+ PCL_PRINTER_DJ | PCL_PRINTER_TIFF | PCL_PRINTER_BLANKLINE,
+ {
+ PCL_PAPERSIZE_EXECUTIVE,
+ PCL_PAPERSIZE_LETTER,
+ PCL_PAPERSIZE_LEGAL,
+ PCL_PAPERSIZE_A4,
+ -1,
+ },
+ {
+ PCL_PAPERTYPE_PLAIN,
+ PCL_PAPERTYPE_BOND,
+ PCL_PAPERTYPE_PREMIUM,
+ PCL_PAPERTYPE_GLOSSY,
+ PCL_PAPERTYPE_TRANS,
+ -1,
+ },
+ {
+ PCL_PAPERSOURCE_STANDARD,
+ PCL_PAPERSOURCE_MANUAL,
+ PCL_PAPERSOURCE_340_PCSF,
+ PCL_PAPERSOURCE_340_DCSF,
+ -1,
+ },
+ },
+ /* Deskjet 400 */
+ { 400,
+ 17 * 72 / 2, 14 * 72,
+ 1, 1, /* Min paper size */
+ PCL_RES_150_150 | PCL_RES_300_300,
+ 7, 41, 18, 18,
+ PCL_COLOR_CMY,
+ PCL_PRINTER_DJ | PCL_PRINTER_TIFF | PCL_PRINTER_BLANKLINE,
+ {
+ PCL_PAPERSIZE_EXECUTIVE,
+ PCL_PAPERSIZE_LETTER,
+ PCL_PAPERSIZE_LEGAL,
+ PCL_PAPERSIZE_A4,
+ PCL_PAPERSIZE_JIS_B5,
+ -1,
+ },
+ {
+ PCL_PAPERTYPE_PLAIN,
+ PCL_PAPERTYPE_BOND,
+ PCL_PAPERTYPE_PREMIUM,
+ PCL_PAPERTYPE_GLOSSY,
+ PCL_PAPERTYPE_TRANS,
+ -1,
+ },
+ { -1, /* No selectable paper sources */
+ },
+ },
+ /* Deskjet 500, 520. Lexmark 4076 */
+ { 500,
+ 17 * 72 / 2, 14 * 72,
+ 1, 1, /* Min paper size */
+ PCL_RES_150_150 | PCL_RES_300_300,
+ 7, 41, 18, 18,
+ PCL_COLOR_NONE,
+ PCL_PRINTER_DJ | PCL_PRINTER_TIFF | PCL_PRINTER_BLANKLINE,
+ {
+/* PCL_PAPERSIZE_EXECUTIVE, The 500 doesn't support this, the 520 does */
+ PCL_PAPERSIZE_LETTER,
+ PCL_PAPERSIZE_LEGAL,
+ PCL_PAPERSIZE_A4,
+ PCL_PAPERSIZE_COMMERCIAL10_ENV,
+/* PCL_PAPERSIZE_DL_ENV, The 500 doesn't support this, the 520 does */
+ -1,
+ },
+ {
+ PCL_PAPERTYPE_PLAIN,
+ PCL_PAPERTYPE_BOND,
+ PCL_PAPERTYPE_PREMIUM,
+ PCL_PAPERTYPE_GLOSSY,
+ PCL_PAPERTYPE_TRANS,
+ -1,
+ },
+ {
+ PCL_PAPERSOURCE_STANDARD,
+ PCL_PAPERSOURCE_MANUAL,
+ PCL_PAPERSOURCE_DJ_TRAY,
+ -1,
+ },
+ },
+ /* Deskjet 500C */
+ { 501,
+ 17 * 72 / 2, 14 * 72,
+ 1, 1, /* Min paper size */
+ PCL_RES_150_150 | PCL_RES_300_300,
+ 7, 33, 18, 18,
+ PCL_COLOR_CMY,
+ PCL_PRINTER_DJ | PCL_PRINTER_NEW_ERG | PCL_PRINTER_TIFF | PCL_PRINTER_BLANKLINE,
+ {
+ PCL_PAPERSIZE_LETTER,
+ PCL_PAPERSIZE_LEGAL,
+ PCL_PAPERSIZE_A4,
+ PCL_PAPERSIZE_COMMERCIAL10_ENV,
+ -1,
+ },
+ {
+ PCL_PAPERTYPE_PLAIN,
+ PCL_PAPERTYPE_BOND,
+ PCL_PAPERTYPE_PREMIUM,
+ PCL_PAPERTYPE_GLOSSY,
+ PCL_PAPERTYPE_TRANS,
+ -1,
+ },
+ {
+ PCL_PAPERSOURCE_STANDARD,
+ PCL_PAPERSOURCE_MANUAL,
+ PCL_PAPERSOURCE_DJ_TRAY,
+ -1,
+ },
+ },
+ /* Deskjet 540C */
+ { 540,
+ 17 * 72 / 2, 14 * 72,
+ 1, 1, /* Min paper size */
+ PCL_RES_150_150 | PCL_RES_300_300,
+ 7, 33, 18, 18,
+ PCL_COLOR_CMY,
+ PCL_PRINTER_DJ | PCL_PRINTER_NEW_ERG | PCL_PRINTER_TIFF | PCL_PRINTER_MEDIATYPE |
+ PCL_PRINTER_CUSTOM_SIZE | PCL_PRINTER_BLANKLINE,
+ {
+ PCL_PAPERSIZE_EXECUTIVE,
+ PCL_PAPERSIZE_LETTER,
+ PCL_PAPERSIZE_LEGAL,
+ PCL_PAPERSIZE_A4,
+ PCL_PAPERSIZE_A5,
+ PCL_PAPERSIZE_JIS_B5,
+ PCL_PAPERSIZE_HAGAKI_CARD,
+ PCL_PAPERSIZE_A6_CARD,
+ PCL_PAPERSIZE_4x6,
+ PCL_PAPERSIZE_5x8,
+ PCL_PAPERSIZE_COMMERCIAL10_ENV,
+ PCL_PAPERSIZE_DL_ENV,
+ PCL_PAPERSIZE_C6_ENV,
+ -1,
+ },
+ {
+ PCL_PAPERTYPE_PLAIN,
+ PCL_PAPERTYPE_BOND,
+ PCL_PAPERTYPE_PREMIUM,
+ PCL_PAPERTYPE_GLOSSY,
+ PCL_PAPERTYPE_TRANS,
+ -1,
+ },
+ {
+ PCL_PAPERSOURCE_STANDARD,
+ PCL_PAPERSOURCE_MANUAL,
+ PCL_PAPERSOURCE_DJ_TRAY,
+ -1,
+ },
+ },
+ /* Deskjet 550C, 560C */
+ { 550,
+ 17 * 72 / 2, 14 * 72,
+ 1, 1, /* Min paper size */
+ PCL_RES_150_150 | PCL_RES_300_300,
+ 3, 33, 18, 18,
+ PCL_COLOR_CMYK,
+ PCL_PRINTER_DJ | PCL_PRINTER_NEW_ERG | PCL_PRINTER_TIFF | PCL_PRINTER_BLANKLINE,
+ {
+ PCL_PAPERSIZE_EXECUTIVE,
+ PCL_PAPERSIZE_LETTER,
+ PCL_PAPERSIZE_LEGAL,
+ PCL_PAPERSIZE_A4,
+/* The 550/560 support COM10 and DL envelope, but the control codes
+ are negative, indicating landscape mode. This needs thinking about! */
+ -1,
+ },
+ {
+ PCL_PAPERTYPE_PLAIN,
+ PCL_PAPERTYPE_BOND,
+ PCL_PAPERTYPE_PREMIUM,
+ PCL_PAPERTYPE_GLOSSY,
+ PCL_PAPERTYPE_TRANS,
+ -1,
+ },
+ {
+ PCL_PAPERSOURCE_STANDARD,
+ PCL_PAPERSOURCE_MANUAL,
+ PCL_PAPERSOURCE_DJ_TRAY,
+ -1,
+ },
+ },
+ /* Deskjet 600/600C */
+ { 600,
+ 17 * 72 / 2, 14 * 72,
+ 5 * 72, 583 * 72 / 100, /* Min paper size */
+ PCL_RES_150_150 | PCL_RES_300_300 | PCL_RES_600_300 | PCL_RES_600_600_MONO,
+ 0, 33, 18, 18,
+ PCL_COLOR_CMY,
+ PCL_PRINTER_DJ | PCL_PRINTER_NEW_ERG | PCL_PRINTER_TIFF | PCL_PRINTER_MEDIATYPE |
+ PCL_PRINTER_CUSTOM_SIZE | PCL_PRINTER_BLANKLINE,
+ {
+ PCL_PAPERSIZE_EXECUTIVE,
+ PCL_PAPERSIZE_LETTER,
+ PCL_PAPERSIZE_LEGAL,
+ PCL_PAPERSIZE_A5,
+ PCL_PAPERSIZE_A4,
+ PCL_PAPERSIZE_HAGAKI_CARD,
+ PCL_PAPERSIZE_A6_CARD,
+ PCL_PAPERSIZE_4x6,
+ PCL_PAPERSIZE_5x8,
+ PCL_PAPERSIZE_COMMERCIAL10_ENV,
+ PCL_PAPERSIZE_DL_ENV,
+ PCL_PAPERSIZE_C6_ENV,
+ PCL_PAPERSIZE_INVITATION_ENV,
+ -1,
+ },
+ {
+ PCL_PAPERTYPE_PLAIN,
+ PCL_PAPERTYPE_BOND,
+ PCL_PAPERTYPE_PREMIUM,
+ PCL_PAPERTYPE_GLOSSY,
+ PCL_PAPERTYPE_TRANS,
+ -1,
+ },
+ { -1, /* No selectable paper sources */
+ },
+ },
+ /* Deskjet 6xx series */
+ { 601,
+ 17 * 72 / 2, 14 * 72,
+ 1, 1, /* Min paper size */
+ PCL_RES_150_150 | PCL_RES_300_300 | PCL_RES_600_300 | PCL_RES_600_600_MONO,
+ 0, 33, 18, 18,
+ PCL_COLOR_CMYK,
+ PCL_PRINTER_DJ | PCL_PRINTER_NEW_ERG | PCL_PRINTER_TIFF | PCL_PRINTER_MEDIATYPE |
+ PCL_PRINTER_CUSTOM_SIZE | PCL_PRINTER_BLANKLINE,
+ {
+ PCL_PAPERSIZE_EXECUTIVE,
+ PCL_PAPERSIZE_LETTER,
+ PCL_PAPERSIZE_LEGAL,
+ PCL_PAPERSIZE_A5,
+ PCL_PAPERSIZE_A4,
+ PCL_PAPERSIZE_HAGAKI_CARD,
+ PCL_PAPERSIZE_A6_CARD,
+ PCL_PAPERSIZE_4x6,
+ PCL_PAPERSIZE_5x8,
+ PCL_PAPERSIZE_COMMERCIAL10_ENV,
+ PCL_PAPERSIZE_DL_ENV,
+ PCL_PAPERSIZE_C6_ENV,
+ PCL_PAPERSIZE_INVITATION_ENV,
+ -1,
+ },
+ {
+ PCL_PAPERTYPE_PLAIN,
+ PCL_PAPERTYPE_BOND,
+ PCL_PAPERTYPE_PREMIUM,
+ PCL_PAPERTYPE_GLOSSY,
+ PCL_PAPERTYPE_TRANS,
+ -1,
+ },
+ {
+ -1,
+ },
+ },
+ /* Deskjet 69x series (Photo Capable) */
+ { 690,
+ 17 * 72 / 2, 14 * 72,
+ 1, 1, /* Min paper size */
+ PCL_RES_150_150 | PCL_RES_300_300 | PCL_RES_600_300 | PCL_RES_600_600,
+ 0, 33, 18, 18,
+ PCL_COLOR_CMYK | PCL_COLOR_CMYKcm,
+ PCL_PRINTER_DJ | PCL_PRINTER_NEW_ERG | PCL_PRINTER_TIFF | PCL_PRINTER_MEDIATYPE |
+ PCL_PRINTER_CUSTOM_SIZE | PCL_PRINTER_BLANKLINE,
+ {
+ PCL_PAPERSIZE_EXECUTIVE,
+ PCL_PAPERSIZE_LETTER,
+ PCL_PAPERSIZE_LEGAL,
+ PCL_PAPERSIZE_A5,
+ PCL_PAPERSIZE_A4,
+ PCL_PAPERSIZE_HAGAKI_CARD,
+ PCL_PAPERSIZE_A6_CARD,
+ PCL_PAPERSIZE_4x6,
+ PCL_PAPERSIZE_5x8,
+ PCL_PAPERSIZE_COMMERCIAL10_ENV,
+ PCL_PAPERSIZE_DL_ENV,
+ PCL_PAPERSIZE_C6_ENV,
+ PCL_PAPERSIZE_INVITATION_ENV,
+ -1,
+ },
+ {
+ PCL_PAPERTYPE_PLAIN,
+ PCL_PAPERTYPE_BOND,
+ PCL_PAPERTYPE_PREMIUM,
+ PCL_PAPERTYPE_GLOSSY,
+ PCL_PAPERTYPE_TRANS,
+ -1,
+ },
+ {
+ -1,
+ },
+ },
+ /* Deskjet 850/855/870/890 (C-RET) */
+ { 800,
+ 17 * 72 / 2, 14 * 72,
+ 1, 1, /* Min paper size */
+ PCL_RES_150_150 | PCL_RES_300_300 | PCL_RES_600_600_MONO,
+ 3, 33, 18, 18,
+ PCL_COLOR_CMYK | PCL_COLOR_CMYK4,
+ PCL_PRINTER_DJ | PCL_PRINTER_NEW_ERG | PCL_PRINTER_TIFF | PCL_PRINTER_MEDIATYPE |
+ PCL_PRINTER_CUSTOM_SIZE | PCL_PRINTER_BLANKLINE,
+ {
+ PCL_PAPERSIZE_EXECUTIVE,
+ PCL_PAPERSIZE_LETTER,
+ PCL_PAPERSIZE_LEGAL,
+ PCL_PAPERSIZE_A5,
+ PCL_PAPERSIZE_A4,
+ PCL_PAPERSIZE_HAGAKI_CARD,
+ PCL_PAPERSIZE_A6_CARD,
+ PCL_PAPERSIZE_4x6,
+ PCL_PAPERSIZE_5x8,
+ PCL_PAPERSIZE_COMMERCIAL10_ENV,
+ PCL_PAPERSIZE_DL_ENV,
+ PCL_PAPERSIZE_C6_ENV,
+ PCL_PAPERSIZE_INVITATION_ENV,
+ -1,
+ },
+ {
+ PCL_PAPERTYPE_PLAIN,
+ PCL_PAPERTYPE_BOND,
+ PCL_PAPERTYPE_PREMIUM,
+ PCL_PAPERTYPE_GLOSSY,
+ PCL_PAPERTYPE_TRANS,
+ -1,
+ },
+ {
+ -1,
+ },
+ },
+ /* Deskjet 810C, 812C, 840C, 842C, 845C, 895C (C-RET) */
+ { 840,
+ 17 * 72 / 2, 14 * 72,
+ 1, 1, /* Min paper size */
+ PCL_RES_150_150 | PCL_RES_300_300 | PCL_RES_600_300 | PCL_RES_600_600,
+ 0, 33, 18, 18,
+ PCL_COLOR_CMYK | PCL_COLOR_CMYK4b,
+ PCL_PRINTER_DJ | PCL_PRINTER_NEW_ERG | PCL_PRINTER_TIFF | PCL_PRINTER_MEDIATYPE |
+ PCL_PRINTER_CUSTOM_SIZE | PCL_PRINTER_BLANKLINE,
+ {
+ PCL_PAPERSIZE_EXECUTIVE,
+ PCL_PAPERSIZE_LETTER,
+ PCL_PAPERSIZE_LEGAL,
+ PCL_PAPERSIZE_A5,
+ PCL_PAPERSIZE_A4,
+ PCL_PAPERSIZE_HAGAKI_CARD,
+ PCL_PAPERSIZE_A6_CARD,
+ PCL_PAPERSIZE_4x6,
+ PCL_PAPERSIZE_5x8,
+ PCL_PAPERSIZE_COMMERCIAL10_ENV,
+ PCL_PAPERSIZE_DL_ENV,
+ PCL_PAPERSIZE_C6_ENV,
+ PCL_PAPERSIZE_INVITATION_ENV,
+ -1,
+ },
+ {
+ PCL_PAPERTYPE_PLAIN,
+ PCL_PAPERTYPE_BOND,
+ PCL_PAPERTYPE_PREMIUM,
+ PCL_PAPERTYPE_GLOSSY,
+ PCL_PAPERTYPE_TRANS,
+ -1,
+ },
+ {
+ -1,
+ },
+ },
+ /* Deskjet 900 series, 1220C, PhotoSmart P1000/P1100 */
+ { 900,
+ 17 * 72 / 2, 14 * 72,
+ 1, 1, /* Min paper size */
+ PCL_RES_150_150 | PCL_RES_300_300 | PCL_RES_600_600 /* | PCL_RES_1200_600 | PCL_RES_2400_600 */,
+ 3, 33, 18, 18,
+ PCL_COLOR_CMYK,
+ PCL_PRINTER_DJ | PCL_PRINTER_NEW_ERG | PCL_PRINTER_TIFF | PCL_PRINTER_MEDIATYPE |
+ PCL_PRINTER_CUSTOM_SIZE | PCL_PRINTER_BLANKLINE,
+ {
+ PCL_PAPERSIZE_EXECUTIVE,
+ PCL_PAPERSIZE_LETTER,
+ PCL_PAPERSIZE_LEGAL,
+ PCL_PAPERSIZE_A5,
+ PCL_PAPERSIZE_A4,
+ PCL_PAPERSIZE_HAGAKI_CARD,
+ PCL_PAPERSIZE_A6_CARD,
+ PCL_PAPERSIZE_4x6,
+ PCL_PAPERSIZE_5x8,
+ PCL_PAPERSIZE_COMMERCIAL10_ENV,
+ PCL_PAPERSIZE_DL_ENV,
+ PCL_PAPERSIZE_C6_ENV,
+ PCL_PAPERSIZE_INVITATION_ENV,
+ -1,
+ },
+ {
+ PCL_PAPERTYPE_PLAIN,
+ PCL_PAPERTYPE_BOND,
+ PCL_PAPERTYPE_PREMIUM,
+ PCL_PAPERTYPE_GLOSSY,
+ PCL_PAPERTYPE_TRANS,
+ -1,
+ },
+ { -1, /* No selectable paper sources */
+ },
+ },
+ /* Deskjet 1220C (or other large format 900) */
+ { 901,
+ 13 * 72, 19 * 72,
+ 1, 1, /* Min paper size */
+ PCL_RES_150_150 | PCL_RES_300_300 | PCL_RES_600_600 /* | PCL_RES_1200_600 | PCL_RES_2400_600 */,
+ 3, 33, 18, 18,
+ PCL_COLOR_CMYK,
+ PCL_PRINTER_DJ | PCL_PRINTER_NEW_ERG | PCL_PRINTER_TIFF | PCL_PRINTER_MEDIATYPE |
+ PCL_PRINTER_CUSTOM_SIZE | PCL_PRINTER_BLANKLINE,
+ {
+ PCL_PAPERSIZE_EXECUTIVE,
+ PCL_PAPERSIZE_LETTER,
+ PCL_PAPERSIZE_LEGAL,
+ PCL_PAPERSIZE_TABLOID,
+ PCL_PAPERSIZE_STATEMENT,
+ PCL_PAPERSIZE_SUPER_B,
+ PCL_PAPERSIZE_A5,
+ PCL_PAPERSIZE_A4,
+ PCL_PAPERSIZE_A3,
+ PCL_PAPERSIZE_JIS_B5,
+ PCL_PAPERSIZE_JIS_B4,
+ PCL_PAPERSIZE_HAGAKI_CARD,
+ PCL_PAPERSIZE_OUFUKU_CARD,
+ PCL_PAPERSIZE_A6_CARD,
+ PCL_PAPERSIZE_4x6,
+ PCL_PAPERSIZE_5x8,
+ PCL_PAPERSIZE_3x5,
+ PCL_PAPERSIZE_HP_CARD,
+ PCL_PAPERSIZE_MONARCH_ENV,
+ PCL_PAPERSIZE_COMMERCIAL10_ENV,
+ PCL_PAPERSIZE_DL_ENV,
+ PCL_PAPERSIZE_C5_ENV,
+ PCL_PAPERSIZE_C6_ENV,
+ PCL_PAPERSIZE_INVITATION_ENV,
+ PCL_PAPERSIZE_JAPANESE_3_ENV,
+ PCL_PAPERSIZE_JAPANESE_4_ENV,
+ PCL_PAPERSIZE_KAKU_ENV,
+ -1,
+ },
+ {
+ PCL_PAPERTYPE_PLAIN,
+ PCL_PAPERTYPE_BOND,
+ PCL_PAPERTYPE_PREMIUM,
+ PCL_PAPERTYPE_GLOSSY,
+ PCL_PAPERTYPE_TRANS,
+ -1,
+ },
+ { -1, /* No selectable paper sources */
+ },
+ },
+ /* Deskjet 1100C, 1120C */
+ { 1100,
+ 13 * 72, 19 * 72,
+ 1, 1, /* Min paper size */
+ PCL_RES_150_150 | PCL_RES_300_300 | PCL_RES_600_600_MONO,
+ 3, 33, 18, 18,
+ PCL_COLOR_CMYK | PCL_COLOR_CMYK4,
+ PCL_PRINTER_DJ | PCL_PRINTER_NEW_ERG | PCL_PRINTER_TIFF | PCL_PRINTER_MEDIATYPE |
+ PCL_PRINTER_CUSTOM_SIZE | PCL_PRINTER_BLANKLINE,
+ {
+ PCL_PAPERSIZE_EXECUTIVE,
+ PCL_PAPERSIZE_LETTER,
+ PCL_PAPERSIZE_LEGAL,
+ PCL_PAPERSIZE_TABLOID,
+ PCL_PAPERSIZE_STATEMENT,
+ PCL_PAPERSIZE_SUPER_B,
+ PCL_PAPERSIZE_A5,
+ PCL_PAPERSIZE_A4,
+ PCL_PAPERSIZE_A3,
+ PCL_PAPERSIZE_JIS_B5,
+ PCL_PAPERSIZE_JIS_B4,
+ PCL_PAPERSIZE_HAGAKI_CARD,
+ PCL_PAPERSIZE_A6_CARD,
+ PCL_PAPERSIZE_4x6,
+ PCL_PAPERSIZE_5x8,
+ PCL_PAPERSIZE_COMMERCIAL10_ENV,
+ PCL_PAPERSIZE_DL_ENV,
+ PCL_PAPERSIZE_C6_ENV,
+ PCL_PAPERSIZE_INVITATION_ENV,
+ PCL_PAPERSIZE_JAPANESE_3_ENV,
+ PCL_PAPERSIZE_JAPANESE_4_ENV,
+ PCL_PAPERSIZE_KAKU_ENV,
+ -1,
+ },
+ {
+ PCL_PAPERTYPE_PLAIN,
+ PCL_PAPERTYPE_BOND,
+ PCL_PAPERTYPE_PREMIUM,
+ PCL_PAPERTYPE_GLOSSY,
+ PCL_PAPERTYPE_TRANS,
+ -1,
+ },
+ {
+ PCL_PAPERSOURCE_STANDARD,
+ PCL_PAPERSOURCE_MANUAL,
+ PCL_PAPERSOURCE_DJ_TRAY,
+ -1,
+ },
+ },
+ /* Deskjet 1200C */
+ { 1200,
+ 17 * 72 / 2, 14 * 72,
+ 1, 1, /* Min paper size */
+ PCL_RES_150_150 | PCL_RES_300_300,
+ 12, 12, 18, 18,
+ PCL_COLOR_CMY,
+ PCL_PRINTER_DJ | PCL_PRINTER_NEW_ERG | PCL_PRINTER_TIFF | PCL_PRINTER_MEDIATYPE |
+ PCL_PRINTER_CUSTOM_SIZE | PCL_PRINTER_BLANKLINE,
+ {
+/* This printer is not mentioned in the Comparison tables,
+ so I'll just pick some likely sizes... */
+ PCL_PAPERSIZE_EXECUTIVE,
+ PCL_PAPERSIZE_LETTER,
+ PCL_PAPERSIZE_LEGAL,
+ PCL_PAPERSIZE_A5,
+ PCL_PAPERSIZE_A4,
+ PCL_PAPERSIZE_4x6,
+ PCL_PAPERSIZE_5x8,
+ -1,
+ },
+ {
+ PCL_PAPERTYPE_PLAIN,
+ PCL_PAPERTYPE_BOND,
+ PCL_PAPERTYPE_PREMIUM,
+ PCL_PAPERTYPE_GLOSSY,
+ PCL_PAPERTYPE_TRANS,
+ -1,
+ },
+ {
+ PCL_PAPERSOURCE_STANDARD,
+ PCL_PAPERSOURCE_MANUAL,
+ PCL_PAPERSOURCE_DJ_TRAY,
+ -1,
+ },
+ },
+ /* Deskjet 1600C */
+ { 1600,
+ 17 * 72 / 2, 14 * 72,
+ 1, 1, /* Min paper size */
+ PCL_RES_150_150 | PCL_RES_300_300,
+ 12, 12, 18, 18,
+ PCL_COLOR_CMYK,
+ PCL_PRINTER_DJ | PCL_PRINTER_NEW_ERG | PCL_PRINTER_TIFF | PCL_PRINTER_MEDIATYPE |
+ PCL_PRINTER_CUSTOM_SIZE | PCL_PRINTER_BLANKLINE,
+ {
+/* This printer is not mentioned in the Comparison tables,
+ so I'll just pick some likely sizes... */
+ PCL_PAPERSIZE_EXECUTIVE,
+ PCL_PAPERSIZE_LETTER,
+ PCL_PAPERSIZE_LEGAL,
+ PCL_PAPERSIZE_A5,
+ PCL_PAPERSIZE_A4,
+ PCL_PAPERSIZE_4x6,
+ PCL_PAPERSIZE_5x8,
+ -1,
+ },
+ {
+ PCL_PAPERTYPE_PLAIN,
+ PCL_PAPERTYPE_BOND,
+ PCL_PAPERTYPE_PREMIUM,
+ PCL_PAPERTYPE_GLOSSY,
+ PCL_PAPERTYPE_TRANS,
+ -1,
+ },
+ {
+ PCL_PAPERSOURCE_STANDARD,
+ PCL_PAPERSOURCE_MANUAL,
+ PCL_PAPERSOURCE_DJ_TRAY,
+ -1,
+ },
+ },
+ /* Deskjet 2000 */
+ { 2000,
+ 17 * 72 / 2, 14 * 72,
+ 1, 1, /* Min paper size */
+ PCL_RES_150_150 | PCL_RES_300_300 | PCL_RES_600_600,
+ 12, 12, 18, 18,
+ PCL_COLOR_CMYK,
+ PCL_PRINTER_DJ | PCL_PRINTER_NEW_ERG | PCL_PRINTER_TIFF | PCL_PRINTER_MEDIATYPE |
+ PCL_PRINTER_CUSTOM_SIZE | PCL_PRINTER_BLANKLINE,
+ {
+ PCL_PAPERSIZE_EXECUTIVE,
+ PCL_PAPERSIZE_LETTER,
+ PCL_PAPERSIZE_LEGAL,
+ PCL_PAPERSIZE_A5,
+ PCL_PAPERSIZE_A4,
+ PCL_PAPERSIZE_HAGAKI_CARD,
+ PCL_PAPERSIZE_A6_CARD,
+ PCL_PAPERSIZE_4x6,
+ PCL_PAPERSIZE_5x8,
+ PCL_PAPERSIZE_3x5,
+ PCL_PAPERSIZE_COMMERCIAL10_ENV,
+ PCL_PAPERSIZE_DL_ENV,
+ PCL_PAPERSIZE_C6_ENV,
+ PCL_PAPERSIZE_INVITATION_ENV,
+ -1,
+ },
+ {
+ PCL_PAPERTYPE_PLAIN,
+ PCL_PAPERTYPE_BOND,
+ PCL_PAPERTYPE_PREMIUM,
+ PCL_PAPERTYPE_GLOSSY,
+ PCL_PAPERTYPE_TRANS,
+ PCL_PAPERTYPE_QPHOTO,
+ PCL_PAPERTYPE_QTRANS,
+ -1,
+ },
+ {
+ PCL_PAPERSOURCE_STANDARD,
+ PCL_PAPERSOURCE_MANUAL,
+ PCL_PAPERSOURCE_DJ_TRAY,
+ -1,
+ },
+ },
+ /* Deskjet 2500 */
+ { 2500,
+ 13 * 72, 19 * 72,
+ 1, 1, /* Min paper size */
+ PCL_RES_150_150 | PCL_RES_300_300 | PCL_RES_600_600,
+ 12, 12, 18, 18,
+ PCL_COLOR_CMYK,
+ PCL_PRINTER_DJ | PCL_PRINTER_NEW_ERG | PCL_PRINTER_TIFF | PCL_PRINTER_MEDIATYPE |
+ PCL_PRINTER_CUSTOM_SIZE | PCL_PRINTER_BLANKLINE,
+ {
+ PCL_PAPERSIZE_EXECUTIVE,
+ PCL_PAPERSIZE_LETTER,
+ PCL_PAPERSIZE_LEGAL,
+ PCL_PAPERSIZE_TABLOID,
+ PCL_PAPERSIZE_STATEMENT,
+ PCL_PAPERSIZE_A5,
+ PCL_PAPERSIZE_A4,
+ PCL_PAPERSIZE_A3,
+ PCL_PAPERSIZE_JIS_B5,
+ PCL_PAPERSIZE_JIS_B4,
+ PCL_PAPERSIZE_HAGAKI_CARD,
+ PCL_PAPERSIZE_A6_CARD,
+ PCL_PAPERSIZE_4x6,
+ PCL_PAPERSIZE_5x8,
+ PCL_PAPERSIZE_COMMERCIAL10_ENV,
+ PCL_PAPERSIZE_DL_ENV,
+ -1,
+ },
+ {
+ PCL_PAPERTYPE_PLAIN,
+ PCL_PAPERTYPE_BOND,
+ PCL_PAPERTYPE_PREMIUM,
+ PCL_PAPERTYPE_GLOSSY,
+ PCL_PAPERTYPE_TRANS,
+ PCL_PAPERTYPE_QPHOTO,
+ PCL_PAPERTYPE_QTRANS,
+ -1,
+ },
+ {
+ PCL_PAPERSOURCE_STANDARD,
+ PCL_PAPERSOURCE_MANUAL,
+ PCL_PAPERSOURCE_DJ_AUTO,
+ PCL_PAPERSOURCE_DJ_TRAY,
+ PCL_PAPERSOURCE_DJ_TRAY2,
+ PCL_PAPERSOURCE_DJ_OPTIONAL,
+ -1,
+ },
+ },
+ /* LaserJet II series */
+ { 2,
+ 17 * 72 / 2, 14 * 72,
+ 1, 1, /* Min paper size */
+ PCL_RES_150_150 | PCL_RES_300_300,
+ 12, 12, 18, 18,
+ PCL_COLOR_NONE,
+ PCL_PRINTER_LJ,
+ {
+ PCL_PAPERSIZE_EXECUTIVE,
+ PCL_PAPERSIZE_STATEMENT,
+ PCL_PAPERSIZE_LETTER,
+ PCL_PAPERSIZE_LEGAL,
+ PCL_PAPERSIZE_A4,
+ PCL_PAPERSIZE_MONARCH_ENV,
+ PCL_PAPERSIZE_COMMERCIAL10_ENV,
+ PCL_PAPERSIZE_DL_ENV,
+ PCL_PAPERSIZE_C5_ENV,
+ PCL_PAPERSIZE_C6_ENV,
+ -1,
+ },
+ { -1, /* No selectable paper types */
+ },
+ {
+ PCL_PAPERSOURCE_STANDARD,
+ PCL_PAPERSOURCE_MANUAL,
+ PCL_PAPERSOURCE_LJ_TRAY1,
+ PCL_PAPERSOURCE_LJ_TRAY2,
+ PCL_PAPERSOURCE_LJ_TRAY3,
+ PCL_PAPERSOURCE_LJ_TRAY4,
+ -1,
+ },
+ },
+ /* LaserJet III series */
+ { 3,
+ 17 * 72 / 2, 14 * 72,
+ 1, 1, /* Min paper size */
+ PCL_RES_150_150 | PCL_RES_300_300,
+ 12, 12, 18, 18,
+ PCL_COLOR_NONE,
+ PCL_PRINTER_LJ | PCL_PRINTER_TIFF | PCL_PRINTER_BLANKLINE,
+ {
+ PCL_PAPERSIZE_EXECUTIVE,
+ PCL_PAPERSIZE_STATEMENT,
+ PCL_PAPERSIZE_LETTER,
+ PCL_PAPERSIZE_LEGAL,
+ PCL_PAPERSIZE_A4,
+ PCL_PAPERSIZE_MONARCH_ENV,
+ PCL_PAPERSIZE_COMMERCIAL10_ENV,
+ PCL_PAPERSIZE_DL_ENV,
+ PCL_PAPERSIZE_C5_ENV,
+ PCL_PAPERSIZE_C6_ENV,
+ -1,
+ },
+ { -1, /* No selectable paper types */
+ },
+ {
+ PCL_PAPERSOURCE_STANDARD,
+ PCL_PAPERSOURCE_MANUAL,
+ PCL_PAPERSOURCE_LJ_TRAY1,
+ PCL_PAPERSOURCE_LJ_TRAY2,
+ PCL_PAPERSOURCE_LJ_TRAY3,
+ PCL_PAPERSOURCE_LJ_TRAY4,
+ -1,
+ },
+ },
+ /* LaserJet 4L */
+ { 4,
+ 17 * 72 / 2, 14 * 72,
+ 1, 1, /* Min paper size */
+ PCL_RES_150_150 | PCL_RES_300_300,
+ 12, 12, 18, 18,
+ PCL_COLOR_NONE,
+ PCL_PRINTER_LJ | PCL_PRINTER_NEW_ERG | PCL_PRINTER_TIFF | PCL_PRINTER_BLANKLINE,
+ {
+ PCL_PAPERSIZE_EXECUTIVE,
+ PCL_PAPERSIZE_STATEMENT,
+ PCL_PAPERSIZE_LETTER,
+ PCL_PAPERSIZE_LEGAL,
+ PCL_PAPERSIZE_A4,
+ PCL_PAPERSIZE_MONARCH_ENV,
+ PCL_PAPERSIZE_COMMERCIAL10_ENV,
+ PCL_PAPERSIZE_DL_ENV,
+ PCL_PAPERSIZE_C5_ENV,
+ PCL_PAPERSIZE_C6_ENV,
+ -1,
+ },
+ { -1, /* No selectable paper types */
+ },
+ {
+ PCL_PAPERSOURCE_STANDARD,
+ PCL_PAPERSOURCE_MANUAL,
+ PCL_PAPERSOURCE_LJ_TRAY1,
+ PCL_PAPERSOURCE_LJ_TRAY2,
+ PCL_PAPERSOURCE_LJ_TRAY3,
+ PCL_PAPERSOURCE_LJ_TRAY4,
+ -1,
+ },
+ },
+ /* LaserJet 4V, 4Si */
+ { 5,
+ 13 * 72, 19 * 72,
+ 1, 1, /* Min paper size */
+ PCL_RES_150_150 | PCL_RES_300_300 | PCL_RES_600_600,
+ 12, 12, 18, 18,
+ PCL_COLOR_NONE,
+ PCL_PRINTER_LJ | PCL_PRINTER_NEW_ERG | PCL_PRINTER_TIFF | PCL_PRINTER_BLANKLINE,
+ {
+ PCL_PAPERSIZE_EXECUTIVE,
+ PCL_PAPERSIZE_STATEMENT,
+ PCL_PAPERSIZE_LETTER,
+ PCL_PAPERSIZE_LEGAL,
+ PCL_PAPERSIZE_TABLOID,
+ PCL_PAPERSIZE_A5,
+ PCL_PAPERSIZE_A4,
+ PCL_PAPERSIZE_A3,
+ PCL_PAPERSIZE_JIS_B5,
+ PCL_PAPERSIZE_JIS_B4, /* Guess */
+ PCL_PAPERSIZE_4x6,
+ PCL_PAPERSIZE_5x8,
+ PCL_PAPERSIZE_MONARCH_ENV,
+ PCL_PAPERSIZE_COMMERCIAL10_ENV,
+ PCL_PAPERSIZE_DL_ENV,
+ PCL_PAPERSIZE_C5_ENV,
+ PCL_PAPERSIZE_C6_ENV,
+ -1,
+ },
+ { -1, /* No selectable paper types */
+ },
+ {
+ PCL_PAPERSOURCE_STANDARD,
+ PCL_PAPERSOURCE_MANUAL,
+ PCL_PAPERSOURCE_LJ_TRAY1,
+ PCL_PAPERSOURCE_LJ_TRAY2,
+ PCL_PAPERSOURCE_LJ_TRAY3,
+ PCL_PAPERSOURCE_LJ_TRAY4,
+ -1,
+ },
+ },
+ /* LaserJet 4 series (except as above), 5 series, 6 series */
+ { 6,
+ 17 * 72 / 2, 14 * 72,
+ 1, 1, /* Min paper size */
+ PCL_RES_150_150 | PCL_RES_300_300 | PCL_RES_600_600,
+ 12, 12, 18, 18,
+ PCL_COLOR_NONE,
+ PCL_PRINTER_LJ | PCL_PRINTER_NEW_ERG | PCL_PRINTER_TIFF | PCL_PRINTER_BLANKLINE,
+ {
+ PCL_PAPERSIZE_EXECUTIVE,
+ PCL_PAPERSIZE_STATEMENT,
+ PCL_PAPERSIZE_LETTER,
+ PCL_PAPERSIZE_LEGAL,
+ PCL_PAPERSIZE_A4,
+ PCL_PAPERSIZE_MONARCH_ENV,
+ PCL_PAPERSIZE_COMMERCIAL10_ENV,
+ PCL_PAPERSIZE_DL_ENV,
+ PCL_PAPERSIZE_C5_ENV,
+ PCL_PAPERSIZE_C6_ENV,
+ -1,
+ },
+ { -1, /* No selectable paper types */
+ },
+ {
+ PCL_PAPERSOURCE_STANDARD,
+ PCL_PAPERSOURCE_MANUAL,
+ PCL_PAPERSOURCE_LJ_TRAY1,
+ PCL_PAPERSOURCE_LJ_TRAY2,
+ PCL_PAPERSOURCE_LJ_TRAY3,
+ PCL_PAPERSOURCE_LJ_TRAY4,
+ -1,
+ },
+ },
+ /* LaserJet 5Si */
+ { 7,
+ 13 * 72, 19 * 72,
+ 1, 1, /* Min paper size */
+ PCL_RES_150_150 | PCL_RES_300_300 | PCL_RES_600_600,
+ 12, 12, 18, 18,
+ PCL_COLOR_NONE,
+ PCL_PRINTER_LJ | PCL_PRINTER_NEW_ERG | PCL_PRINTER_TIFF | PCL_PRINTER_BLANKLINE,
+ {
+ PCL_PAPERSIZE_EXECUTIVE,
+ PCL_PAPERSIZE_STATEMENT,
+ PCL_PAPERSIZE_LETTER,
+ PCL_PAPERSIZE_LEGAL,
+ PCL_PAPERSIZE_TABLOID,
+ PCL_PAPERSIZE_A5,
+ PCL_PAPERSIZE_A4,
+ PCL_PAPERSIZE_A3,
+ PCL_PAPERSIZE_JIS_B5,
+ PCL_PAPERSIZE_JIS_B4, /* Guess */
+ PCL_PAPERSIZE_4x6,
+ PCL_PAPERSIZE_5x8,
+ PCL_PAPERSIZE_MONARCH_ENV,
+ PCL_PAPERSIZE_COMMERCIAL10_ENV,
+ PCL_PAPERSIZE_DL_ENV,
+ PCL_PAPERSIZE_C5_ENV,
+ PCL_PAPERSIZE_C6_ENV,
+ -1,
+ },
+ { -1, /* No selectable paper types */
+ },
+ {
+ PCL_PAPERSOURCE_STANDARD,
+ PCL_PAPERSOURCE_MANUAL,
+ PCL_PAPERSOURCE_LJ_TRAY1,
+ PCL_PAPERSOURCE_LJ_TRAY2,
+ PCL_PAPERSOURCE_LJ_TRAY3,
+ PCL_PAPERSOURCE_LJ_TRAY4,
+ -1,
+ },
+ },
+};
+
+
+static const double sat_adjustment[49] =
+{
+ 1.0, /* C */
+ 1.1,
+ 1.2,
+ 1.3,
+ 1.4,
+ 1.5,
+ 1.6,
+ 1.7,
+ 1.8, /* B */
+ 1.9,
+ 1.9,
+ 1.9,
+ 1.7,
+ 1.5,
+ 1.3,
+ 1.1,
+ 1.0, /* M */
+ 1.0,
+ 1.0,
+ 1.0,
+ 1.0,
+ 1.0,
+ 1.0,
+ 1.0,
+ 1.0, /* R */
+ 1.0,
+ 1.0,
+ 1.0,
+ 1.0,
+ 1.0,
+ 1.0,
+ 1.0,
+ 1.0, /* Y */
+ 1.0,
+ 1.0,
+ 1.1,
+ 1.2,
+ 1.3,
+ 1.4,
+ 1.5,
+ 1.5, /* G */
+ 1.4,
+ 1.3,
+ 1.2,
+ 1.1,
+ 1.0,
+ 1.0,
+ 1.0,
+ 1.0 /* C */
+};
+
+static const double lum_adjustment[49] =
+{
+ 0.50, /* C */
+ 0.6,
+ 0.7,
+ 0.8,
+ 0.9,
+ 0.86,
+ 0.82,
+ 0.79,
+ 0.78, /* B */
+ 0.8,
+ 0.83,
+ 0.87,
+ 0.9,
+ 0.95,
+ 1.05,
+ 1.15,
+ 1.3, /* M */
+ 1.25,
+ 1.2,
+ 1.15,
+ 1.12,
+ 1.09,
+ 1.06,
+ 1.03,
+ 1.0, /* R */
+ 1.0,
+ 1.0,
+ 1.0,
+ 1.0,
+ 1.0,
+ 1.0,
+ 1.0,
+ 1.0, /* Y */
+ 0.9,
+ 0.8,
+ 0.7,
+ 0.65,
+ 0.6,
+ 0.55,
+ 0.52,
+ 0.48, /* G */
+ 0.47,
+ 0.47,
+ 0.49,
+ 0.49,
+ 0.49,
+ 0.52,
+ 0.51,
+ 0.50 /* C */
+};
+
+static const double hue_adjustment[49] =
+{
+ 0.00, /* C */
+ 0.05,
+ 0.04,
+ 0.01,
+ -0.03,
+ -0.10,
+ -0.18,
+ -0.26,
+ -0.35, /* B */
+ -0.43,
+ -0.40,
+ -0.32,
+ -0.25,
+ -0.18,
+ -0.10,
+ -0.07,
+ 0.00, /* M */
+ -0.04,
+ -0.09,
+ -0.13,
+ -0.18,
+ -0.23,
+ -0.27,
+ -0.31,
+ -0.35, /* R */
+ -0.38,
+ -0.30,
+ -0.23,
+ -0.15,
+ -0.08,
+ 0.00,
+ -0.02,
+ 0.00, /* Y */
+ 0.08,
+ 0.10,
+ 0.08,
+ 0.05,
+ 0.03,
+ -0.03,
+ -0.12,
+ -0.20, /* G */
+ -0.17,
+ -0.20,
+ -0.17,
+ -0.15,
+ -0.12,
+ -0.10,
+ -0.08,
+ 0.00, /* C */
+};
+
+/*
+ * Convert a name into it's option value
+ */
+
+static int pcl_string_to_val(const char *string, /* I: String */
+ const pcl_t *options, /* I: Options */
+ int num_options) /* I: Num options */
+{
+
+ int i;
+ int code = -1;
+
+ /*
+ * Look up the string in the table and convert to the code.
+ */
+
+ for (i=0; i<num_options; i++) {
+ if (!strcmp(string, options[i].pcl_name)) {
+ code=options[i].pcl_code;
+ break;
+ }
+ }
+
+ stp_deprintf(STP_DBG_PCL, "String: %s, Code: %d\n", string, code);
+
+ return(code);
+}
+
+/*
+ * Convert a value into it's option name
+ */
+
+static const char * pcl_val_to_string(int code, /* I: Code */
+ const pcl_t *options, /* I: Options */
+ int num_options) /* I: Num options */
+{
+
+ int i;
+ const char *string = NULL;
+
+ /*
+ * Look up the code in the table and convert to the string.
+ */
+
+ for (i=0; i<num_options; i++) {
+ if (code == options[i].pcl_code) {
+ string=options[i].pcl_name;
+ break;
+ }
+ }
+
+ stp_deprintf(STP_DBG_PCL, "Code: %d, String: %s\n", code, string);
+
+ return(string);
+}
+
+static const char * pcl_val_to_text(int code, /* I: Code */
+ const pcl_t *options, /* I: Options */
+ int num_options) /* I: Num options */
+{
+
+ int i;
+ const char *string = NULL;
+
+ /*
+ * Look up the code in the table and convert to the string.
+ */
+
+ for (i=0; i<num_options; i++) {
+ if (code == options[i].pcl_code) {
+ string=options[i].pcl_text;
+ break;
+ }
+ }
+
+ stp_deprintf(STP_DBG_PCL, "Code: %d, String: %s\n", code, string);
+
+ return(string);
+}
+
+static const double dot_sizes[] = { 0.5, 0.832, 1.0 };
+static const stp_simple_dither_range_t variable_dither_ranges[] =
+{
+ { 0.152, 0x1, 0 },
+ { 0.255, 0x2, 0 },
+ { 0.38, 0x3, 0 },
+ { 0.5, 0x1, 1 },
+ { 0.67, 0x2, 1 },
+ { 1.0, 0x3, 1 }
+};
+
+/*
+ * pcl_get_model_capabilities() - Return struct of model capabilities
+ */
+
+static const pcl_cap_t * /* O: Capabilities */
+pcl_get_model_capabilities(int model) /* I: Model */
+{
+ int i;
+ int models= sizeof(pcl_model_capabilities) / sizeof(pcl_cap_t);
+ for (i=0; i<models; i++) {
+ if (pcl_model_capabilities[i].model == model) {
+ return &(pcl_model_capabilities[i]);
+ }
+ }
+ stp_erprintf("pcl: model %d not found in capabilities list.\n",model);
+ return &(pcl_model_capabilities[0]);
+}
+
+static char *
+c_strdup(const char *s)
+{
+ char *ret = stp_malloc(strlen(s) + 1);
+ strcpy(ret, s);
+ return ret;
+}
+
+/*
+ * Convert Media size name into PCL media code for printer
+ */
+
+static int pcl_convert_media_size(const char *media_size, /* I: Media size string */
+ int model) /* I: model number */
+{
+
+ int i;
+ int media_code = 0;
+ const pcl_cap_t *caps;
+
+ /*
+ * First look up the media size in the table and convert to the code.
+ */
+
+ media_code = pcl_string_to_val(media_size, pcl_media_sizes,
+ sizeof(pcl_media_sizes) / sizeof(pcl_t));
+
+ stp_deprintf(STP_DBG_PCL, "Media Size: %s, Code: %d\n", media_size, media_code);
+
+ /*
+ * Now see if the printer supports the code found.
+ */
+
+ if (media_code != -1) {
+ caps = pcl_get_model_capabilities(model);
+
+ for (i=0; (i<NUM_PRINTER_PAPER_SIZES) && (caps->paper_sizes[i] != -1); i++) {
+ if (media_code == caps->paper_sizes[i])
+ return(media_code); /* Is supported */
+ }
+
+ stp_deprintf(STP_DBG_PCL, "Media Code %d not supported by printer model %d.\n",
+ media_code, model);
+ return(-1); /* Not supported */
+ }
+ else
+ return(-1); /* Not supported */
+}
+
+
+static stp_param_t ink_types[] =
+{
+ { "CMYK", N_ ("Color + Black Cartridges") },
+ { "Photo", N_ ("Color + Photo Cartridges") }
+};
+
+
+/*
+ * 'pcl_papersize_valid()' - Is the paper size valid for this printer.
+ */
+
+static const int
+pcl_papersize_valid(const stp_papersize_t pt,
+ int model)
+{
+
+ const pcl_cap_t *caps = pcl_get_model_capabilities(model);
+
+#ifdef PCL_NO_CUSTOM_PAPERSIZES
+ int use_custom = 0;
+#else
+ int use_custom = ((caps->stp_printer_type & PCL_PRINTER_CUSTOM_SIZE)
+ == PCL_PRINTER_CUSTOM_SIZE);
+#endif
+
+ unsigned int pwidth = stp_papersize_get_width(pt);
+ unsigned int pheight = stp_papersize_get_height(pt);
+
+/*
+ * This function decides whether a paper size is allowed for the
+ * current printer. The DeskJet feed mechanisms set a minimum and
+ * maximum size for the paper, BUT some of the directly supported
+ * media sizes are less than this minimum (eg card and envelopes)
+ * So, we allow supported sizes though, but clamp custom sizes
+ * to the min and max sizes.
+ */
+
+/*
+ * Is it a valid name?
+ */
+
+ if (strlen(stp_papersize_get_name(pt)) <= 0)
+ return(0);
+
+/*
+ * Is it a recognised supported name?
+ */
+
+ if (pcl_convert_media_size(stp_papersize_get_name(pt), model) != -1)
+ return(1);
+
+/*
+ * If we are not allowed to use custom paper sizes, we are done
+ */
+
+ if (use_custom == 0)
+ return(0);
+
+/*
+ * We are allowed custom paper sizes. Check that the size is within
+ * limits.
+ */
+
+ if (pwidth <= caps->custom_max_width &&
+ pheight <= caps->custom_max_height &&
+ (pheight >= caps->custom_min_height || pheight == 0) &&
+ (pwidth >= caps->custom_min_width || pwidth == 0))
+ return(1);
+
+ return(0);
+}
+
+/*
+ * 'pcl_parameters()' - Return the parameter values for the given parameter.
+ */
+
+static stp_param_t * /* O - Parameter values */
+pcl_parameters(const stp_printer_t printer,/* I - Printer model */
+ const char *ppd_file, /* I - PPD file (not used) */
+ const char *name, /* I - Name of parameter */
+ int *count) /* O - Number of values */
+{
+ int model = stp_printer_get_model(printer);
+ int i;
+ stp_param_t *valptrs;
+ const pcl_cap_t *caps;
+
+ if (count == NULL)
+ return (NULL);
+
+ *count = 0;
+
+ if (name == NULL)
+ return (NULL);
+
+ stp_deprintf(STP_DBG_PCL, "pcl_parameters(): Name = %s\n", name);
+
+ caps = pcl_get_model_capabilities(model);
+
+ stp_deprintf(STP_DBG_PCL, "Printer model = %d\n", model);
+ stp_deprintf(STP_DBG_PCL, "PageWidth = %d, PageHeight = %d\n", caps->custom_max_width, caps->custom_max_height);
+ stp_deprintf(STP_DBG_PCL, "MinPageWidth = %d, MinPageHeight = %d\n", caps->custom_min_width, caps->custom_min_height);
+ stp_deprintf(STP_DBG_PCL, "Margins: top = %d, bottom = %d, left = %d, right = %d\n",
+ caps->top_margin, caps->bottom_margin, caps->left_margin, caps->right_margin);
+ stp_deprintf(STP_DBG_PCL, "Resolutions: %d\n", caps->resolutions);
+ stp_deprintf(STP_DBG_PCL, "ColorType = %d, PrinterType = %d\n", caps->color_type, caps->stp_printer_type);
+
+ if (strcmp(name, "PageSize") == 0)
+ {
+ int papersizes = stp_known_papersizes();
+ valptrs = stp_malloc(sizeof(stp_param_t) * papersizes);
+ *count = 0;
+ for (i = 0; i < papersizes; i++)
+ {
+ const stp_papersize_t pt = stp_get_papersize_by_index(i);
+ if (strlen(stp_papersize_get_name(pt)) > 0)
+ {
+ if (pcl_papersize_valid(pt, model))
+ {
+ valptrs[*count].name = c_strdup(stp_papersize_get_name(pt));
+ valptrs[*count].text = c_strdup(stp_papersize_get_text(pt));
+ (*count)++;
+ }
+ }
+ }
+ return (valptrs);
+ }
+ else if (strcmp(name, "MediaType") == 0)
+ {
+ if (caps->paper_types[0] == -1)
+ {
+ *count = 0;
+ return (NULL);
+ }
+ else
+ {
+ valptrs = stp_malloc(sizeof(stp_param_t) * NUM_PRINTER_PAPER_TYPES);
+ *count = 0;
+ for (i=0; (i < NUM_PRINTER_PAPER_TYPES) && (caps->paper_types[i] != -1); i++)
+ {
+ valptrs[i].name = c_strdup(pcl_val_to_string(caps->paper_types[i],
+ pcl_media_types,
+ NUM_PRINTER_PAPER_TYPES));
+ valptrs[i].text = c_strdup(pcl_val_to_text(caps->paper_types[i],
+ pcl_media_types,
+ NUM_PRINTER_PAPER_TYPES));
+ (*count)++;
+ }
+ return(valptrs);
+ }
+ }
+ else if (strcmp(name, "InputSlot") == 0)
+ {
+ if (caps->paper_sources[0] == -1)
+ {
+ *count = 0;
+ return (NULL);
+ }
+ else
+ {
+ valptrs = stp_malloc(sizeof(stp_param_t) * NUM_PRINTER_PAPER_SOURCES);
+ *count = 0;
+ for (i=0; (i < NUM_PRINTER_PAPER_SOURCES) && (caps->paper_sources[i] != -1); i++)
+ {
+ valptrs[i].name = c_strdup(pcl_val_to_string(caps->paper_sources[i],
+ pcl_media_sources,
+ NUM_PRINTER_PAPER_SOURCES));
+ valptrs[i].text = c_strdup(pcl_val_to_text(caps->paper_sources[i],
+ pcl_media_sources,
+ NUM_PRINTER_PAPER_SOURCES));
+ (*count)++;
+ }
+ return(valptrs);
+ }
+ }
+ else if (strcmp(name, "Resolution") == 0)
+ {
+ *count = 0;
+ valptrs = stp_malloc(sizeof(stp_param_t) * NUM_RESOLUTIONS);
+ for (i = 0; i < NUM_RESOLUTIONS; i++)
+ {
+ if (caps->resolutions & pcl_resolutions[i].pcl_code)
+ {
+ valptrs[*count].name = c_strdup(pcl_val_to_string(pcl_resolutions[i].pcl_code,
+ pcl_resolutions, NUM_RESOLUTIONS));
+ valptrs[*count].text = c_strdup(pcl_val_to_text(pcl_resolutions[i].pcl_code,
+ pcl_resolutions, NUM_RESOLUTIONS));
+ (*count)++;
+ }
+ }
+ return(valptrs);
+ }
+ else if (strcmp(name, "InkType") == 0)
+ {
+ if (caps->color_type & PCL_COLOR_CMYKcm)
+ {
+ valptrs = stp_malloc(sizeof(stp_param_t) * 2);
+ valptrs[0].name = c_strdup(ink_types[0].name);
+ valptrs[0].text = c_strdup(_(ink_types[0].text));
+ valptrs[1].name = c_strdup(ink_types[1].name);
+ valptrs[1].text = c_strdup(_(ink_types[1].text));
+ *count = 2;
+ return(valptrs);
+ }
+ else
+ return(NULL);
+ }
+ else
+ return (NULL);
+}
+
+static const char *
+pcl_default_parameters(const stp_printer_t printer,
+ const char *ppd_file,
+ const char *name)
+{
+ int model = stp_printer_get_model(printer);
+ int i;
+ const pcl_cap_t *caps;
+
+ if (name == NULL)
+ return (NULL);
+
+ stp_deprintf(STP_DBG_PCL, "pcl_default_parameters(): Name = %s\n", name);
+
+ caps = pcl_get_model_capabilities(model);
+
+ stp_deprintf(STP_DBG_PCL, "Printer model = %d\n", model);
+ stp_deprintf(STP_DBG_PCL, "PageWidth = %d, PageHeight = %d\n", caps->custom_max_width, caps->custom_max_height);
+ stp_deprintf(STP_DBG_PCL, "MinPageWidth = %d, MinPageHeight = %d\n", caps->custom_min_width, caps->custom_min_height);
+ stp_deprintf(STP_DBG_PCL, "Margins: top = %d, bottom = %d, left = %d, right = %d\n",
+ caps->top_margin, caps->bottom_margin, caps->left_margin, caps->right_margin);
+ stp_deprintf(STP_DBG_PCL, "Resolutions: %d\n", caps->resolutions);
+ stp_deprintf(STP_DBG_PCL, "ColorType = %d, PrinterType = %d\n", caps->color_type, caps->stp_printer_type);
+
+ if (strcmp(name, "PageSize") == 0)
+ {
+ int papersizes = stp_known_papersizes();
+ for (i = 0; i < papersizes; i++)
+ {
+ const stp_papersize_t pt = stp_get_papersize_by_index(i);
+ if (strlen(stp_papersize_get_name(pt)) > 0 &&
+ pcl_papersize_valid(pt, model))
+ {
+ return (stp_papersize_get_name(pt));
+ }
+ }
+ return NULL;
+ }
+ else if (strcmp(name, "MediaType") == 0)
+ {
+ if (caps->paper_types[0] == -1)
+ {
+ return (NULL);
+ }
+ else
+ {
+ return (pcl_val_to_string(caps->paper_types[0], pcl_media_types,
+ NUM_PRINTER_PAPER_TYPES));
+ }
+ }
+ else if (strcmp(name, "InputSlot") == 0)
+ {
+ if (caps->paper_sources[0] == -1)
+ {
+ return (NULL);
+ }
+ else
+ {
+ return (pcl_val_to_string(caps->paper_sources[0], pcl_media_sources,
+ NUM_PRINTER_PAPER_SOURCES));
+ }
+ }
+ else if (strcmp(name, "Resolution") == 0)
+ {
+ for (i = 0; i < NUM_RESOLUTIONS; i++)
+ {
+ if ((caps->resolutions & pcl_resolutions[i].pcl_code) &&
+ (pcl_resolutions[i].pcl_code >= PCL_RES_300_300))
+ {
+ return (pcl_val_to_string(pcl_resolutions[i].pcl_code,
+ pcl_resolutions, NUM_RESOLUTIONS));
+ }
+ }
+ /* If printer can't handle at least 300x300, look for anything that */
+ /* works */
+ for (i = 0; i < NUM_RESOLUTIONS; i++)
+ {
+ if ((caps->resolutions & pcl_resolutions[i].pcl_code))
+ {
+ return (pcl_val_to_string(pcl_resolutions[i].pcl_code,
+ pcl_resolutions, NUM_RESOLUTIONS));
+ }
+ }
+ return NULL;
+ }
+ else if (strcmp(name, "InkType") == 0)
+ {
+ if (caps->color_type & PCL_COLOR_CMYKcm)
+ {
+ return (ink_types[0].name);
+ }
+ else
+ return(NULL);
+ }
+ else
+ return (NULL);
+}
+
+
+/*
+ * 'pcl_imageable_area()' - Return the imageable area of the page.
+ */
+
+static void
+pcl_imageable_area(const stp_printer_t printer, /* I - Printer model */
+ const stp_vars_t v, /* I */
+ int *left, /* O - Left position in points */
+ int *right, /* O - Right position in points */
+ int *bottom, /* O - Bottom position in points */
+ int *top) /* O - Top position in points */
+{
+ int width, height; /* Size of page */
+ const pcl_cap_t *caps; /* Printer caps */
+
+ caps = pcl_get_model_capabilities(stp_printer_get_model(printer));
+
+ stp_default_media_size(printer, v, &width, &height);
+
+/*
+ * Note: The margins actually vary with paper size, but since you can
+ * move the image around on the page anyway, it hardly matters.
+ */
+
+ *left = caps->left_margin;
+ *right = width - caps->right_margin;
+ *top = height - caps->top_margin;
+ *bottom = caps->bottom_margin;
+}
+
+static void
+pcl_limit(const stp_printer_t printer, /* I - Printer model */
+ const stp_vars_t v, /* I */
+ int *width,
+ int *height,
+ int *min_width,
+ int *min_height)
+{
+ const pcl_cap_t *caps= pcl_get_model_capabilities(stp_printer_get_model(printer));
+ *width = caps->custom_max_width;
+ *height = caps->custom_max_height;
+ *min_width = caps->custom_min_width;
+ *min_height = caps->custom_min_height;
+}
+
+/*
+ * 'pcl_print()' - Print an image to an HP printer.
+ */
+
+static void
+pcl_print(const stp_printer_t printer, /* I - Model */
+ stp_image_t *image, /* I - Image to print */
+ const stp_vars_t v)
+{
+ int i;
+ unsigned char *cmap = stp_get_cmap(v);
+ int model = stp_printer_get_model(printer);
+ const char *resolution = stp_get_resolution(v);
+ const char *media_size;
+ const char *media_type = stp_get_media_type(v);
+ const char *media_source = stp_get_media_source(v);
+ const char *ink_type = stp_get_ink_type(v);
+ int output_type = stp_get_output_type(v);
+ int orientation = stp_get_orientation(v);
+ double scaling = stp_get_scaling(v);
+ int top = stp_get_top(v);
+ int left = stp_get_left(v);
+ int y; /* Looping vars */
+ int xdpi, ydpi; /* Resolution */
+ unsigned short *out;
+ unsigned char *in, /* Input pixels */
+ *black, /* Black bitmap data */
+ *cyan, /* Cyan bitmap data */
+ *magenta, /* Magenta bitmap data */
+ *yellow, /* Yellow bitmap data */
+ *lcyan, /* Light Cyan bitmap data */
+ *lmagenta; /* Light Magenta bitmap data */
+ int page_left, /* Left margin of page */
+ page_right, /* Right margin of page */
+ page_top, /* Top of page */
+ page_bottom, /* Bottom of page */
+ page_width, /* Width of page */
+ page_height, /* Height of page */
+ out_width, /* Width of image on page */
+ out_height, /* Height of image on page */
+ out_bpp, /* Output bytes per pixel */
+ height, /* Height of raster data */
+ errdiv, /* Error dividend */
+ errmod, /* Error modulus */
+ errval, /* Current error value */
+ errline, /* Current raster line */
+ errlast; /* Last raster line loaded */
+ stp_convert_t colorfunc; /* Color conversion function... */
+ int zero_mask;
+ void (*writefunc)(const stp_vars_t, unsigned char *, int, int);
+ /* PCL output function */
+ int image_height,
+ image_width,
+ image_bpp;
+ void * dither;
+ const pcl_cap_t *caps; /* Printer capabilities */
+ int do_cret, /* 300 DPI CRet printing */
+ do_cretb, /* 600 DPI CRet printing HP 840C*/
+ do_6color, /* CMY + cmK printing */
+ planes; /* # of output planes */
+ int pcl_media_size, /* PCL media size code */
+ pcl_media_type, /* PCL media type code */
+ pcl_media_source; /* PCL media source code */
+ const double *dot_sizes_use,dot_sizes_cret[]={1.0,1.0,1.0}; /* The dot size used */
+ stp_vars_t nv = stp_allocate_copy(v);
+ stp_papersize_t pp;
+ int len_c, /* Active length of Cyan buffers */
+ len_lc, /* Ditto Light Cyan */
+ len_m, /* Ditto Magenta */
+ len_lm, /* Ditto Light Magenta */
+ len_y, /* Ditto Cyan */
+ len_k; /* Ditto Black */
+ int blank_lines, /* Accumulated blank lines */
+ is_blank, /* Current line is blank */
+ do_blank; /* Blank line removal required */
+
+ if (!stp_get_verified(nv))
+ {
+ stp_eprintf(nv, "Print options not verified; cannot print.\n");
+ return;
+ }
+
+ caps = pcl_get_model_capabilities(model);
+
+ /*
+ * Setup a read-only pixel region for the entire image...
+ */
+
+ image->init(image);
+ image_height = image->height(image);
+ image_width = image->width(image);
+ image_bpp = image->bpp(image);
+
+ /*
+ * Figure out the output resolution...
+ */
+
+ xdpi = 0;
+ ydpi = 0;
+ for (i = 0; i < NUM_RESOLUTIONS; i++)
+ {
+ if (!strcmp(resolution, pcl_resolutions[i].pcl_name))
+ {
+ xdpi = pcl_resolutions[i].p0;
+ ydpi = pcl_resolutions[i].p1;
+ break;
+ }
+ }
+
+ stp_deprintf(STP_DBG_PCL,"pcl: resolution=%dx%d\n",xdpi,ydpi);
+ if (xdpi == 0 || ydpi == 0)
+ return;
+
+ /*
+ * Choose the correct color conversion function...
+ */
+ if (((caps->resolutions & PCL_RES_600_600_MONO) == PCL_RES_600_600_MONO) &&
+ output_type != OUTPUT_GRAY && output_type != OUTPUT_MONOCHROME &&
+ xdpi == 600 && ydpi == 600)
+ {
+ stp_eprintf(v, "600x600 resolution only available in MONO\n");
+ output_type = OUTPUT_GRAY;
+ stp_set_output_type(nv, OUTPUT_GRAY);
+ }
+
+ if (caps->color_type == PCL_COLOR_NONE && output_type != OUTPUT_MONOCHROME)
+ {
+ output_type = OUTPUT_GRAY;
+ stp_set_output_type(nv, OUTPUT_GRAY);
+ }
+ stp_set_output_color_model(nv, COLOR_MODEL_CMY);
+
+ colorfunc = stp_choose_colorfunc(output_type, image_bpp, cmap, &out_bpp, nv);
+
+ do_cret = (xdpi >= 300 &&
+ ((caps->color_type & PCL_COLOR_CMYK4) == PCL_COLOR_CMYK4) &&
+ output_type != OUTPUT_MONOCHROME);
+ do_cretb = (xdpi >= 600 && ydpi >= 600 &&
+ ((caps->color_type & PCL_COLOR_CMYK4b) == PCL_COLOR_CMYK4b) &&
+ output_type != OUTPUT_MONOCHROME &&
+ output_type != OUTPUT_GRAY);
+ if (do_cretb){
+ do_cret = 1;
+ dot_sizes_use=dot_sizes_cret;
+ }else{
+ dot_sizes_use=dot_sizes;
+ }
+
+ stp_deprintf(STP_DBG_PCL, "do_cret = %d\n", do_cret);
+ stp_deprintf(STP_DBG_PCL, "do_cretb = %d\n", do_cretb);
+
+ do_6color = (strcmp(ink_type, "Photo") == 0);
+ stp_deprintf(STP_DBG_PCL, "do_6color = %d\n", do_6color);
+
+ /*
+ * Compute the output size...
+ */
+
+ pcl_imageable_area(printer, nv, &page_left, &page_right,
+ &page_bottom, &page_top);
+ stp_deprintf(STP_DBG_PCL,"Before stp_compute_page_parameters()\n");
+ stp_deprintf(STP_DBG_PCL,"page_left = %d, page_right = %d, page_top = %d, page_bottom = %d\n",
+ page_left, page_right, page_top, page_bottom);
+ stp_deprintf(STP_DBG_PCL,"top = %d, left = %d\n", top, left);
+ stp_deprintf(STP_DBG_PCL,"scaling = %f, image_width = %d, image_height = %d\n", scaling,
+ image_width, image_height);
+
+ stp_compute_page_parameters(page_right, page_left, page_top, page_bottom,
+ scaling, image_width, image_height, image,
+ &orientation, &page_width, &page_height,
+ &out_width, &out_height, &left, &top);
+
+ /*
+ * Recompute the image height and width. If the image has been
+ * rotated, these will change from previously.
+ */
+ image_height = image->height(image);
+ image_width = image->width(image);
+
+ stp_deprintf(STP_DBG_PCL,"After stp_compute_page_parameters()\n");
+ stp_deprintf(STP_DBG_PCL,"page_width = %d, page_height = %d\n", page_width, page_height);
+ stp_deprintf(STP_DBG_PCL,"out_width = %d, out_height = %d\n", out_width, out_height);
+ stp_deprintf(STP_DBG_PCL,"top = %d, left = %d\n", top, left);
+
+ /*
+ * Let the user know what we're doing...
+ */
+
+ image->progress_init(image);
+
+ /*
+ * Send PCL initialization commands...
+ */
+
+ if (do_cretb)
+ {
+ stp_puts("\033*rbC", v); /* End raster graphics */
+ }
+ stp_puts("\033E", v); /* PCL reset */
+ if (do_cretb)
+ {
+ stp_zprintf(v, "\033%%-12345X@PJL ENTER LANGUAGE=PCL3GUI\n");
+ }
+
+ /*
+ * Set media size
+ */
+
+ if (strlen(stp_get_media_size(v)) > 0)
+ media_size = stp_get_media_size(v);
+ else if ((pp = stp_get_papersize_by_size(stp_get_page_height(v),
+ stp_get_page_width(v))) != NULL)
+ media_size = stp_papersize_get_name(pp);
+ else
+ media_size = "";
+
+ pcl_media_size = pcl_convert_media_size(media_size, model);
+
+ stp_deprintf(STP_DBG_PCL,"pcl_media_size = %d, media_size = %s\n", pcl_media_size, media_size);
+
+ /*
+ * If the media size requested is unknown, try it as a custom size.
+ *
+ * Warning: The margins may need to be fixed for this!
+ */
+
+ if (pcl_media_size == -1) {
+ stp_deprintf(STP_DBG_PCL, "Paper size %s is not directly supported by printer.\n",
+ media_size);
+ stp_deprintf(STP_DBG_PCL, "Trying as custom pagesize (watch the margins!)\n");
+ pcl_media_size = PCL_PAPERSIZE_CUSTOM; /* Custom */
+ }
+
+ stp_zprintf(v, "\033&l%dA", pcl_media_size);
+
+ stp_puts("\033&l0L", v); /* Turn off perforation skip */
+ stp_puts("\033&l0E", v); /* Reset top margin to 0 */
+
+ /*
+ * Convert media source string to the code, if specified.
+ */
+
+ if (strlen(media_source) != 0) {
+ pcl_media_source = pcl_string_to_val(media_source, pcl_media_sources,
+ sizeof(pcl_media_sources) / sizeof(pcl_t));
+
+ stp_deprintf(STP_DBG_PCL,"pcl_media_source = %d, media_source = %s\n", pcl_media_source,
+ media_source);
+
+ if (pcl_media_source == -1)
+ stp_deprintf(STP_DBG_PCL, "Unknown media source %s, ignored.\n", media_source);
+ else if (pcl_media_source != PCL_PAPERSOURCE_STANDARD) {
+
+/* Correct the value by taking the modulus */
+
+ pcl_media_source = pcl_media_source % PAPERSOURCE_MOD;
+ stp_zprintf(v, "\033&l%dH", pcl_media_source);
+ }
+ }
+
+ /*
+ * Convert media type string to the code, if specified.
+ */
+
+ if (strlen(media_type) != 0) {
+ pcl_media_type = pcl_string_to_val(media_type, pcl_media_types,
+ sizeof(pcl_media_types) / sizeof(pcl_t));
+
+ stp_deprintf(STP_DBG_PCL,"pcl_media_type = %d, media_type = %s\n", pcl_media_type,
+ media_type);
+
+ if (pcl_media_type == -1) {
+ stp_deprintf(STP_DBG_PCL, "Unknown media type %s, set to PLAIN.\n", media_type);
+ pcl_media_type = PCL_PAPERTYPE_PLAIN;
+ }
+
+/*
+ * The HP812C doesn't like glossy paper being selected when using 600x600
+ * C-RET (PhotoRET II). So we use Premium paper instead.
+ *
+ */
+
+ if (do_cretb && pcl_media_type == PCL_PAPERTYPE_GLOSSY) {
+ stp_deprintf(STP_DBG_PCL, "Media type GLOSSY, set to PREMIUM for PhotoRET II.\n");
+ pcl_media_type = PCL_PAPERTYPE_PREMIUM;
+ }
+ }
+ else
+ pcl_media_type = PCL_PAPERTYPE_PLAIN;
+
+ /*
+ * Set DJ print quality to "best" if resolution >= 300
+ */
+
+ if ((xdpi >= 300) && ((caps->stp_printer_type & PCL_PRINTER_DJ) == PCL_PRINTER_DJ))
+ {
+ if ((caps->stp_printer_type & PCL_PRINTER_MEDIATYPE) == PCL_PRINTER_MEDIATYPE)
+ {
+ stp_puts("\033*o1M", v); /* Quality = presentation */
+ stp_zprintf(v, "\033&l%dM", pcl_media_type);
+ }
+ else
+ {
+ stp_puts("\033*r2Q", v); /* Quality (high) */
+ stp_puts("\033*o2Q", v); /* Shingling (4 passes) */
+
+ /* Depletion depends on media type and cart type. */
+
+ if ((pcl_media_type == PCL_PAPERTYPE_PLAIN)
+ || (pcl_media_type == PCL_PAPERTYPE_BOND)) {
+ if ((caps->color_type & PCL_COLOR_CMY) == PCL_COLOR_CMY)
+ stp_puts("\033*o2D", v); /* Depletion 25% */
+ else
+ stp_puts("\033*o5D", v); /* Depletion 50% with gamma correction */
+ }
+
+ else if ((pcl_media_type == PCL_PAPERTYPE_PREMIUM)
+ || (pcl_media_type == PCL_PAPERTYPE_GLOSSY)
+ || (pcl_media_type == PCL_PAPERTYPE_TRANS))
+ stp_puts("\033*o1D", v); /* Depletion none */
+ }
+ }
+
+ if ((xdpi != ydpi) || (do_cret) || (do_6color))
+ /* Set resolution using CRD */
+ {
+
+ /*
+ * Send configure image data command with horizontal and
+ * vertical resolutions as well as a color count...
+ */
+
+ if (output_type != OUTPUT_GRAY && output_type != OUTPUT_MONOCHROME)
+ if ((caps->color_type & PCL_COLOR_CMY) == PCL_COLOR_CMY)
+ planes = 3;
+ else
+ if (do_6color)
+ planes = 6;
+ else
+ planes = 4;
+ else
+ planes = 1;
+
+ stp_zprintf(v, "\033*g%dW", 2 + (planes * 6));
+ stp_putc(2, v); /* Format 2 (Complex Direct Planar) */
+ stp_putc(planes, v); /* # output planes */
+
+ if (planes != 3) {
+ stp_putc(xdpi >> 8, v); /* Black resolution */
+ stp_putc(xdpi, v);
+ stp_putc(ydpi >> 8, v);
+ stp_putc(ydpi, v);
+ stp_putc(0, v);
+ if (do_cretb){
+ stp_putc(2, v);
+ }else{
+ stp_putc(do_cret ? 4 : 2, v);
+ }
+ }
+
+ if (planes != 1) {
+ stp_putc(xdpi >> 8, v); /* Cyan resolution */
+ stp_putc(xdpi, v);
+ stp_putc(ydpi >> 8, v);
+ stp_putc(ydpi, v);
+ stp_putc(0, v);
+ stp_putc(do_cret ? 4 : 2, v);
+
+ stp_putc(xdpi >> 8, v); /* Magenta resolution */
+ stp_putc(xdpi, v);
+ stp_putc(ydpi >> 8, v);
+ stp_putc(ydpi, v);
+ stp_putc(0, v);
+ stp_putc(do_cret ? 4 : 2, v);
+
+ stp_putc(xdpi >> 8, v); /* Yellow resolution */
+ stp_putc(xdpi, v);
+ stp_putc(ydpi >> 8, v);
+ stp_putc(ydpi, v);
+ stp_putc(0, v);
+ stp_putc(do_cret ? 4 : 2, v);
+ }
+ if (planes == 6)
+ {
+ stp_putc(xdpi >> 8, v); /* Light Cyan resolution */
+ stp_putc(xdpi, v);
+ stp_putc(ydpi >> 8, v);
+ stp_putc(ydpi, v);
+ stp_putc(0, v);
+ stp_putc(do_cret ? 4 : 2, v);
+
+ stp_putc(xdpi >> 8, v); /* Light Magenta resolution */
+ stp_putc(xdpi, v);
+ stp_putc(ydpi >> 8, v);
+ stp_putc(ydpi, v);
+ stp_putc(0, v);
+ stp_putc(do_cret ? 4 : 2, v);
+ }
+ }
+ else
+ {
+ stp_zprintf(v, "\033*t%dR", xdpi); /* Simple resolution */
+ if (output_type != OUTPUT_GRAY && output_type != OUTPUT_MONOCHROME)
+ {
+ if ((caps->color_type & PCL_COLOR_CMY) == PCL_COLOR_CMY)
+ stp_puts("\033*r-3U", v); /* Simple CMY color */
+ else
+ stp_puts("\033*r-4U", v); /* Simple KCMY color */
+ }
+ }
+
+#ifndef PCL_DEBUG_DISABLE_COMPRESSION
+ if ((caps->stp_printer_type & PCL_PRINTER_TIFF) == PCL_PRINTER_TIFF)
+ {
+ stp_puts("\033*b2M", v); /* Mode 2 (TIFF) */
+ writefunc = pcl_mode2;
+ }
+ else
+#endif
+ {
+ stp_puts("\033*b0M", v); /* Mode 0 (no compression) */
+ writefunc = pcl_mode0;
+ }
+
+ /*
+ * Convert image size to printer resolution and setup the page for printing...
+ */
+
+ out_width = xdpi * out_width / 72;
+ out_height = ydpi * out_height / 72;
+
+ stp_deprintf(STP_DBG_PCL, "left %d margin %d top %d margin %d width %d height %d\n",
+ left, caps->left_margin, top, caps->top_margin, out_width, out_height);
+
+ if (!do_cretb) {
+ stp_zprintf(v, "\033&a%dH", 10 * left); /* Set left raster position */
+ stp_zprintf(v, "\033&a%dV", 10 * (top + caps->top_margin));
+ /* Set top raster position */
+ }
+ stp_zprintf(v, "\033*r%dS", out_width); /* Set raster width */
+ stp_zprintf(v, "\033*r%dT", out_height); /* Set raster height */
+
+ if (do_cretb)
+ {
+ /* Move to top left of printed area */
+ stp_zprintf(v, "\033*p%dY", (top + caps->top_margin)*4); /* Mesuret in dots. */
+ stp_zprintf(v, "\033*p%dX", left*4);
+ }
+ stp_puts("\033*r1A", v); /* Start GFX */
+
+ /*
+ * Allocate memory for the raster data...
+ */
+
+ height = (out_width + 7) / 8;
+ if (do_cret)
+ height *= 2;
+
+ if (output_type == OUTPUT_GRAY || output_type == OUTPUT_MONOCHROME)
+ {
+ black = stp_malloc(height);
+ cyan = NULL;
+ magenta = NULL;
+ yellow = NULL;
+ lcyan = NULL;
+ lmagenta = NULL;
+ }
+ else
+ {
+ cyan = stp_malloc(height);
+ magenta = stp_malloc(height);
+ yellow = stp_malloc(height);
+
+ if ((caps->color_type & PCL_COLOR_CMY) == PCL_COLOR_CMY)
+ black = NULL;
+ else
+ black = stp_malloc(height);
+ if (do_6color)
+ {
+ lcyan = stp_malloc(height);
+ lmagenta = stp_malloc(height);
+ }
+ else
+ {
+ lcyan = NULL;
+ lmagenta = NULL;
+ }
+ }
+
+ /*
+ * Output the page, rotating as necessary...
+ */
+
+ stp_compute_lut(nv, 256);
+
+ if (xdpi > ydpi)
+ dither = stp_init_dither(image_width, out_width, 1, xdpi / ydpi, nv);
+ else
+ dither = stp_init_dither(image_width, out_width, ydpi / xdpi, 1, nv);
+
+/* Set up dithering for special printers. */
+
+#if 1 /* Leave alone for now */
+ for (i = 0; i <= NCOLORS; i++)
+ stp_dither_set_black_level(dither, i, 1.2);
+ stp_dither_set_black_lower(dither, .3);
+ stp_dither_set_black_upper(dither, .999);
+#endif
+
+ if (do_cret) /* 4-level printing for 800/1120 */
+ {
+ stp_dither_set_ranges_simple(dither, ECOLOR_Y, 3, dot_sizes_use, stp_get_density(nv));
+ if (!do_cretb)
+ stp_dither_set_ranges_simple(dither, ECOLOR_K, 3, dot_sizes_use, stp_get_density(nv));
+
+/* Note: no printer I know of does both CRet (4-level) and 6 colour, but
+ what the heck. variable_dither_ranges copied from print-escp2.c */
+
+ if (do_6color) /* Photo for 69x */
+ {
+ stp_dither_set_ranges(dither, ECOLOR_C, 6, variable_dither_ranges,
+ stp_get_density(nv));
+ stp_dither_set_ranges(dither, ECOLOR_M, 6, variable_dither_ranges,
+ stp_get_density(nv));
+ }
+ else
+ {
+ stp_dither_set_ranges_simple(dither, ECOLOR_C, 3, dot_sizes_use, stp_get_density(nv));
+ stp_dither_set_ranges_simple(dither, ECOLOR_M, 3, dot_sizes_use, stp_get_density(nv));
+ }
+ }
+ else if (do_6color)
+ {
+/* Set light inks for 6 colour printers. Numbers copied from print-escp2.c */
+ stp_dither_set_light_ink(dither, ECOLOR_C, .25, stp_get_density(nv));
+ stp_dither_set_light_ink(dither, ECOLOR_M, .25, stp_get_density(nv));
+ }
+
+ switch (stp_get_image_type(nv))
+ {
+ case IMAGE_LINE_ART:
+ stp_dither_set_ink_spread(dither, 19);
+ break;
+ case IMAGE_SOLID_TONE:
+ stp_dither_set_ink_spread(dither, 15);
+ break;
+ case IMAGE_CONTINUOUS:
+ stp_dither_set_ink_spread(dither, 14);
+ break;
+ }
+ stp_dither_set_density(dither, stp_get_density(nv));
+
+ in = stp_malloc(image_width * image_bpp);
+ out = stp_malloc(image_width * out_bpp * 2);
+
+ errdiv = image_height / out_height;
+ errmod = image_height % out_height;
+ errval = 0;
+ errlast = -1;
+ errline = 0;
+ blank_lines = 0;
+ is_blank = 0;
+#ifndef PCL_DEBUG_DISABLE_BLANKLINE_REMOVAL
+ do_blank = ((caps->stp_printer_type & PCL_PRINTER_BLANKLINE) ==
+ PCL_PRINTER_BLANKLINE);
+#else
+ do_blank = 0;
+#endif
+
+ for (y = 0; y < out_height; y ++)
+ {
+ int duplicate_line = 1;
+ stp_deprintf(STP_DBG_PCL,"pcl_print: y = %d, line = %d, val = %d, mod = %d, height = %d\n",
+ y, errline, errval, errmod, out_height);
+ if ((y & 63) == 0)
+ image->note_progress(image, y, out_height);
+
+ if (errline != errlast)
+ {
+ errlast = errline;
+ duplicate_line = 0;
+ if (image->get_row(image, in, errline) != STP_IMAGE_OK)
+ break;
+ (*colorfunc)(nv, in, out, &zero_mask, image_width, image_bpp, cmap,
+ hue_adjustment, lum_adjustment, NULL);
+ }
+
+ stp_dither(out, y, dither, cyan, lcyan, magenta, lmagenta,
+ yellow, NULL, black, duplicate_line, zero_mask);
+
+ len_c = stp_dither_get_last_position(dither, ECOLOR_C, 1);
+ len_lc = stp_dither_get_last_position(dither, ECOLOR_C, 0);
+ len_m = stp_dither_get_last_position(dither, ECOLOR_M, 1);
+ len_lm = stp_dither_get_last_position(dither, ECOLOR_M, 0);
+ len_y = stp_dither_get_last_position(dither, ECOLOR_Y, 1);
+ len_k = stp_dither_get_last_position(dither, ECOLOR_K, 1);
+
+/*
+ * Blank line removal. If multiple lines are blank then they can be replaced
+ * by "Relative Vertical Pixel Movement" command. However, since there are
+ * apparently some faulty implementations, we always output the first line,
+ * then suppress the rest. This ensures that the printers's buffers are really
+ * empty. As suggested by Mike Sweet.
+ */
+
+ is_blank = (do_blank && (len_c == -1) && (len_lc == -1) && (len_m == -1)
+ && (len_lm == -1) && (len_y == -1) && (len_k == -1));
+
+ if (is_blank && (blank_lines != 0)) /* repeated blank line */
+ {
+ blank_lines++;
+ }
+ else /* Not blank, or is first one */
+ {
+ if (! is_blank)
+ {
+ if (blank_lines > 1) /* Output accumulated lines */
+ {
+ blank_lines--; /* correct for one already output */
+ stp_deprintf(STP_DBG_PCL, "Blank Lines = %d\n", blank_lines);
+ stp_zprintf(v, "\033*b%dY", blank_lines);
+ blank_lines=0;
+ }
+ else;
+ }
+ else
+ {
+ blank_lines++;
+ }
+
+ if (do_cret)
+ {
+ /*
+ * 4-level (CRet) dithers...
+ */
+ if (output_type == OUTPUT_GRAY || output_type == OUTPUT_MONOCHROME)
+ {
+ (*writefunc)(v, black + height / 2, height / 2, 0);
+ (*writefunc)(v, black, height / 2, 1);
+ }
+ else
+ {
+ if(do_cretb)
+ {
+/* (*writefunc)(v, black + height / 2, 0, 0); */
+ (*writefunc)(v, black, height/2, 0);
+ }
+ else
+ {
+ (*writefunc)(v, black + height / 2, height / 2, 0);
+ (*writefunc)(v, black, height / 2, 0);
+ }
+ (*writefunc)(v, cyan + height / 2, height / 2, 0);
+ (*writefunc)(v, cyan, height / 2, 0);
+ (*writefunc)(v, magenta + height / 2, height / 2, 0);
+ (*writefunc)(v, magenta, height / 2, 0);
+ (*writefunc)(v, yellow + height / 2, height / 2, 0);
+ if (do_6color)
+ {
+ (*writefunc)(v, yellow, height / 2, 0);
+ (*writefunc)(v, lcyan + height / 2, height / 2, 0);
+ (*writefunc)(v, lcyan, height / 2, 0);
+ (*writefunc)(v, lmagenta + height / 2, height / 2, 0);
+ (*writefunc)(v, lmagenta, height / 2, 1); /* Last plane set on light magenta */
+ }
+ else
+ (*writefunc)(v, yellow, height / 2, 1); /* Last plane set on yellow */
+ }
+ }
+ else
+ {
+ /*
+ * Standard 2-level dithers...
+ */
+
+ if (output_type == OUTPUT_GRAY || output_type == OUTPUT_MONOCHROME)
+ {
+ (*writefunc)(v, black, height, 1);
+ }
+ else
+ {
+ if (black != NULL)
+ (*writefunc)(v, black, height, 0);
+ (*writefunc)(v, cyan, height, 0);
+ (*writefunc)(v, magenta, height, 0);
+ if (do_6color)
+ {
+ (*writefunc)(v, yellow, height, 0);
+ (*writefunc)(v, lcyan, height, 0);
+ (*writefunc)(v, lmagenta, height, 1); /* Last plane set on light magenta */
+ }
+ else
+ (*writefunc)(v, yellow, height, 1); /* Last plane set on yellow */
+ }
+ }
+ }
+
+ errval += errmod;
+ errline += errdiv;
+ if (errval >= out_height)
+ {
+ errval -= out_height;
+ errline ++;
+ }
+ }
+
+/* Output trailing blank lines (may not be required?) */
+
+ if (blank_lines > 1)
+ {
+ blank_lines--; /* correct for one already output */
+ stp_deprintf(STP_DBG_PCL, "Blank Lines = %d\n", blank_lines);
+ stp_zprintf(v, "\033*b%dY", blank_lines);
+ blank_lines=0;
+ }
+
+ image->progress_conclude(image);
+
+ stp_free_dither(dither);
+
+
+ /*
+ * Cleanup...
+ */
+
+ stp_free_lut(nv);
+ stp_free(in);
+ stp_free(out);
+
+ if (black != NULL)
+ stp_free(black);
+ if (cyan != NULL)
+ {
+ stp_free(cyan);
+ stp_free(magenta);
+ stp_free(yellow);
+ }
+ if (lcyan != NULL)
+ {
+ stp_free(lcyan);
+ stp_free(lmagenta);
+ }
+
+ if ((caps->stp_printer_type & PCL_PRINTER_NEW_ERG) == PCL_PRINTER_NEW_ERG)
+ stp_puts("\033*rC", v);
+ else
+ stp_puts("\033*rB", v);
+
+ stp_puts("\033&l0H", v); /* Eject page */
+ if (do_cretb)
+ {
+ stp_zprintf(v, "\033%%-12345X\n");
+ }
+ stp_puts("\033E", v); /* PCL reset */
+ stp_free_vars(nv);
+}
+
+const stp_printfuncs_t stp_pcl_printfuncs =
+{
+ pcl_parameters,
+ stp_default_media_size,
+ pcl_imageable_area,
+ pcl_limit,
+ pcl_print,
+ pcl_default_parameters,
+ pcl_describe_resolution,
+ stp_verify_printer_params
+};
+
+
+/*
+ * 'pcl_mode0()' - Send PCL graphics using mode 0 (no) compression.
+ */
+
+static void
+pcl_mode0(const stp_vars_t v, /* I - Print file or command */
+ unsigned char *line, /* I - Output bitmap data */
+ int height, /* I - Height of bitmap data */
+ int last_plane) /* I - True if this is the last plane */
+{
+ stp_zprintf(v, "\033*b%d%c", height, last_plane ? 'W' : 'V');
+ stp_zfwrite((const char *) line, height, 1, v);
+}
+
+
+/*
+ * 'pcl_mode2()' - Send PCL graphics using mode 2 (TIFF) compression.
+ */
+
+static void
+pcl_mode2(const stp_vars_t v, /* I - Print file or command */
+ unsigned char *line, /* I - Output bitmap data */
+ int height, /* I - Height of bitmap data */
+ int last_plane) /* I - True if this is the last plane */
+{
+ unsigned char comp_buf[1536], /* Compression buffer */
+ *comp_ptr; /* Current slot in buffer */
+
+ stp_pack_tiff(line, height, comp_buf, &comp_ptr);
+
+ /*
+ * Send a line of raster graphics...
+ */
+
+ stp_zprintf(v, "\033*b%d%c", (int)(comp_ptr - comp_buf), last_plane ? 'W' : 'V');
+ stp_zfwrite((const char *)comp_buf, comp_ptr - comp_buf, 1, v);
+}