1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
|
/*
* "$Id: print-escp2.h,v 1.7.4.9 2003/12/02 01:51:00 rlk Exp $"
*
* Print plug-in EPSON ESC/P2 driver for the GIMP.
*
* Copyright 1997-2000 Michael Sweet (mike@easysw.com) and
* Robert Krawitz (rlk@alum.mit.edu)
*
* 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.
*/
/*
* Printer capabilities.
*
* Various classes of printer capabilities are represented by bitmasks.
*/
typedef unsigned long model_cap_t;
typedef unsigned long model_featureset_t;
/*
* For each printer, we can select from a variety of dot sizes.
* For single dot size printers, the available sizes are usually 0,
* which is the "default", and some subset of 1-4. For simple variable
* dot size printers (with only one kind of variable dot size), the
* variable dot size is specified as 0x10. For newer printers, there
* is a choice of variable dot sizes available, 0x10, 0x11, and 0x12 in
* order of increasing size.
*
* Normally, we want to specify the smallest dot size that lets us achieve
* a density of less than .8 or thereabouts (above that we start to get
* some dither artifacts). This needs to be tested for each printer and
* resolution.
*
* An entry of -1 in a slot means that this resolution is not available.
*/
typedef int escp2_dot_size_t[13];
/*
* Choose the number of bits to use at each resolution.
*/
typedef int escp2_bits_t[13];
/*
* Choose the base resolution to use at each resolution.
*/
typedef int escp2_base_resolutions_t[13];
/*
* Specify the base density for each available resolution.
* This obviously depends upon the dot size.
*/
typedef double escp2_densities_t[13];
/*
* Definition of the multi-level inks available to a given printer.
* Each printer may use a different kind of ink droplet for variable
* and single drop size for each supported horizontal resolution and
* type of ink (4 or 6 color).
*
* Recall that 6 color ink is treated as simply another kind of
* multi-level ink, but the driver offers the user a choice of 4 and
* 6 color ink, so we need to define appropriate inksets for both
* kinds of ink.
*
* Stuff like the MIS 4 and 6 "color" monochrome inks doesn't fit into
* this model very nicely, so we'll either have to special case it
* or find some way of handling it in here.
*/
#define RES_120_M 0
#define RES_120 1
#define RES_180_M 2
#define RES_180 3
#define RES_360_M 4
#define RES_360 5
#define RES_720_360_M 6
#define RES_720_360 7
#define RES_720_M 8
#define RES_720 9
#define RES_1440_720_M 10
#define RES_1440_720 11
#define RES_1440_1440_M 12
#define RES_1440_1440 13
#define RES_2880_720_M 14
#define RES_2880_720 15
#define RES_2880_1440_M 16
#define RES_2880_1440 17
#define RES_N 18
typedef struct escp2_variable_ink
{
const stp_simple_dither_range_t *range;
int count;
double density;
} escp2_variable_ink_t;
typedef const escp2_variable_ink_t *escp2_variable_inkset_t[NCOLORS];
typedef const escp2_variable_inkset_t *escp2_variable_inklist_t[][RES_N / 2];
typedef struct
{
const char *name;
const char *text;
int paper_feed_sequence;
int platen_gap;
double base_density;
double k_lower_scale;
double k_upper;
double cyan;
double magenta;
double yellow;
double p_cyan;
double p_magenta;
double p_yellow;
double saturation;
double gamma;
int feed_adjustment;
int vacuum_intensity;
int paper_thickness;
const double *hue_adjustment;
const double *lum_adjustment;
const double *sat_adjustment;
} paper_t;
typedef struct
{
int paper_count;
const paper_t *papers;
} paperlist_t;
#define MODEL_COMMAND_MASK 0xful /* What general command set does */
#define MODEL_COMMAND_1998 0x0ul
#define MODEL_COMMAND_1999 0x1ul /* The 1999 series printers */
#define MODEL_COMMAND_2000 0x2ul /* The 2000 series printers */
#define MODEL_COMMAND_PRO 0x3ul /* Stylus Pro printers */
#define MODEL_XZEROMARGIN_MASK 0x10ul /* Does this printer support */
#define MODEL_XZEROMARGIN_NO 0x00ul /* zero margin mode? */
#define MODEL_XZEROMARGIN_YES 0x10ul /* (print to edge of the paper) */
#define MODEL_ROLLFEED_MASK 0x20ul /* Does this printer support */
#define MODEL_ROLLFEED_NO 0x00ul /* a roll feed? */
#define MODEL_ROLLFEED_YES 0x20ul
#define MODEL_VARIABLE_DOT_MASK 0x40ul /* Does this printer support var */
#define MODEL_VARIABLE_NO 0x00ul /* dot size printing? The newest */
#define MODEL_VARIABLE_YES 0x40ul /* printers support multiple modes */
#define MODEL_GRAYMODE_MASK 0x80ul /* Does this printer support special */
#define MODEL_GRAYMODE_NO 0x00ul /* fast black printing? */
#define MODEL_GRAYMODE_YES 0x80ul
#define MODEL_VACUUM_MASK 0x100ul
#define MODEL_VACUUM_NO 0x000ul
#define MODEL_VACUUM_YES 0x100ul
#define MODEL_FAST_360_MASK 0x200ul
#define MODEL_FAST_360_NO 0x000ul
#define MODEL_FAST_360_YES 0x200ul
typedef enum
{
MODEL_COMMAND,
MODEL_XZEROMARGIN,
MODEL_ROLLFEED,
MODEL_VARIABLE_DOT,
MODEL_GRAYMODE,
MODEL_VACUUM,
MODEL_FAST_360,
MODEL_LIMIT
} escp2_model_option_t;
typedef struct
{
const char *attr_name;
int shift;
int bits;
} escp2_printer_attr_t;
typedef struct
{
const char *name;
const char *text;
int hres;
int vres;
int external_hres;
int external_vres;
int softweave;
int interleave;
int vertical_passes;
int vertical_oversample;
int unidirectional;
int vertical_undersample;
int vertical_denominator;
int resid;
} res_t;
typedef struct
{
int color;
int density;
int head_offset;
} physical_subchannel_t;
typedef struct
{
const physical_subchannel_t *channels;
int n_subchannels;
} ink_channel_t;
typedef enum
{
INKSET_CMYK = 0,
INKSET_CcMmYK = 1,
INKSET_CcMmYyK = 2,
INKSET_CcMmYKk = 3,
INKSET_PIEZO_QUADTONE = 4
} inkset_id_t;
typedef struct
{
const char *name;
const char *text;
int is_color;
inkset_id_t inkset;
double k_lower;
double k_upper;
const double *lum_adjustment;
const double *hue_adjustment;
const double *sat_adjustment;
const ink_channel_t *channels[NCOLORS];
} escp2_inkname_t;
typedef struct
{
const escp2_inkname_t *const *inknames;
size_t n_inks;
} inklist_t;
#define ROLL_FEED_CUT_ALL (1)
#define ROLL_FEED_CUT_LAST (2)
typedef struct
{
const char *data;
size_t length;
} init_sequence_t;
typedef struct
{
const char *name;
const char *text;
int is_roll_feed;
unsigned roll_feed_cut_flags;
init_sequence_t init_sequence;
init_sequence_t deinit_sequence;
} input_slot_t;
typedef struct
{
const input_slot_t *slots;
size_t n_input_slots;
} input_slot_list_t;
typedef struct escp2_printer
{
model_cap_t flags; /* Bitmask of flags, see above */
/*****************************************************************************/
/* Basic head configuration */
int nozzles; /* Number of nozzles per color */
int min_nozzles; /* Minimum number of nozzles per color */
int nozzle_separation; /* Separation between rows, in 1/360" */
int black_nozzles; /* Number of black nozzles (may be extra) */
int min_black_nozzles; /* # of black nozzles (may be extra) */
int black_nozzle_separation; /* Separation between rows */
int fast_nozzles; /* Number of fast nozzles */
int min_fast_nozzles; /* # of fast nozzles (may be extra) */
int fast_nozzle_separation; /* Separation between rows */
/*****************************************************************************/
/* Print head resolution */
int base_separation; /* Basic unit of row separation */
int base_resolution; /* Base hardware line spacing (above this */
/* always requires multiple passes) */
int enhanced_resolution;/* Above this we use the */
/* enhanced_xres rather than xres */
int resolution_scale; /* Scaling factor for ESC(D command */
int max_black_resolution; /* Above this resolution, we */
/* must use color parameters */
/* rather than (faster) black */
/* only parameters*/
int max_hres;
int max_vres;
int min_hres;
int min_vres;
/*****************************************************************************/
/* Paper size limits */
int max_paper_width; /* Maximum paper width, in points */
int max_paper_height; /* Maximum paper height, in points */
int min_paper_width; /* Maximum paper width, in points */
int min_paper_height; /* Maximum paper height, in points */
/*****************************************************************************/
/* Borders */
/* SHEET FED: */
/* Softweave: */
int left_margin; /* Left margin, points */
int right_margin; /* Right margin, points */
int top_margin; /* Absolute top margin, points */
int bottom_margin; /* Absolute bottom margin, points */
/* Printer interleave: */
int m_left_margin; /* Left margin, points */
int m_right_margin; /* Right margin, points */
int m_top_margin; /* Absolute top margin, points */
int m_bottom_margin; /* Absolute bottom margin, points */
/* ROLL FEED: */
/* Softweave: */
int roll_left_margin; /* Left margin, points */
int roll_right_margin; /* Right margin, points */
int roll_top_margin; /* Absolute top margin, points */
int roll_bottom_margin; /* Absolute bottom margin, points */
/* Printer interleave: */
int m_roll_left_margin; /* Left margin, points */
int m_roll_right_margin; /* Right margin, points */
int m_roll_top_margin; /* Absolute top margin, points */
int m_roll_bottom_margin; /* Absolute bottom margin, points */
/*****************************************************************************/
/* Miscellaneous printer-specific data */
int extra_feed; /* Extra distance the paper can be spaced */
/* beyond the bottom margin, in 1/360". */
/* (maximum useful value is */
/* nozzles * nozzle_separation) */
int separation_rows; /* Some printers require funky spacing */
/* arguments in interleave mode. */
int pseudo_separation_rows;/* Some printers require funky */
/* spacing arguments in softweave mode */
int zero_margin_offset; /* Offset to use to achieve */
/* zero-margin printing */
int initial_vertical_offset;
int black_initial_vertical_offset;
int extra_720dpi_separation;
/*****************************************************************************/
const int *dot_sizes; /* Vector of dot sizes for resolutions */
const double *densities; /* List of densities for each printer */
const escp2_variable_inklist_t *inks; /* Choices of inks for this printer */
/*****************************************************************************/
const paperlist_t *paperlist;
const res_t *reslist;
const inklist_t *inklist;
/*****************************************************************************/
const int *bits;
const int *base_resolutions;
const input_slot_list_t *input_slots;
/*****************************************************************************/
const init_sequence_t *preinit_sequence;
const init_sequence_t *postinit_remote_sequence;
} escp2_stp_printer_t;
extern const escp2_stp_printer_t stp_escp2_model_capabilities[];
|