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
|
/* Portions Copyright (C) 2001 artofcode LLC.
Portions Copyright (C) 1996, 2001 Artifex Software Inc.
Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
This software is based in part on the work of the Independent JPEG Group.
All Rights Reserved.
This software is distributed under license and may not be copied, modified
or distributed except as expressly authorized under the terms of that
license. Refer to licensing information at http://www.artifex.com/ or
contact Artifex Software, Inc., 101 Lucas Valley Road #110,
San Rafael, CA 94903, (415)492-9861, for further information. */
/*$Id$ */
/* pcstate.h - Definition of PCL5 state */
#ifndef pcstate_INCLUDED
# define pcstate_INCLUDED
#include "gx.h"
#include "gxdevice.h"
#include "scommon.h"
#include "gscspace.h"
#include "gscolor2.h"
#include "gscrd.h"
#include "gsdcolor.h" /* for gx_ht_tile */
#include "gschar.h"
#include "pldict.h"
#include "plfont.h"
/* various components of the state structure */
#include "pccoord.h" /* centi-point coordinate system */
#include "pcxfmst.h" /* geometric transformation information */
#include "pcfontst.h" /* font selection information */
#include "pctpm.h" /* text parsing method information */
#include "pcpattyp.h" /* pattern related structures */
#include "pcdict.h" /* PL dictionary key structure */
#include "rtrstst.h" /* raster state information */
#include "pcht.h"
#include "pcident.h"
#include "pccsbase.h"
/*#include "pgstate.h"*/ /* HP-GL/2 state, included below */
#include "pjtop.h"
/* type for string id's */
typedef struct pcl_string_id_s {
byte * id;
int size;
} alphanumeric_string_id_t;
/* type for current state of id's, string or regular id's macros */
typedef enum id_type_enum {
string_id,
numeric_id
} id_type_t;
/* define different language personalities for dynamic configuration */
typedef enum personality_enum { /* NB document */
pcl5c,
pcl5e,
rtl,
hpgl
} pcl_personality_t;
/*
* Palette stack. This is implemented as a simple linked list. NB
* needs to be moved.
*/
typedef struct pstack_entry_s {
struct pstack_entry_s * pnext;
pcl_palette_t * ppalet;
} pstack_entry_t;
#ifndef pcl_state_DEFINED
# define pcl_state_DEFINED
typedef struct pcl_state_s pcl_state_t;
#endif
#ifndef gs_state_DEFINED
# define gs_state_DEFINED
typedef struct gs_state_s gs_state;
#endif
/*
* The routines pcl_gsave and pcl_grestore should be used instead of
* gs_gsave and gs_grestore. See the comment in pcdraw.c for details.
*
* The routine pcl_init_gstate_stk must be called once a boot time to
* intialize PCL graphics state stack tracking mechanism.
*/
int pcl_gsave(pcl_state_t * pcs);
int pcl_grestore(pcl_state_t * pcs);
void pcl_init_gstate_stk(pcl_state_t * pcs);
void pcl_free_gstate_stk(pcl_state_t * pcs);
/*
* "Cold start" initialization for the graphic state.
*/
void pcl_init_state(pcl_state_t * pcs, gs_memory_t * pmem);
#include "pgstate.h" /* HP-GL/2 state */
#ifndef pcl_pattern_data_DEFINED
#define pcl_ht_builtin_dither_DEFINED
typedef struct pcl_pattern_t pcl_pattern;
#endif
#ifndef pcl_cs_indexed_DEFINED
#define pcl_cs_indexed_DEFINED
typedef struct pcl_cs_indexed_s pcl_cs_indexed_t;
#endif
/*
* Define the entire PCL/HPGL state. The documentation for this is spread
* out over the PCL reference manuals, and is incomplete, inconsistent, and
* poorly organized. In order to have a ghost (:-)) of a chance of being
* able to think about it as a whole, we've organized it here by
* documentation chapter, just as we did the .c files.
*
* NB: If you modify this structure, be sure to also modify the routine
* pcl_init_state in pcommand.c.
*/
struct pcl_state_s {
gs_memory_t * memory;
/* hook back to client data, for callback procedures */
void * client_data;
/* graphics state */
gs_state * pgs;
/* Define an optional procedure for parsing non-ESC data. */
int (*parse_other)( void * parse_data,
pcl_state_t * pcs,
stream_cursor_read * pr
);
void * parse_data; /* closure data for parse_other */
/* Chapter 4 (pcjob.c) */
int num_copies; /* (also a device parameter) */
bool duplex; /* (also a device parameter) */
bool bind_short_edge; /* (also a device parameter) */
bool back_side; /* (also a device parameter) */
int output_bin; /* (also a device parameter) */
coord uom_cp; /* centipoints per PCL unit */
/* Chapter 5 (pcpage.c) */
int paper_source;
int perforation_skip;
pcl_margins_t margins; /* relative to print_direction */
pcl_xfm_state_t xfm_state;
bool orientation_set; /* the orientation command can
only be set once per page */
/* Chapter 6 (pcursor.c) */
coord hmi_cp;
coord vmi_cp;
int line_termination;
coord_point_t cap;
gs_point cursor_stk[20];
int cursor_stk_size;
/* Chapter 8 (pcfont.c) */
pcl_font_selection_t font_selection[2];
enum {
primary = 0,
secondary = 1
} font_selected;
pl_font_t * font; /* 0 means recompute from params */
pl_dict_t built_in_fonts; /* "built-in", known at start-up */
/* Internal variables */
gs_font_dir * font_dir; /* gs-level dictionary of fonts */
pl_symbol_map_t * map; /* map for current font (above) */
/* more Chapter 8 (pctext.c) */
bool underline_enabled;
bool underline_floating;
float underline_position; /* distance from baseline */
pcl_text_parsing_method_t text_parsing_method;
int text_path; /* 0, 1, -1 */
/* Internal variables */
float last_width; /* escapement of last char (for BS) */
coord_point_t underline_start; /* start point of underline */
bool last_was_BS; /* no printable chars since last BS */
/* Chapter 10 (pcsymbol.c) */
pcl_id_t symbol_set_id;
pl_dict_t soft_symbol_sets;
pl_dict_t built_in_symbol_sets;
pl_dict_t simm_fonts;
pl_dict_t cartridge_fonts;
int default_symbol_set_value;
/* Chapter 9 & 11 (pcsfont.c) */
pcl_id_t font_id;
uint character_code;
pl_dict_t soft_fonts;
uint soft_font_count;
byte * soft_font_char_data;
/* PCL comparison guide - alphanumeric string id */
alphanumeric_string_id_t alpha_font_id;
id_type_t font_id_type;
#define current_font_id \
( ((pcs->font_id_type == string_id) ? (pcs->alpha_font_id.id) \
: (id_key(pcs->font_id))) )
#define current_font_id_size \
( ((pcs->font_id_type == string_id) ? (pcs->alpha_font_id.size) : (2)) )
/* Chapter 12 (pcmacros.c) */
pcl_id_t macro_id;
pcl_id_t overlay_macro_id;
bool overlay_enabled;
int macro_level;
pl_dict_t macros;
bool defining_macro;
pcl_state_t * saved; /* saved state during execute/call/overlay */
/* Internal variables */
byte * macro_definition; /* for macro being defined, if any */
alphanumeric_string_id_t alpha_macro_id;
id_type_t macro_id_type;
#define current_macro_id \
( ((pcs->macro_id_type == string_id) ? (pcs->alpha_macro_id.id) \
: (id_key(pcs->macro_id))) )
#define current_macro_id_size \
( ((pcs->macro_id_type == string_id) ? (pcs->alpha_macro_id.size) : (2)) )
/* Chapter 13 (pcprint.c) */
gs_point pat_ref_pt; /* active pattern reference point,
* in device space */
int pat_orient; /* current pattern orientation */
int pattern_id;
int current_pattern_id;
pcl_pattern_source_t pattern_type; /* current source for PCL patterns */
gs_point pcl_pat_ref_pt; /* PCL's pattern reference point */
pl_dict_t pcl_patterns; /* dictionaries to hold pcl and gl/2 patterns */
pl_dict_t gl_patterns;
#define PCL_NUM_SHADE_PATTERNS (7) /* pcl support 7 shades of gray */
#define PCL_NUM_CROSSHATCH_PATTERNS (6) /* and 6 cross hatch patterns */
pcl_pattern * bi_pattern_array[PCL_NUM_SHADE_PATTERNS + PCL_NUM_CROSSHATCH_PATTERNS];
int last_pcl_uptrn_id; /* optimizations for recording last patter */
pcl_pattern * plast_pcl_uptrn; /* and pattern id */
int last_gl2_RF_indx;
pcl_pattern * plast_gl2_uptrn;
pcl_pattern * psolid_pattern; /* see documentation in pcbiptrn.c for these two */
pcl_pattern * punsolid_pattern;
bool rotate_patterns; /* rotate patterns with print direction in PCL */
bool source_transparent; /* (also in graphics state) */
bool pattern_transparent;/* (also in graphics state);
* PCL and GL/2 set this
* independenty; for GL/2 it is
* known as source transparent */
bool pcl_pattern_transparent;
/* Chapter 14 (pcrect.c) */
coord_point_t rectangle;
/* Chapter 15 & Chapter C6 (pcgmode.c) */
pcl_raster_state_t raster_state;
/* Chapter 16 (pcstatus.c) */
int location_type;
int location_unit;
struct _sb {
byte internal_buffer[80]; /* enough for an error message */
byte * buffer;
uint write_pos;
uint read_pos;
} status;
/* Chapter 24 (pcmisc.c) */
bool end_of_line_wrap;
bool display_functions;
int (*configure_appletalk)( const byte * key,
uint key_length,
const byte * value,
uint value_length
);
/* Chapter C2/C3/C4 (pcpalet.c/pcindexed.c/pccsbase.c/etc.) */
int sel_palette_id;
int ctrl_palette_id;
int monochrome_mode;/* 0=off */
int render_mode; /* raw (unmapped) render algorithm */
pcl_palette_t * ppalet;
pcl_gsid_t next_id; /* id's for palette's and foreground
colors see pcident.h */
pcl_frgrnd_t * pfrgrnd;
pcl_gsid_t frgnd_cache_id;
pcl_gstate_ids_t * pids;
/*
* Unlike other elements of the PCL "palette", color rendering dictionaries
* are for the most part not a feature that can be controlled from the language.
* Except for the white point, the parameters of a color rendering dictionary
* are determined by the output device rather than the language.
*/
pcl_crd_t * pcl_default_crd;
/* internal dithers */
pcl_ht_builtin_dither_t ordered_dither;
pcl_ht_builtin_dither_t clustered_dither;
pcl_ht_builtin_dither_t noise_dither;
/*
* The forwarding devices to preform any necessary color mapping. There are
* four of these: identity mapping, snap to primaries, map black to white and
* all other colors to black, and monochrome mapping. The devices are all
* identical except for the mapping method used.
*
* Several devices are required because the rendering method used by the
* foreground may not be the same as that used by the current palette.
*/
gs_cie_transform_proc3 dflt_TransformPQR; /* default transform PQR */
pcl_rend_info_t rendering_info[20]; /* rendering methods */
byte dflt_rendering_remap[20]; /* NB not convinced this is necessary (review) */
byte rendering_remap[20]; /* remap the table of rendering methods */
pcl_ht_t * pdflt_ht; /* default halftone */
pcl_cs_indexed_t *pdflt_cs_indexed;
pcl_cid_data_t dflt_cid_data;
pcl_cs_base_t * pwhite_cs;
pcl_frgrnd_t * pdflt_frgrnd;
pstack_entry_t *palette_stack;
pcl_palette_t *pdflt_palette; /* default palette */
pl_dict_t palette_store; /* dictionary to hold the palette store */
float color_comps[3];
/* Chapter C5 (pccprint.c) */
byte logical_op; /* (also in graphics state) */
byte pp_mode; /* pixel placement mode */
/* ---------------- HP-GL/2 state ---------------- */
pcl_hpgl_state_t g; /* see pgstate.h */
/* ---------------- PJL state -------------------- */
pl_interp_instance_t *pjls;
/* yet another poorly documented pjl variable - this should widen
the margins on A4 paper to support 80 10 pitch characters but
it appears to affect letter paper as well */
bool wide_a4;
/* the current language personality */
pcl_personality_t personality;
/* enable image interpolation */
bool interpolate;
/* store a pointer to the command definitions for use by macros */
void *pcl_commands;
/* indicates page has been written to with a drawing command */
bool page_marked;
/* end page procedure to use */
int (*end_page)( pcl_state_t * pcs, int num_copies, int flush );
/* map device color spaces to srgb */
bool useciecolor;
bool halftone_set;
};
/* accessor functions for the pcl target device. These live in
pctop.c for now */
int pcl_load_cartridge_fonts(pcl_state_t *pcs, const char *pathname);
int pcl_load_simm_fonts(pcl_state_t *pcs, const char *pathname);
int pcl_load_built_in_fonts(pcl_state_t *pcs, const char *pathname);
/* implicitly exit gl/2 whenever ESC E is found */
int pcl_implicit_gl2_finish(pcl_state_t *pcs);
int pcl_do_printer_reset(pcl_state_t *pcs);
int pcl_end_page_top(pcl_state_t *pcs, int num_copies, int flush);
/* exported from pcl to support PCL XL pass through mode */
bool pcl_downloaded_and_bound(pl_font_t *plfont);
void pcl_font_scale(pcl_state_t *, gs_point *psz);
#endif /* pcstate_INCLUDED */
|