2 |
- |
1 |
/* Copyright (C) 1996, 2000, 2001 Aladdin Enterprises. All rights reserved.
|
|
|
2 |
|
|
|
3 |
This software is provided AS-IS with no warranty, either express or
|
|
|
4 |
implied.
|
|
|
5 |
|
|
|
6 |
This software is distributed under license and may not be copied,
|
|
|
7 |
modified or distributed except as expressly authorized under the terms
|
|
|
8 |
of the license contained in the file LICENSE in this distribution.
|
|
|
9 |
|
|
|
10 |
For more information about licensing, please refer to
|
|
|
11 |
http://www.ghostscript.com/licensing/. For information on
|
|
|
12 |
commercial licensing, go to http://www.artifex.com/licensing/ or
|
|
|
13 |
contact Artifex Software, Inc., 101 Lucas Valley Road #110,
|
|
|
14 |
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
|
|
|
15 |
*/
|
|
|
16 |
|
|
|
17 |
/* $Id: gdevpdfx.h,v 1.138 2005/10/18 07:58:42 leonardo Exp $ */
|
|
|
18 |
/* Internal definitions for PDF-writing driver. */
|
|
|
19 |
|
|
|
20 |
#ifndef gdevpdfx_INCLUDED
|
|
|
21 |
# define gdevpdfx_INCLUDED
|
|
|
22 |
|
|
|
23 |
#include "gsparam.h"
|
|
|
24 |
#include "gsuid.h"
|
|
|
25 |
#include "gxdevice.h"
|
|
|
26 |
#include "gxfont.h"
|
|
|
27 |
#include "gxline.h"
|
|
|
28 |
#include "stream.h"
|
|
|
29 |
#include "spprint.h"
|
|
|
30 |
#include "gdevpsdf.h"
|
|
|
31 |
#include "gxdevmem.h"
|
|
|
32 |
|
|
|
33 |
#define FINE_GLYPH_USAGE 1 /* Old code = 0, new code = 1 */
|
|
|
34 |
|
|
|
35 |
#ifndef stream_arcfour_state_DEFINED
|
|
|
36 |
#define stream_arcfour_state_DEFINED
|
|
|
37 |
typedef struct stream_arcfour_state_s stream_arcfour_state;
|
|
|
38 |
#endif
|
|
|
39 |
|
|
|
40 |
/* ---------------- Acrobat limitations ---------------- */
|
|
|
41 |
|
|
|
42 |
/*
|
|
|
43 |
* The PDF reference manual, 2nd ed., claims that the limit for coordinates
|
|
|
44 |
* is +/- 32767. However, testing indicates that Acrobat Reader 4 for
|
|
|
45 |
* Windows and Linux fail with coordinates outside +/- 16383. Hence, we
|
|
|
46 |
* limit coordinates to 16k, with a little slop.
|
|
|
47 |
*/
|
|
|
48 |
#define MAX_USER_COORD 16300
|
|
|
49 |
|
|
|
50 |
/* ---------------- Statically allocated sizes ---------------- */
|
|
|
51 |
/* These should really be dynamic.... */
|
|
|
52 |
|
|
|
53 |
/* Define the maximum depth of an outline tree. */
|
|
|
54 |
/* Note that there is no limit on the breadth of the tree. */
|
|
|
55 |
#define MAX_OUTLINE_DEPTH 32
|
|
|
56 |
|
|
|
57 |
/* Define the maximum size of a destination array string. */
|
|
|
58 |
#define MAX_DEST_STRING 80
|
|
|
59 |
|
|
|
60 |
/* ================ Types and structures ================ */
|
|
|
61 |
|
|
|
62 |
/* Define the possible contexts for the output stream. */
|
|
|
63 |
typedef enum {
|
|
|
64 |
PDF_IN_NONE,
|
|
|
65 |
PDF_IN_STREAM,
|
|
|
66 |
PDF_IN_TEXT,
|
|
|
67 |
PDF_IN_STRING
|
|
|
68 |
} pdf_context_t;
|
|
|
69 |
|
|
|
70 |
/* ---------------- Cos objects ---------------- */
|
|
|
71 |
|
|
|
72 |
/*
|
|
|
73 |
* These are abstract types for cos objects. The concrete types are in
|
|
|
74 |
* gdevpdfo.h.
|
|
|
75 |
*/
|
|
|
76 |
typedef struct cos_object_s cos_object_t;
|
|
|
77 |
typedef struct cos_stream_s cos_stream_t;
|
|
|
78 |
typedef struct cos_dict_s cos_dict_t;
|
|
|
79 |
typedef struct cos_array_s cos_array_t;
|
|
|
80 |
typedef struct cos_value_s cos_value_t;
|
|
|
81 |
typedef struct cos_object_procs_s cos_object_procs_t;
|
|
|
82 |
typedef const cos_object_procs_t *cos_type_t;
|
|
|
83 |
#define cos_types_DEFINED
|
|
|
84 |
|
|
|
85 |
#ifndef pdf_text_state_DEFINED
|
|
|
86 |
# define pdf_text_state_DEFINED
|
|
|
87 |
typedef struct pdf_text_state_s pdf_text_state_t;
|
|
|
88 |
#endif
|
|
|
89 |
|
|
|
90 |
#ifndef pdf_char_glyph_pairs_DEFINED
|
|
|
91 |
# define pdf_char_glyph_pairs_DEFINED
|
|
|
92 |
typedef struct pdf_char_glyph_pairs_s pdf_char_glyph_pairs_t;
|
|
|
93 |
#endif
|
|
|
94 |
|
|
|
95 |
|
|
|
96 |
/* ---------------- Resources ---------------- */
|
|
|
97 |
|
|
|
98 |
typedef enum {
|
|
|
99 |
/*
|
|
|
100 |
* Standard PDF resources. Font must be last, because resources
|
|
|
101 |
* up to but not including Font are written page-by-page.
|
|
|
102 |
*/
|
|
|
103 |
resourceColorSpace,
|
|
|
104 |
resourceExtGState,
|
|
|
105 |
resourcePattern,
|
|
|
106 |
resourceShading,
|
|
|
107 |
resourceXObject,
|
|
|
108 |
resourceOther, /* Anything else that needs to be stored for a time. */
|
|
|
109 |
resourceFont,
|
|
|
110 |
/*
|
|
|
111 |
* Internally used (pseudo-)resources.
|
|
|
112 |
*/
|
|
|
113 |
resourceCharProc,
|
|
|
114 |
resourceCIDFont,
|
|
|
115 |
resourceCMap,
|
|
|
116 |
resourceFontDescriptor,
|
|
|
117 |
resourceGroup,
|
|
|
118 |
resourceSoftMaskDict,
|
|
|
119 |
resourceFunction,
|
|
|
120 |
resourcePage,
|
|
|
121 |
NUM_RESOURCE_TYPES
|
|
|
122 |
} pdf_resource_type_t;
|
|
|
123 |
|
|
|
124 |
#define PDF_RESOURCE_TYPE_NAMES\
|
|
|
125 |
"/ColorSpace", "/ExtGState", "/Pattern", "/Shading", "/XObject", 0, "/Font",\
|
|
|
126 |
0, "/Font", "/CMap", "/FontDescriptor", "/Group", "/Mask", 0, 0
|
|
|
127 |
#define PDF_RESOURCE_TYPE_STRUCTS\
|
|
|
128 |
&st_pdf_color_space, /* gdevpdfg.h / gdevpdfc.c */\
|
|
|
129 |
&st_pdf_resource, /* see below */\
|
|
|
130 |
&st_pdf_pattern,\
|
|
|
131 |
&st_pdf_resource,\
|
|
|
132 |
&st_pdf_x_object, /* see below */\
|
|
|
133 |
&st_pdf_resource,\
|
|
|
134 |
&st_pdf_font_resource, /* gdevpdff.h / gdevpdff.c */\
|
|
|
135 |
&st_pdf_char_proc, /* gdevpdff.h / gdevpdff.c */\
|
|
|
136 |
&st_pdf_font_resource, /* gdevpdff.h / gdevpdff.c */\
|
|
|
137 |
&st_pdf_resource,\
|
|
|
138 |
&st_pdf_font_descriptor, /* gdevpdff.h / gdevpdff.c */\
|
|
|
139 |
&st_pdf_resource,\
|
|
|
140 |
&st_pdf_resource,\
|
|
|
141 |
&st_pdf_resource,\
|
|
|
142 |
&st_pdf_resource
|
|
|
143 |
|
|
|
144 |
/*
|
|
|
145 |
* rname is currently R<id> for all resources other than synthesized fonts;
|
|
|
146 |
* for synthesized fonts, rname is A, B, .... The string is null-terminated.
|
|
|
147 |
*/
|
|
|
148 |
|
|
|
149 |
#define pdf_resource_common(typ)\
|
|
|
150 |
typ *next; /* next resource of this type */\
|
|
|
151 |
pdf_resource_t *prev; /* previously allocated resource */\
|
|
|
152 |
gs_id rid; /* optional ID key */\
|
|
|
153 |
bool named;\
|
|
|
154 |
bool global; /* ps2write only */\
|
|
|
155 |
char rname[1/*R*/ + (sizeof(long) * 8 / 3 + 1) + 1/*\0*/];\
|
|
|
156 |
ulong where_used; /* 1 bit per level of content stream */\
|
|
|
157 |
cos_object_t *object
|
|
|
158 |
typedef struct pdf_resource_s pdf_resource_t;
|
|
|
159 |
struct pdf_resource_s {
|
|
|
160 |
pdf_resource_common(pdf_resource_t);
|
|
|
161 |
};
|
|
|
162 |
|
|
|
163 |
/* The descriptor is public for subclassing. */
|
|
|
164 |
extern_st(st_pdf_resource);
|
|
|
165 |
#define public_st_pdf_resource() /* in gdevpdfu.c */\
|
|
|
166 |
gs_public_st_ptrs3(st_pdf_resource, pdf_resource_t, "pdf_resource_t",\
|
|
|
167 |
pdf_resource_enum_ptrs, pdf_resource_reloc_ptrs, next, prev, object)
|
|
|
168 |
|
|
|
169 |
/*
|
|
|
170 |
* We define XObject resources here because they are used for Image,
|
|
|
171 |
* Form, and PS XObjects, which are implemented in different files.
|
|
|
172 |
*/
|
|
|
173 |
typedef struct pdf_x_object_s pdf_x_object_t;
|
|
|
174 |
struct pdf_x_object_s {
|
|
|
175 |
pdf_resource_common(pdf_x_object_t);
|
|
|
176 |
int width, height; /* specified width and height for images */
|
|
|
177 |
int data_height; /* actual data height for images */
|
|
|
178 |
};
|
|
|
179 |
#define private_st_pdf_x_object() /* in gdevpdfu.c */\
|
|
|
180 |
gs_private_st_suffix_add0(st_pdf_x_object, pdf_x_object_t,\
|
|
|
181 |
"pdf_x_object_t", pdf_x_object_enum_ptrs, pdf_x_object_reloc_ptrs,\
|
|
|
182 |
st_pdf_resource)
|
|
|
183 |
|
|
|
184 |
/* Define the mask for which procsets have been used on a page. */
|
|
|
185 |
typedef enum {
|
|
|
186 |
NoMarks = 0,
|
|
|
187 |
ImageB = 1,
|
|
|
188 |
ImageC = 2,
|
|
|
189 |
ImageI = 4,
|
|
|
190 |
Text = 8
|
|
|
191 |
} pdf_procset_t;
|
|
|
192 |
|
|
|
193 |
/* ------ Fonts ------ */
|
|
|
194 |
|
|
|
195 |
/* Define abstract types. */
|
|
|
196 |
typedef struct pdf_char_proc_s pdf_char_proc_t; /* gdevpdff.h */
|
|
|
197 |
typedef struct pdf_font_s pdf_font_t; /* gdevpdff.h */
|
|
|
198 |
typedef struct pdf_text_data_s pdf_text_data_t; /* gdevpdft.h */
|
|
|
199 |
|
|
|
200 |
/* ---------------- Other auxiliary structures ---------------- */
|
|
|
201 |
|
|
|
202 |
/* Outline nodes and levels */
|
|
|
203 |
typedef struct pdf_outline_node_s {
|
|
|
204 |
long id, parent_id, prev_id, first_id, last_id;
|
|
|
205 |
int count;
|
|
|
206 |
cos_dict_t *action;
|
|
|
207 |
} pdf_outline_node_t;
|
|
|
208 |
typedef struct pdf_outline_level_s {
|
|
|
209 |
pdf_outline_node_t first;
|
|
|
210 |
pdf_outline_node_t last;
|
|
|
211 |
int left;
|
|
|
212 |
} pdf_outline_level_t;
|
|
|
213 |
/*
|
|
|
214 |
* The GC descriptor is implicit, since outline levels occur only in an
|
|
|
215 |
* embedded array in the gx_device_pdf structure.
|
|
|
216 |
*/
|
|
|
217 |
|
|
|
218 |
/* Articles */
|
|
|
219 |
typedef struct pdf_bead_s {
|
|
|
220 |
long id, article_id, prev_id, next_id, page_id;
|
|
|
221 |
gs_rect rect;
|
|
|
222 |
} pdf_bead_t;
|
|
|
223 |
typedef struct pdf_article_s pdf_article_t;
|
|
|
224 |
struct pdf_article_s {
|
|
|
225 |
pdf_article_t *next;
|
|
|
226 |
cos_dict_t *contents;
|
|
|
227 |
pdf_bead_t first;
|
|
|
228 |
pdf_bead_t last;
|
|
|
229 |
};
|
|
|
230 |
|
|
|
231 |
#define private_st_pdf_article()\
|
|
|
232 |
gs_private_st_ptrs2(st_pdf_article, pdf_article_t,\
|
|
|
233 |
"pdf_article_t", pdf_article_enum_ptrs, pdf_article_reloc_ptrs,\
|
|
|
234 |
next, contents)
|
|
|
235 |
|
|
|
236 |
/* ---------------- The device structure ---------------- */
|
|
|
237 |
|
|
|
238 |
/* Resource lists */
|
|
|
239 |
#define NUM_RESOURCE_CHAINS 16
|
|
|
240 |
typedef struct pdf_resource_list_s {
|
|
|
241 |
pdf_resource_t *chains[NUM_RESOURCE_CHAINS];
|
|
|
242 |
} pdf_resource_list_t;
|
|
|
243 |
|
|
|
244 |
/* Define the hash function for gs_ids. */
|
|
|
245 |
#define gs_id_hash(rid) ((rid) + ((rid) / NUM_RESOURCE_CHAINS))
|
|
|
246 |
/* Define the accessor for the proper hash chain. */
|
|
|
247 |
#define PDF_RESOURCE_CHAIN(pdev, type, rid)\
|
|
|
248 |
(&(pdev)->resources[type].chains[gs_id_hash(rid) % NUM_RESOURCE_CHAINS])
|
|
|
249 |
|
|
|
250 |
/* Define the bookkeeping for an open stream. */
|
|
|
251 |
typedef struct pdf_stream_position_s {
|
|
|
252 |
long length_id;
|
|
|
253 |
long start_pos;
|
|
|
254 |
} pdf_stream_position_t;
|
|
|
255 |
|
|
|
256 |
/*
|
|
|
257 |
* Define the structure for keeping track of text rotation.
|
|
|
258 |
* There is one for the current page (for AutoRotate /PageByPage)
|
|
|
259 |
* and one for the whole document (for AutoRotate /All).
|
|
|
260 |
*/
|
|
|
261 |
typedef struct pdf_text_rotation_s {
|
|
|
262 |
long counts[5]; /* 0, 90, 180, 270, other */
|
|
|
263 |
int Rotate; /* computed rotation, -1 means none */
|
|
|
264 |
} pdf_text_rotation_t;
|
|
|
265 |
#define pdf_text_rotation_angle_values 0, 90, 180, 270, -1
|
|
|
266 |
|
|
|
267 |
/*
|
|
|
268 |
* Define document and page information derived from DSC comments.
|
|
|
269 |
*/
|
|
|
270 |
typedef struct pdf_page_dsc_info_s {
|
|
|
271 |
int orientation; /* -1 .. 3 */
|
|
|
272 |
int viewing_orientation; /* -1 .. 3 */
|
|
|
273 |
gs_rect bounding_box;
|
|
|
274 |
} pdf_page_dsc_info_t;
|
|
|
275 |
|
|
|
276 |
/*
|
|
|
277 |
* Define the stored information for a page. Because pdfmarks may add
|
|
|
278 |
* information to any page anywhere in the document, we have to wait
|
|
|
279 |
* until the end to write the page dictionaries.
|
|
|
280 |
*/
|
|
|
281 |
typedef struct pdf_page_s {
|
|
|
282 |
cos_dict_t *Page;
|
|
|
283 |
gs_point MediaBox;
|
|
|
284 |
pdf_procset_t procsets;
|
|
|
285 |
long contents_id;
|
|
|
286 |
long resource_ids[resourceFont + 1]; /* resources thru Font, see above */
|
|
|
287 |
long group_id;
|
|
|
288 |
cos_array_t *Annots;
|
|
|
289 |
pdf_text_rotation_t text_rotation;
|
|
|
290 |
pdf_page_dsc_info_t dsc_info;
|
|
|
291 |
bool NumCopies_set; /* ps2write only. */
|
|
|
292 |
int NumCopies; /* ps2write only. */
|
|
|
293 |
} pdf_page_t;
|
|
|
294 |
#define private_st_pdf_page() /* in gdevpdf.c */\
|
|
|
295 |
gs_private_st_ptrs2(st_pdf_page, pdf_page_t, "pdf_page_t",\
|
|
|
296 |
pdf_page_enum_ptrs, pdf_page_reloc_ptrs, Page, Annots)
|
|
|
297 |
|
|
|
298 |
/*
|
|
|
299 |
* Define the structure for the temporary files used while writing.
|
|
|
300 |
* There are 4 of these, described below.
|
|
|
301 |
*/
|
|
|
302 |
typedef struct pdf_temp_file_s {
|
|
|
303 |
char file_name[gp_file_name_sizeof];
|
|
|
304 |
FILE *file;
|
|
|
305 |
stream *strm;
|
|
|
306 |
byte *strm_buf;
|
|
|
307 |
stream *save_strm; /* save pdev->strm while writing here */
|
|
|
308 |
} pdf_temp_file_t;
|
|
|
309 |
|
|
|
310 |
#ifndef gx_device_pdf_DEFINED
|
|
|
311 |
# define gx_device_pdf_DEFINED
|
|
|
312 |
typedef struct gx_device_pdf_s gx_device_pdf;
|
|
|
313 |
#endif
|
|
|
314 |
|
|
|
315 |
/*
|
|
|
316 |
* Define the structure for PDF font cache element.
|
|
|
317 |
*/
|
|
|
318 |
typedef struct pdf_font_cache_elem_s pdf_font_cache_elem_t;
|
|
|
319 |
struct pdf_font_cache_elem_s {
|
|
|
320 |
pdf_font_cache_elem_t *next;
|
|
|
321 |
gs_id font_id;
|
|
|
322 |
int num_chars; /* safety purpose only */
|
|
|
323 |
int num_widths; /* safety purpose only */
|
|
|
324 |
struct pdf_font_resource_s *pdfont;
|
|
|
325 |
byte *glyph_usage;
|
|
|
326 |
double *real_widths; /* [count] (not used for Type 0) */
|
|
|
327 |
gx_device_pdf *pdev; /* For pdf_remove_font_cache_elem */
|
|
|
328 |
};
|
|
|
329 |
|
|
|
330 |
#define private_st_pdf_font_cache_elem()\
|
|
|
331 |
gs_private_st_ptrs5(st_pdf_font_cache_elem, pdf_font_cache_elem_t,\
|
|
|
332 |
"pdf_font_cache_elem_t", pdf_font_cache_elem_enum,\
|
|
|
333 |
pdf_font_cache_elem_reloc, next, pdfont,\
|
|
|
334 |
glyph_usage, real_widths, pdev)
|
|
|
335 |
|
|
|
336 |
/*
|
|
|
337 |
* pdf_viewer_state tracks the graphic state of a viewer,
|
|
|
338 |
* which would interpret the generated PDF file
|
|
|
339 |
* immediately when it is generated.
|
|
|
340 |
*/
|
|
|
341 |
typedef struct pdf_viewer_state_s {
|
|
|
342 |
int transfer_not_identity; /* bitmask */
|
|
|
343 |
gs_id transfer_ids[4];
|
|
|
344 |
float opacity_alpha; /* state.opacity.alpha */
|
|
|
345 |
float shape_alpha; /* state.shape.alpha */
|
|
|
346 |
gs_blend_mode_t blend_mode; /* state.blend_mode */
|
|
|
347 |
gs_id halftone_id;
|
|
|
348 |
gs_id black_generation_id;
|
|
|
349 |
gs_id undercolor_removal_id;
|
|
|
350 |
int overprint_mode;
|
|
|
351 |
float smoothness; /* state.smoothness */
|
|
|
352 |
float flatness;
|
|
|
353 |
bool text_knockout; /* state.text_knockout */
|
|
|
354 |
bool fill_overprint;
|
|
|
355 |
bool stroke_overprint;
|
|
|
356 |
bool stroke_adjust; /* state.stroke_adjust */
|
|
|
357 |
bool fill_used_process_color;
|
|
|
358 |
bool stroke_used_process_color;
|
|
|
359 |
gx_hl_saved_color saved_fill_color;
|
|
|
360 |
gx_hl_saved_color saved_stroke_color;
|
|
|
361 |
gx_line_params line_params;
|
|
|
362 |
float dash_pattern[max_dash];
|
|
|
363 |
gs_id soft_mask_id;
|
|
|
364 |
} pdf_viewer_state;
|
|
|
365 |
|
|
|
366 |
/*
|
|
|
367 |
* Define a structure for saving context when entering
|
|
|
368 |
* a contents stream accumulation mode (charproc, Type 1 pattern).
|
|
|
369 |
*/
|
|
|
370 |
typedef struct pdf_substream_save_s {
|
|
|
371 |
pdf_context_t context;
|
|
|
372 |
pdf_text_state_t *text_state;
|
|
|
373 |
gx_path *clip_path;
|
|
|
374 |
gs_id clip_path_id;
|
|
|
375 |
int vgstack_bottom;
|
|
|
376 |
stream *strm;
|
|
|
377 |
cos_dict_t *substream_Resources;
|
|
|
378 |
pdf_procset_t procsets;
|
|
|
379 |
bool skip_colors;
|
|
|
380 |
pdf_resource_t *font3;
|
|
|
381 |
pdf_resource_t *accumulating_substream_resource;
|
|
|
382 |
bool charproc_just_accumulated;
|
|
|
383 |
bool accumulating_a_global_object;
|
|
|
384 |
pdf_resource_t *pres_soft_mask_dict;
|
|
|
385 |
gs_const_string objname;
|
|
|
386 |
} pdf_substream_save;
|
|
|
387 |
|
|
|
388 |
#define private_st_pdf_substream_save()\
|
|
|
389 |
gs_private_st_strings1_ptrs7(st_pdf_substream_save, pdf_substream_save,\
|
|
|
390 |
"pdf_substream_save", pdf_substream_save_enum,\
|
|
|
391 |
pdf_substream_save_reloc, objname, text_state, clip_path, strm, \
|
|
|
392 |
substream_Resources, font3, accumulating_substream_resource, pres_soft_mask_dict)
|
|
|
393 |
#define private_st_pdf_substream_save_element()\
|
|
|
394 |
gs_private_st_element(st_pdf_substream_save_element, pdf_substream_save,\
|
|
|
395 |
"pdf_substream_save[]", pdf_substream_save_elt_enum_ptrs,\
|
|
|
396 |
pdf_substream_save_elt_reloc_ptrs, st_pdf_substream_save)
|
|
|
397 |
|
|
|
398 |
typedef enum {
|
|
|
399 |
pdf_compress_none,
|
|
|
400 |
pdf_compress_LZW, /* not currently used, thanks to Unisys */
|
|
|
401 |
pdf_compress_Flate
|
|
|
402 |
} pdf_compression_type;
|
|
|
403 |
|
|
|
404 |
|
|
|
405 |
/* Define the device structure. */
|
|
|
406 |
struct gx_device_pdf_s {
|
|
|
407 |
gx_device_psdf_common;
|
|
|
408 |
/* PDF-specific distiller parameters */
|
|
|
409 |
double CompatibilityLevel;
|
|
|
410 |
int EndPage;
|
|
|
411 |
int StartPage;
|
|
|
412 |
bool Optimize;
|
|
|
413 |
bool ParseDSCCommentsForDocInfo;
|
|
|
414 |
bool ParseDSCComments;
|
|
|
415 |
bool EmitDSCWarnings;
|
|
|
416 |
bool CreateJobTicket;
|
|
|
417 |
bool PreserveEPSInfo;
|
|
|
418 |
bool AutoPositionEPSFiles;
|
|
|
419 |
bool PreserveCopyPage;
|
|
|
420 |
bool UsePrologue;
|
|
|
421 |
int OffOptimizations;
|
|
|
422 |
/* End of distiller parameters */
|
|
|
423 |
/* Other parameters */
|
|
|
424 |
bool ReAssignCharacters;
|
|
|
425 |
bool ReEncodeCharacters;
|
|
|
426 |
long FirstObjectNumber;
|
|
|
427 |
bool CompressFonts;
|
|
|
428 |
bool PrintStatistics;
|
|
|
429 |
bool ForOPDFRead; /* PS2WRITE only. */
|
|
|
430 |
gs_param_string OPDFReadProcsetPath; /* PS2WRITE only. */
|
|
|
431 |
bool CompressEntireFile; /* PS2WRITE only. */
|
|
|
432 |
bool ResourcesBeforeUsage; /* PS2WRITE only. */
|
|
|
433 |
bool HavePDFWidths; /* PS2WRITE only. */
|
|
|
434 |
bool HaveStrokeColor; /* PS2WRITE only. */
|
|
|
435 |
bool HaveTransparency;
|
|
|
436 |
bool PatternImagemask; /* The target viewer|printer handles imagemask
|
|
|
437 |
with pattern color. */
|
|
|
438 |
bool PDFX; /* Generate PDF/X */
|
|
|
439 |
long MaxClipPathSize; /* The maximal number of elements of a clipping path
|
|
|
440 |
that the target viewer|printer can handle. */
|
|
|
441 |
long MaxViewerMemorySize;
|
|
|
442 |
long MaxShadingBitmapSize; /* The maximal number of bytes in
|
|
|
443 |
a bitmap representation of a shading.
|
|
|
444 |
(Bigger shadings to be downsampled). */
|
|
|
445 |
long MaxInlineImageSize;
|
|
|
446 |
/* Encryption parameters */
|
|
|
447 |
gs_param_string OwnerPassword;
|
|
|
448 |
gs_param_string UserPassword;
|
|
|
449 |
uint KeyLength;
|
|
|
450 |
uint Permissions;
|
|
|
451 |
uint EncryptionR;
|
|
|
452 |
/* End of parameters */
|
|
|
453 |
/* Encryption data */
|
|
|
454 |
byte EncryptionO[32];
|
|
|
455 |
byte EncryptionU[32];
|
|
|
456 |
byte EncryptionKey[16];
|
|
|
457 |
uint EncryptionV;
|
|
|
458 |
bool EncryptMetadata;
|
|
|
459 |
gs_param_string NoEncrypt;
|
|
|
460 |
/* Values derived from DSC comments */
|
|
|
461 |
bool is_EPS;
|
|
|
462 |
pdf_page_dsc_info_t doc_dsc_info; /* document default */
|
|
|
463 |
pdf_page_dsc_info_t page_dsc_info; /* current page */
|
|
|
464 |
/* Additional graphics state */
|
|
|
465 |
bool fill_overprint, stroke_overprint;
|
|
|
466 |
int overprint_mode;
|
|
|
467 |
gs_id halftone_id;
|
|
|
468 |
gs_id transfer_ids[4];
|
|
|
469 |
int transfer_not_identity; /* bitmask */
|
|
|
470 |
gs_id black_generation_id, undercolor_removal_id;
|
|
|
471 |
/* Following are set when device is opened. */
|
|
|
472 |
pdf_compression_type compression;
|
|
|
473 |
pdf_compression_type compression_at_page_start;
|
|
|
474 |
#define pdf_memory v_memory
|
|
|
475 |
/*
|
|
|
476 |
* The xref temporary file is logically an array of longs.
|
|
|
477 |
* xref[id - FirstObjectNumber] is the position in the output file
|
|
|
478 |
* of the object with the given id.
|
|
|
479 |
*
|
|
|
480 |
* Note that xref, unlike the other temporary files, does not have
|
|
|
481 |
* an associated stream or stream buffer.
|
|
|
482 |
*/
|
|
|
483 |
pdf_temp_file_t xref;
|
|
|
484 |
/*
|
|
|
485 |
* asides holds resources and other "aside" objects. It is
|
|
|
486 |
* copied verbatim to the output file at the end of the document.
|
|
|
487 |
*/
|
|
|
488 |
pdf_temp_file_t asides;
|
|
|
489 |
/*
|
|
|
490 |
* streams holds data for stream-type Cos objects. The data is
|
|
|
491 |
* copied to the output file at the end of the document.
|
|
|
492 |
*
|
|
|
493 |
* Note that streams.save_strm is not used, since we don't interrupt
|
|
|
494 |
* normal output when saving stream data.
|
|
|
495 |
*/
|
|
|
496 |
pdf_temp_file_t streams;
|
|
|
497 |
/*
|
|
|
498 |
* pictures holds graphic objects being accumulated between BP and EP.
|
|
|
499 |
* The object is moved to streams when the EP is reached: since BP and
|
|
|
500 |
* EP nest, we delete the object from the pictures file at that time.
|
|
|
501 |
*/
|
|
|
502 |
pdf_temp_file_t pictures;
|
|
|
503 |
/* ................ */
|
|
|
504 |
long next_id;
|
|
|
505 |
/* The following 3 objects, and only these, are allocated */
|
|
|
506 |
/* when the file is opened. */
|
|
|
507 |
cos_dict_t *Catalog;
|
|
|
508 |
cos_dict_t *Info;
|
|
|
509 |
cos_dict_t *Pages;
|
|
|
510 |
#define pdf_num_initial_ids 3
|
|
|
511 |
long outlines_id;
|
|
|
512 |
int next_page;
|
|
|
513 |
int max_referred_page;
|
|
|
514 |
long contents_id;
|
|
|
515 |
pdf_context_t context;
|
|
|
516 |
long contents_length_id;
|
|
|
517 |
long contents_pos;
|
|
|
518 |
pdf_procset_t procsets; /* used on this page */
|
|
|
519 |
pdf_text_data_t *text;
|
|
|
520 |
pdf_text_rotation_t text_rotation;
|
|
|
521 |
#define initial_num_pages 50
|
|
|
522 |
pdf_page_t *pages;
|
|
|
523 |
int num_pages;
|
|
|
524 |
ulong used_mask; /* for where_used: page level = 1 */
|
|
|
525 |
pdf_resource_list_t resources[NUM_RESOURCE_TYPES];
|
|
|
526 |
/* cs_Patterns[0] is colored; 1,3,4 are uncolored + Gray,RGB,CMYK */
|
|
|
527 |
pdf_resource_t *cs_Patterns[5];
|
|
|
528 |
pdf_resource_t *Identity_ToUnicode_CMaps[2]; /* WMode = 0,1 */
|
|
|
529 |
pdf_resource_t *last_resource;
|
|
|
530 |
pdf_outline_level_t outline_levels[MAX_OUTLINE_DEPTH];
|
|
|
531 |
int outline_depth;
|
|
|
532 |
int closed_outline_depth;
|
|
|
533 |
int outlines_open;
|
|
|
534 |
pdf_article_t *articles;
|
|
|
535 |
cos_dict_t *Dests;
|
|
|
536 |
byte fileID[16];
|
|
|
537 |
/*
|
|
|
538 |
* global_named_objects holds named objects that are independent of
|
|
|
539 |
* the current namespace: {Catalog}, {DocInfo}, {Page#}, {ThisPage},
|
|
|
540 |
* {PrevPage}, {NextPage}.
|
|
|
541 |
*/
|
|
|
542 |
cos_dict_t *global_named_objects;
|
|
|
543 |
/*
|
|
|
544 |
* local_named_objects holds named objects in the current namespace.
|
|
|
545 |
*/
|
|
|
546 |
cos_dict_t *local_named_objects;
|
|
|
547 |
/*
|
|
|
548 |
* NI_stack is a last-in, first-out stack in which each element is a
|
|
|
549 |
* (named) cos_stream_t object that eventually becomes the object of an
|
|
|
550 |
* image XObject resource.
|
|
|
551 |
*/
|
|
|
552 |
cos_array_t *NI_stack;
|
|
|
553 |
/*
|
|
|
554 |
* Namespace_stack is a last-in, first-out stack in which each pair of
|
|
|
555 |
* elements is, respectively, a saved value of local_named_objects and
|
|
|
556 |
* a saved value of NI_stack. (The latter is not documented by Adobe,
|
|
|
557 |
* but it was confirmed by them.)
|
|
|
558 |
*/
|
|
|
559 |
cos_array_t *Namespace_stack;
|
|
|
560 |
pdf_font_cache_elem_t *font_cache;
|
|
|
561 |
/*
|
|
|
562 |
* char_width is used by pdf_text_set_cache to communicate
|
|
|
563 |
* with assign_char_code around gdev_pdf_fill_mask.
|
|
|
564 |
*/
|
|
|
565 |
gs_point char_width;
|
|
|
566 |
/*
|
|
|
567 |
* We need a stable copy of clipping path to prevent writing
|
|
|
568 |
* redundant clipping paths when PS document generates such ones.
|
|
|
569 |
*/
|
|
|
570 |
gx_path *clip_path;
|
|
|
571 |
/*
|
|
|
572 |
* Page labels.
|
|
|
573 |
*/
|
|
|
574 |
cos_array_t *PageLabels;
|
|
|
575 |
int PageLabels_current_page;
|
|
|
576 |
cos_dict_t *PageLabels_current_label;
|
|
|
577 |
/*
|
|
|
578 |
* The following is a dangerous pointer, which pdf_text_process
|
|
|
579 |
* uses to communicate with assign_char_code.
|
|
|
580 |
* It is a pointer from global memory to local memory.
|
|
|
581 |
* The garbager must not proceess this pointer, and it must
|
|
|
582 |
* not be listed in st_device_pdfwrite.
|
|
|
583 |
* It's life time terminates on garbager invocation.
|
|
|
584 |
*/
|
|
|
585 |
gs_text_enum_t *pte;
|
|
|
586 |
/*
|
|
|
587 |
* The viewer's graphic state stack.
|
|
|
588 |
* We restrict its length with the strongest PDF spec limitation.
|
|
|
589 |
* Usually 5 levels is enough, but patterns and charprocs may be nested recursively.
|
|
|
590 |
*/
|
|
|
591 |
pdf_viewer_state vgstack[11];
|
|
|
592 |
int vgstack_depth;
|
|
|
593 |
int vgstack_bottom; /* Stack bottom for the current substream. */
|
|
|
594 |
pdf_viewer_state vg_initial; /* Initial values for viewer's graphic state */
|
|
|
595 |
bool vg_initial_set;
|
|
|
596 |
|
|
|
597 |
/* The substream context stack. */
|
|
|
598 |
int sbstack_size;
|
|
|
599 |
int sbstack_depth;
|
|
|
600 |
pdf_substream_save *sbstack;
|
|
|
601 |
|
|
|
602 |
/* Accessories */
|
|
|
603 |
cos_dict_t *substream_Resources; /* Substream resources */
|
|
|
604 |
gs_color_space_index pcm_color_info_index; /* Index of the ProcessColorModel space. */
|
|
|
605 |
bool skip_colors; /* Skip colors while a pattern/charproc accumulation. */
|
|
|
606 |
bool AR4_save_bug; /* See pdf_put_uncolored_pattern */
|
|
|
607 |
pdf_resource_t *font3; /* The owner of the accumulated charstring. */
|
|
|
608 |
pdf_resource_t *accumulating_substream_resource;
|
|
|
609 |
gs_matrix_fixed charproc_ctm;
|
|
|
610 |
bool charproc_just_accumulated; /* A flag for controlling
|
|
|
611 |
the glyph variation recognition.
|
|
|
612 |
Used only with uncached charprocs. */
|
|
|
613 |
bool accumulating_a_global_object; /* ps2write only.
|
|
|
614 |
Accumulating a global object (such as a named Form,
|
|
|
615 |
so that resources used in it must also be global.
|
|
|
616 |
Important for viewers with small memory,
|
|
|
617 |
which drops resources per page. */
|
|
|
618 |
const pdf_char_glyph_pairs_t *cgp; /* A temporary pointer
|
|
|
619 |
for pdf_is_same_charproc1.
|
|
|
620 |
Must be NULL when the garbager is invoked,
|
|
|
621 |
because it points from global to local memory. */
|
|
|
622 |
int substituted_pattern_count;
|
|
|
623 |
int substituted_pattern_drop_page;
|
|
|
624 |
/* Temporary data for use_image_as_pattern,
|
|
|
625 |
They pass an information about a mask of a masked image,
|
|
|
626 |
(which is being converted into a pattern)
|
|
|
627 |
between 2 consecutive calls to pdf_image_end_image_data. */
|
|
|
628 |
gs_id image_mask_id;
|
|
|
629 |
bool image_mask_is_SMask;
|
|
|
630 |
bool image_mask_skip; /* A flag for pdf_begin_transparency_mask */
|
|
|
631 |
gs_matrix converting_image_matrix;
|
|
|
632 |
double image_mask_scale;
|
|
|
633 |
/* Temporary data for soft mask form. */
|
|
|
634 |
pdf_resource_t *pres_soft_mask_dict;
|
|
|
635 |
/* Temporary data for pdfmark_BP. */
|
|
|
636 |
gs_const_string objname;
|
|
|
637 |
};
|
|
|
638 |
|
|
|
639 |
#define is_in_page(pdev)\
|
|
|
640 |
((pdev)->contents_id != 0)
|
|
|
641 |
#define is_in_document(pdev)\
|
|
|
642 |
(is_in_page(pdev) || (pdev)->last_resource != 0)
|
|
|
643 |
|
|
|
644 |
/* Enumerate the individual pointers in a gx_device_pdf. */
|
|
|
645 |
#define gx_device_pdf_do_ptrs(m)\
|
|
|
646 |
m(0,asides.strm) m(1,asides.strm_buf) m(2,asides.save_strm)\
|
|
|
647 |
m(3,streams.strm) m(4,streams.strm_buf)\
|
|
|
648 |
m(5,pictures.strm) m(6,pictures.strm_buf) m(7,pictures.save_strm)\
|
|
|
649 |
m(8,Catalog) m(9,Info) m(10,Pages)\
|
|
|
650 |
m(11,text) m(12,pages)\
|
|
|
651 |
m(13,cs_Patterns[0])\
|
|
|
652 |
m(14,cs_Patterns[1]) m(15,cs_Patterns[3]) m(16,cs_Patterns[4])\
|
|
|
653 |
m(17,last_resource)\
|
|
|
654 |
m(18,articles) m(19,Dests) m(20,global_named_objects)\
|
|
|
655 |
m(21, local_named_objects) m(22,NI_stack) m(23,Namespace_stack)\
|
|
|
656 |
m(24,font_cache) m(25,clip_path)\
|
|
|
657 |
m(26,PageLabels) m(27,PageLabels_current_label)\
|
|
|
658 |
m(28,sbstack) m(29,substream_Resources) m(30,font3)\
|
|
|
659 |
m(31,accumulating_substream_resource) \
|
|
|
660 |
m(32,pres_soft_mask_dict)
|
|
|
661 |
#define gx_device_pdf_num_ptrs 33
|
|
|
662 |
#define gx_device_pdf_do_param_strings(m)\
|
|
|
663 |
m(0, OPDFReadProcsetPath) m(1, OwnerPassword) m(2, UserPassword) m(3, NoEncrypt)
|
|
|
664 |
#define gx_device_pdf_num_param_strings 4
|
|
|
665 |
#define gx_device_pdf_do_const_strings(m)\
|
|
|
666 |
m(0, objname)
|
|
|
667 |
#define gx_device_pdf_num_const_strings 1
|
|
|
668 |
#define st_device_pdf_max_ptrs\
|
|
|
669 |
(st_device_psdf_max_ptrs + gx_device_pdf_num_ptrs +\
|
|
|
670 |
gx_device_pdf_num_param_strings + gx_device_pdf_num_const_strings +\
|
|
|
671 |
NUM_RESOURCE_TYPES * NUM_RESOURCE_CHAINS /* resources[].chains[] */ +\
|
|
|
672 |
MAX_OUTLINE_DEPTH * 2 /* outline_levels[].{first,last}.action */
|
|
|
673 |
|
|
|
674 |
#define private_st_device_pdfwrite() /* in gdevpdf.c */\
|
|
|
675 |
gs_private_st_composite_final(st_device_pdfwrite, gx_device_pdf,\
|
|
|
676 |
"gx_device_pdf", device_pdfwrite_enum_ptrs, device_pdfwrite_reloc_ptrs,\
|
|
|
677 |
device_pdfwrite_finalize)
|
|
|
678 |
|
|
|
679 |
/* ================ Driver procedures ================ */
|
|
|
680 |
|
|
|
681 |
/* In gdevpdfb.c */
|
|
|
682 |
dev_proc_copy_mono(gdev_pdf_copy_mono);
|
|
|
683 |
dev_proc_copy_color(gdev_pdf_copy_color);
|
|
|
684 |
dev_proc_fill_mask(gdev_pdf_fill_mask);
|
|
|
685 |
dev_proc_strip_tile_rectangle(gdev_pdf_strip_tile_rectangle);
|
|
|
686 |
/* In gdevpdfd.c */
|
|
|
687 |
extern const gx_device_vector_procs pdf_vector_procs;
|
|
|
688 |
dev_proc_fill_rectangle(gdev_pdf_fill_rectangle);
|
|
|
689 |
dev_proc_fill_path(gdev_pdf_fill_path);
|
|
|
690 |
dev_proc_stroke_path(gdev_pdf_stroke_path);
|
|
|
691 |
/* In gdevpdfi.c */
|
|
|
692 |
dev_proc_begin_typed_image(gdev_pdf_begin_typed_image);
|
|
|
693 |
/* In gdevpdfp.c */
|
|
|
694 |
dev_proc_get_params(gdev_pdf_get_params);
|
|
|
695 |
dev_proc_put_params(gdev_pdf_put_params);
|
|
|
696 |
/* In gdevpdft.c */
|
|
|
697 |
dev_proc_text_begin(gdev_pdf_text_begin);
|
|
|
698 |
dev_proc_pattern_manage(gdev_pdf_pattern_manage);
|
|
|
699 |
dev_proc_fill_rectangle_hl_color(gdev_pdf_fill_rectangle_hl_color);
|
|
|
700 |
/* In gdevpdfv.c */
|
|
|
701 |
dev_proc_include_color_space(gdev_pdf_include_color_space);
|
|
|
702 |
/* In gdevpdft.c */
|
|
|
703 |
dev_proc_create_compositor(gdev_pdf_create_compositor);
|
|
|
704 |
dev_proc_begin_transparency_group(gdev_pdf_begin_transparency_group);
|
|
|
705 |
dev_proc_end_transparency_group(gdev_pdf_end_transparency_group);
|
|
|
706 |
dev_proc_begin_transparency_mask(gdev_pdf_begin_transparency_mask);
|
|
|
707 |
dev_proc_end_transparency_mask(gdev_pdf_end_transparency_mask);
|
|
|
708 |
dev_proc_discard_transparency_layer(gdev_pdf_discard_transparency_layer);
|
|
|
709 |
|
|
|
710 |
/* ================ Utility procedures ================ */
|
|
|
711 |
|
|
|
712 |
/* ---------------- Exported by gdevpdf.c ---------------- */
|
|
|
713 |
|
|
|
714 |
/* Initialize the IDs allocated at startup. */
|
|
|
715 |
void pdf_initialize_ids(gx_device_pdf * pdev);
|
|
|
716 |
|
|
|
717 |
/* Update the color mapping procedures after setting ProcessColorModel. */
|
|
|
718 |
void pdf_set_process_color_model(gx_device_pdf * pdev, int index);
|
|
|
719 |
|
|
|
720 |
/* Reset the text state parameters to initial values. */
|
|
|
721 |
void pdf_reset_text(gx_device_pdf *pdev);
|
|
|
722 |
|
|
|
723 |
/* ---------------- Exported by gdevpdfu.c ---------------- */
|
|
|
724 |
|
|
|
725 |
/* ------ Document ------ */
|
|
|
726 |
|
|
|
727 |
/* Open the document if necessary. */
|
|
|
728 |
int pdf_open_document(gx_device_pdf * pdev);
|
|
|
729 |
|
|
|
730 |
/* ------ Objects ------ */
|
|
|
731 |
|
|
|
732 |
/* Allocate an ID for a future object. */
|
|
|
733 |
long pdf_obj_ref(gx_device_pdf * pdev);
|
|
|
734 |
|
|
|
735 |
/* Read the current position in the output stream. */
|
|
|
736 |
long pdf_stell(gx_device_pdf * pdev);
|
|
|
737 |
|
|
|
738 |
/* Begin an object, optionally allocating an ID. */
|
|
|
739 |
long pdf_open_obj(gx_device_pdf * pdev, long id);
|
|
|
740 |
long pdf_begin_obj(gx_device_pdf * pdev);
|
|
|
741 |
|
|
|
742 |
/* End an object. */
|
|
|
743 |
int pdf_end_obj(gx_device_pdf * pdev);
|
|
|
744 |
|
|
|
745 |
/* ------ Page contents ------ */
|
|
|
746 |
|
|
|
747 |
/* Open a page contents part. */
|
|
|
748 |
/* Return an error if the page has too many contents parts. */
|
|
|
749 |
int pdf_open_contents(gx_device_pdf * pdev, pdf_context_t context);
|
|
|
750 |
|
|
|
751 |
/* Close the current contents part if we are in one. */
|
|
|
752 |
int pdf_close_contents(gx_device_pdf * pdev, bool last);
|
|
|
753 |
|
|
|
754 |
/* ------ Resources et al ------ */
|
|
|
755 |
|
|
|
756 |
extern const char *const pdf_resource_type_names[];
|
|
|
757 |
extern const gs_memory_struct_type_t *const pdf_resource_type_structs[];
|
|
|
758 |
|
|
|
759 |
/*
|
|
|
760 |
* Define the offset that indicates that a file position is in the
|
|
|
761 |
* asides file rather than the main (contents) file.
|
|
|
762 |
* Must be a power of 2, and larger than the largest possible output file.
|
|
|
763 |
*/
|
|
|
764 |
#define ASIDES_BASE_POSITION min_long
|
|
|
765 |
|
|
|
766 |
/* Begin an object logically separate from the contents. */
|
|
|
767 |
/* (I.e., an object in the resource file.) */
|
|
|
768 |
long pdf_open_separate(gx_device_pdf * pdev, long id);
|
|
|
769 |
long pdf_begin_separate(gx_device_pdf * pdev);
|
|
|
770 |
|
|
|
771 |
/* Reserve object id. */
|
|
|
772 |
void pdf_reserve_object_id(gx_device_pdf * pdev, pdf_resource_t *ppres, long id);
|
|
|
773 |
|
|
|
774 |
/* Begin an aside (resource, annotation, ...). */
|
|
|
775 |
int pdf_alloc_aside(gx_device_pdf * pdev, pdf_resource_t ** plist,
|
|
|
776 |
const gs_memory_struct_type_t * pst, pdf_resource_t **ppres,
|
|
|
777 |
long id);
|
|
|
778 |
/* Begin an aside (resource, annotation, ...). */
|
|
|
779 |
int pdf_begin_aside(gx_device_pdf * pdev, pdf_resource_t **plist,
|
|
|
780 |
const gs_memory_struct_type_t * pst,
|
|
|
781 |
pdf_resource_t **ppres);
|
|
|
782 |
|
|
|
783 |
/* Begin a resource of a given type. */
|
|
|
784 |
int pdf_begin_resource(gx_device_pdf * pdev, pdf_resource_type_t rtype,
|
|
|
785 |
gs_id rid, pdf_resource_t **ppres);
|
|
|
786 |
|
|
|
787 |
/* Begin a resource body of a given type. */
|
|
|
788 |
int pdf_begin_resource_body(gx_device_pdf * pdev, pdf_resource_type_t rtype,
|
|
|
789 |
gs_id rid, pdf_resource_t **ppres);
|
|
|
790 |
|
|
|
791 |
/* Allocate a resource, but don't open the stream. */
|
|
|
792 |
int pdf_alloc_resource(gx_device_pdf * pdev, pdf_resource_type_t rtype,
|
|
|
793 |
gs_id rid, pdf_resource_t **ppres, long id);
|
|
|
794 |
|
|
|
795 |
/* Find same resource. */
|
|
|
796 |
int pdf_find_same_resource(gx_device_pdf * pdev,
|
|
|
797 |
pdf_resource_type_t rtype, pdf_resource_t **ppres,
|
|
|
798 |
int (*eq)(gx_device_pdf * pdev, pdf_resource_t *pres0, pdf_resource_t *pres1));
|
|
|
799 |
|
|
|
800 |
|
|
|
801 |
/* Find resource by resource id. */
|
|
|
802 |
pdf_resource_t *pdf_find_resource_by_resource_id(gx_device_pdf * pdev,
|
|
|
803 |
pdf_resource_type_t rtype, gs_id id);
|
|
|
804 |
|
|
|
805 |
/* Find a resource of a given type by gs_id. */
|
|
|
806 |
pdf_resource_t *pdf_find_resource_by_gs_id(gx_device_pdf * pdev,
|
|
|
807 |
pdf_resource_type_t rtype,
|
|
|
808 |
gs_id rid);
|
|
|
809 |
|
|
|
810 |
void pdf_drop_resources(gx_device_pdf * pdev, pdf_resource_type_t rtype,
|
|
|
811 |
int (*cond)(gx_device_pdf * pdev, pdf_resource_t *pres));
|
|
|
812 |
|
|
|
813 |
/* Print resource statistics. */
|
|
|
814 |
void pdf_print_resource_statistics(gx_device_pdf * pdev);
|
|
|
815 |
|
|
|
816 |
|
|
|
817 |
/* Cancel a resource (do not write it into PDF). */
|
|
|
818 |
int pdf_cancel_resource(gx_device_pdf * pdev, pdf_resource_t *pres,
|
|
|
819 |
pdf_resource_type_t rtype);
|
|
|
820 |
|
|
|
821 |
/* Remove a resource. */
|
|
|
822 |
void pdf_forget_resource(gx_device_pdf * pdev, pdf_resource_t *pres1,
|
|
|
823 |
pdf_resource_type_t rtype);
|
|
|
824 |
|
|
|
825 |
/* Substitute a resource with a same one. */
|
|
|
826 |
int pdf_substitute_resource(gx_device_pdf *pdev, pdf_resource_t **ppres,
|
|
|
827 |
pdf_resource_type_t rtype,
|
|
|
828 |
int (*eq)(gx_device_pdf *pdev, pdf_resource_t *pres0, pdf_resource_t *pres1),
|
|
|
829 |
bool write);
|
|
|
830 |
|
|
|
831 |
/* Get the object id of a resource. */
|
|
|
832 |
long pdf_resource_id(const pdf_resource_t *pres);
|
|
|
833 |
|
|
|
834 |
/* End a separate object. */
|
|
|
835 |
int pdf_end_separate(gx_device_pdf * pdev);
|
|
|
836 |
|
|
|
837 |
/* End an aside. */
|
|
|
838 |
int pdf_end_aside(gx_device_pdf * pdev);
|
|
|
839 |
|
|
|
840 |
/* End a resource. */
|
|
|
841 |
int pdf_end_resource(gx_device_pdf * pdev);
|
|
|
842 |
|
|
|
843 |
/*
|
|
|
844 |
* Write the Cos objects for resources local to a content stream.
|
|
|
845 |
*/
|
|
|
846 |
int pdf_write_resource_objects(gx_device_pdf *pdev, pdf_resource_type_t rtype);
|
|
|
847 |
|
|
|
848 |
/*
|
|
|
849 |
* Reverse resource chains.
|
|
|
850 |
* ps2write uses it with page resources.
|
|
|
851 |
* Assuming only the 0th chain contauns something.
|
|
|
852 |
*/
|
|
|
853 |
void pdf_reverse_resource_chain(gx_device_pdf *pdev, pdf_resource_type_t rtype);
|
|
|
854 |
|
|
|
855 |
/*
|
|
|
856 |
* Free unnamed Cos objects for resources local to a content stream.
|
|
|
857 |
*/
|
|
|
858 |
int pdf_free_resource_objects(gx_device_pdf *pdev, pdf_resource_type_t rtype);
|
|
|
859 |
|
|
|
860 |
/* Write and free all resource objects. */
|
|
|
861 |
|
|
|
862 |
int pdf_write_and_free_all_resource_objects(gx_device_pdf *pdev);
|
|
|
863 |
|
|
|
864 |
/*
|
|
|
865 |
* Store the resource sets for a content stream (page or XObject).
|
|
|
866 |
* Sets page->{procsets, resource_ids[], fonts_id}.
|
|
|
867 |
*/
|
|
|
868 |
int pdf_store_page_resources(gx_device_pdf *pdev, pdf_page_t *page);
|
|
|
869 |
|
|
|
870 |
/* Copy data from a temporary file to a stream. */
|
|
|
871 |
void pdf_copy_data(stream *s, FILE *file, long count, stream_arcfour_state *ss);
|
|
|
872 |
void pdf_copy_data_safe(stream *s, FILE *file, long position, long count);
|
|
|
873 |
|
|
|
874 |
/* Add the encryption filter. */
|
|
|
875 |
int pdf_begin_encrypt(gx_device_pdf * pdev, stream **s, gs_id object_id);
|
|
|
876 |
/* Remove the encryption filter. */
|
|
|
877 |
void pdf_end_encrypt(gx_device_pdf * pdev);
|
|
|
878 |
/* Initialize encryption. */
|
|
|
879 |
int pdf_encrypt_init(const gx_device_pdf * pdev, gs_id object_id, stream_arcfour_state *psarc4);
|
|
|
880 |
|
|
|
881 |
|
|
|
882 |
/* ------ Pages ------ */
|
|
|
883 |
|
|
|
884 |
/* Get or assign the ID for a page. */
|
|
|
885 |
/* Returns 0 if the page number is out of range. */
|
|
|
886 |
long pdf_page_id(gx_device_pdf * pdev, int page_num);
|
|
|
887 |
|
|
|
888 |
/* Get the page structure for the current page. */
|
|
|
889 |
pdf_page_t *pdf_current_page(gx_device_pdf *pdev);
|
|
|
890 |
|
|
|
891 |
/* Get the dictionary object for the current page. */
|
|
|
892 |
cos_dict_t *pdf_current_page_dict(gx_device_pdf *pdev);
|
|
|
893 |
|
|
|
894 |
/* Open a page for writing. */
|
|
|
895 |
int pdf_open_page(gx_device_pdf * pdev, pdf_context_t context);
|
|
|
896 |
|
|
|
897 |
/* Go to the unclipped stream context. */
|
|
|
898 |
int pdf_unclip(gx_device_pdf * pdev);
|
|
|
899 |
|
|
|
900 |
/* Write saved page- or document-level information. */
|
|
|
901 |
int pdf_write_saved_string(gx_device_pdf * pdev, gs_string * pstr);
|
|
|
902 |
|
|
|
903 |
/* ------ Path drawing ------ */
|
|
|
904 |
|
|
|
905 |
/* Store a copy of clipping path. */
|
|
|
906 |
int pdf_remember_clip_path(gx_device_pdf * pdev, const gx_clip_path * pcpath);
|
|
|
907 |
|
|
|
908 |
/* Test whether the clip path needs updating. */
|
|
|
909 |
bool pdf_must_put_clip_path(gx_device_pdf * pdev, const gx_clip_path * pcpath);
|
|
|
910 |
|
|
|
911 |
/* Write and update the clip path. */
|
|
|
912 |
int pdf_put_clip_path(gx_device_pdf * pdev, const gx_clip_path * pcpath);
|
|
|
913 |
|
|
|
914 |
/* ------ Masked image convertion ------ */
|
|
|
915 |
|
|
|
916 |
typedef struct pdf_lcvd_s {
|
|
|
917 |
gx_device_memory mdev;
|
|
|
918 |
gx_device_memory *mask;
|
|
|
919 |
gx_device_pdf *pdev;
|
|
|
920 |
dev_t_proc_fill_rectangle((*std_fill_rectangle), gx_device);
|
|
|
921 |
dev_t_proc_close_device((*std_close_device), gx_device);
|
|
|
922 |
bool mask_is_empty;
|
|
|
923 |
bool path_is_empty;
|
|
|
924 |
bool mask_is_clean;
|
|
|
925 |
bool write_matrix;
|
|
|
926 |
bool has_background;
|
|
|
927 |
gs_matrix m;
|
|
|
928 |
gs_point path_offset;
|
|
|
929 |
} pdf_lcvd_t;
|
|
|
930 |
|
|
|
931 |
#define public_st_pdf_lcvd_t()\
|
|
|
932 |
gs_public_st_suffix_add2(st_pdf_lcvd_t, pdf_lcvd_t,\
|
|
|
933 |
"pdf_lcvd_t", pdf_lcvd_t_enum_ptrs,\
|
|
|
934 |
pdf_lcvd_t_reloc_ptrs, st_device_memory, mask, pdev)
|
|
|
935 |
#define pdf_lcvd_t_max_ptrs (gx_device_memory_max_ptrs + 2)
|
|
|
936 |
|
|
|
937 |
|
|
|
938 |
int pdf_setup_masked_image_converter(gx_device_pdf *pdev, gs_memory_t *mem, const gs_matrix *m, pdf_lcvd_t **pcvd,
|
|
|
939 |
bool need_mask, int x, int y, int w, int h, bool write_on_close);
|
|
|
940 |
int pdf_dump_converted_image(gx_device_pdf *pdev, pdf_lcvd_t *cvd);
|
|
|
941 |
void pdf_remove_masked_image_converter(gx_device_pdf *pdev, pdf_lcvd_t *cvd, bool need_mask);
|
|
|
942 |
|
|
|
943 |
|
|
|
944 |
/* ------ Miscellaneous output ------ */
|
|
|
945 |
|
|
|
946 |
#define PDF_MAX_PRODUCER 200 /* adhoc */
|
|
|
947 |
/* Generate the default Producer string. */
|
|
|
948 |
void pdf_store_default_Producer(char buf[PDF_MAX_PRODUCER]);
|
|
|
949 |
|
|
|
950 |
/* Define the strings for filter names and parameters. */
|
|
|
951 |
typedef struct pdf_filter_names_s {
|
|
|
952 |
const char *ASCII85Decode;
|
|
|
953 |
const char *ASCIIHexDecode;
|
|
|
954 |
const char *CCITTFaxDecode;
|
|
|
955 |
const char *DCTDecode;
|
|
|
956 |
const char *DecodeParms;
|
|
|
957 |
const char *Filter;
|
|
|
958 |
const char *FlateDecode;
|
|
|
959 |
const char *LZWDecode;
|
|
|
960 |
const char *RunLengthDecode;
|
|
|
961 |
} pdf_filter_names_t;
|
|
|
962 |
#define PDF_FILTER_NAMES\
|
|
|
963 |
"/ASCII85Decode", "/ASCIIHexDecode", "/CCITTFaxDecode",\
|
|
|
964 |
"/DCTDecode", "/DecodeParms", "/Filter", "/FlateDecode",\
|
|
|
965 |
"/LZWDecode", "/RunLengthDecode"
|
|
|
966 |
#define PDF_FILTER_NAMES_SHORT\
|
|
|
967 |
"/A85", "/AHx", "/CCF", "/DCT", "/DP", "/F", "/Fl", "/LZW", "/RL"
|
|
|
968 |
|
|
|
969 |
/* Write matrix values. */
|
|
|
970 |
void pdf_put_matrix(gx_device_pdf *pdev, const char *before,
|
|
|
971 |
const gs_matrix *pmat, const char *after);
|
|
|
972 |
|
|
|
973 |
/* Write a name, with escapes for unusual characters. */
|
|
|
974 |
typedef int (*pdf_put_name_chars_proc_t)(stream *, const byte *, uint);
|
|
|
975 |
pdf_put_name_chars_proc_t
|
|
|
976 |
pdf_put_name_chars_proc(const gx_device_pdf *pdev);
|
|
|
977 |
int pdf_put_name_chars(const gx_device_pdf *pdev, const byte *nstr,
|
|
|
978 |
uint size);
|
|
|
979 |
int pdf_put_name(const gx_device_pdf *pdev, const byte *nstr, uint size);
|
|
|
980 |
|
|
|
981 |
/* Write a string in its shortest form ( () or <> ). */
|
|
|
982 |
int pdf_put_string(const gx_device_pdf *pdev, const byte *str, uint size);
|
|
|
983 |
|
|
|
984 |
/* Write a value, treating names specially. */
|
|
|
985 |
int pdf_write_value(const gx_device_pdf *pdev, const byte *vstr, uint size, gs_id object_id);
|
|
|
986 |
|
|
|
987 |
/* Store filters for a stream. */
|
|
|
988 |
int pdf_put_filters(cos_dict_t *pcd, gx_device_pdf *pdev, stream *s,
|
|
|
989 |
const pdf_filter_names_t *pfn);
|
|
|
990 |
|
|
|
991 |
/* Define a possibly encoded and compressed data stream. */
|
|
|
992 |
typedef struct pdf_data_writer_s {
|
|
|
993 |
psdf_binary_writer binary;
|
|
|
994 |
long start;
|
|
|
995 |
long length_pos;
|
|
|
996 |
pdf_resource_t *pres;
|
|
|
997 |
gx_device_pdf *pdev; /* temporary for backward compatibility of pdf_end_data prototype. */
|
|
|
998 |
long length_id;
|
|
|
999 |
bool encrypted;
|
|
|
1000 |
} pdf_data_writer_t;
|
|
|
1001 |
/*
|
|
|
1002 |
* Begin a data stream. The client has opened the object and written
|
|
|
1003 |
* the << and any desired dictionary keys.
|
|
|
1004 |
*/
|
|
|
1005 |
#define DATA_STREAM_NOT_BINARY 0 /* data are text, not binary */
|
|
|
1006 |
#define DATA_STREAM_BINARY 1 /* data are binary */
|
|
|
1007 |
#define DATA_STREAM_COMPRESS 2 /* OK to compress data */
|
|
|
1008 |
#define DATA_STREAM_NOLENGTH 4 /* Skip the length reference and filter names writing. */
|
|
|
1009 |
#define DATA_STREAM_ENCRYPT 8 /* Encrypt data. */
|
|
|
1010 |
int pdf_begin_data_stream(gx_device_pdf *pdev, pdf_data_writer_t *pdw,
|
|
|
1011 |
int options, gs_id object_id);
|
|
|
1012 |
int pdf_append_data_stream_filters(gx_device_pdf *pdev, pdf_data_writer_t *pdw,
|
|
|
1013 |
int orig_options, gs_id object_id);
|
|
|
1014 |
/* begin_data = begin_data_binary with both options = true. */
|
|
|
1015 |
int pdf_begin_data(gx_device_pdf *pdev, pdf_data_writer_t *pdw);
|
|
|
1016 |
|
|
|
1017 |
/* End a data stream. */
|
|
|
1018 |
int pdf_end_data(pdf_data_writer_t *pdw);
|
|
|
1019 |
|
|
|
1020 |
/* ------ Functions ------ */
|
|
|
1021 |
|
|
|
1022 |
/* Define the maximum size of a Function reference. */
|
|
|
1023 |
#define MAX_REF_CHARS ((sizeof(long) * 8 + 2) / 3)
|
|
|
1024 |
|
|
|
1025 |
/*
|
|
|
1026 |
* Create a Function object with or without range scaling. Scaling means
|
|
|
1027 |
* that if x[i] is the i'th output value from the original Function,
|
|
|
1028 |
* the i'th output value from the Function object will be (x[i] -
|
|
|
1029 |
* ranges[i].rmin) / (ranges[i].rmax - ranges[i].rmin). Note that this is
|
|
|
1030 |
* the inverse of the scaling convention for Functions per se.
|
|
|
1031 |
*/
|
|
|
1032 |
#ifndef gs_function_DEFINED
|
|
|
1033 |
typedef struct gs_function_s gs_function_t;
|
|
|
1034 |
# define gs_function_DEFINED
|
|
|
1035 |
#endif
|
|
|
1036 |
int pdf_function(gx_device_pdf *pdev, const gs_function_t *pfn,
|
|
|
1037 |
cos_value_t *pvalue);
|
|
|
1038 |
int pdf_function_scaled(gx_device_pdf *pdev, const gs_function_t *pfn,
|
|
|
1039 |
const gs_range_t *pranges, cos_value_t *pvalue);
|
|
|
1040 |
|
|
|
1041 |
/* Write a Function object, returning its object ID. */
|
|
|
1042 |
int pdf_write_function(gx_device_pdf *pdev, const gs_function_t *pfn,
|
|
|
1043 |
long *pid);
|
|
|
1044 |
|
|
|
1045 |
/* ------ Fonts ------ */
|
|
|
1046 |
|
|
|
1047 |
/* Write a FontBBox dictionary element. */
|
|
|
1048 |
int pdf_write_font_bbox(gx_device_pdf *pdev, const gs_int_rect *pbox);
|
|
|
1049 |
|
|
|
1050 |
/* ---------------- Exported by gdevpdfm.c ---------------- */
|
|
|
1051 |
|
|
|
1052 |
/*
|
|
|
1053 |
* Define the type for a pdfmark-processing procedure.
|
|
|
1054 |
* If nameable is false, the objname argument is always NULL.
|
|
|
1055 |
*/
|
|
|
1056 |
#define pdfmark_proc(proc)\
|
|
|
1057 |
int proc(gx_device_pdf *pdev, gs_param_string *pairs, uint count,\
|
|
|
1058 |
const gs_matrix *pctm, const gs_param_string *objname)
|
|
|
1059 |
|
|
|
1060 |
/* Compare a C string and a gs_param_string. */
|
|
|
1061 |
bool pdf_key_eq(const gs_param_string * pcs, const char *str);
|
|
|
1062 |
|
|
|
1063 |
/* Scan an integer out of a parameter string. */
|
|
|
1064 |
int pdfmark_scan_int(const gs_param_string * pstr, int *pvalue);
|
|
|
1065 |
|
|
|
1066 |
/* Process a pdfmark (called from pdf_put_params). */
|
|
|
1067 |
int pdfmark_process(gx_device_pdf * pdev, const gs_param_string_array * pma);
|
|
|
1068 |
|
|
|
1069 |
/* Close the current level of the outline tree. */
|
|
|
1070 |
int pdfmark_close_outline(gx_device_pdf * pdev);
|
|
|
1071 |
|
|
|
1072 |
/* Close the pagelabel numtree. */
|
|
|
1073 |
int pdfmark_end_pagelabels(gx_device_pdf * pdev);
|
|
|
1074 |
|
|
|
1075 |
/* Finish writing an article. */
|
|
|
1076 |
int pdfmark_write_article(gx_device_pdf * pdev, const pdf_article_t * part);
|
|
|
1077 |
|
|
|
1078 |
/* ---------------- Exported by gdevpdfr.c ---------------- */
|
|
|
1079 |
|
|
|
1080 |
/* Test whether an object name has valid syntax, {name}. */
|
|
|
1081 |
bool pdf_objname_is_valid(const byte *data, uint size);
|
|
|
1082 |
|
|
|
1083 |
/*
|
|
|
1084 |
* Look up a named object. Return e_rangecheck if the syntax is invalid,
|
|
|
1085 |
* e_undefined if no object by that name exists.
|
|
|
1086 |
*/
|
|
|
1087 |
int pdf_find_named(gx_device_pdf * pdev, const gs_param_string * pname,
|
|
|
1088 |
cos_object_t **ppco);
|
|
|
1089 |
|
|
|
1090 |
/*
|
|
|
1091 |
* Create a named object. id = -1L means do not assign an id. pname = 0
|
|
|
1092 |
* means just create the object, do not name it.
|
|
|
1093 |
*/
|
|
|
1094 |
int pdf_create_named(gx_device_pdf *pdev, const gs_param_string *pname,
|
|
|
1095 |
cos_type_t cotype, cos_object_t **ppco, long id);
|
|
|
1096 |
int pdf_create_named_dict(gx_device_pdf *pdev, const gs_param_string *pname,
|
|
|
1097 |
cos_dict_t **ppcd, long id);
|
|
|
1098 |
|
|
|
1099 |
/*
|
|
|
1100 |
* Look up a named object as for pdf_find_named. If the object does not
|
|
|
1101 |
* exist, create it (as a dictionary if it is one of the predefined names
|
|
|
1102 |
* {ThisPage}, {NextPage}, {PrevPage}, or {Page<#>}, otherwise as a
|
|
|
1103 |
* generic object) and return 1.
|
|
|
1104 |
*/
|
|
|
1105 |
int pdf_refer_named(gx_device_pdf *pdev, const gs_param_string *pname,
|
|
|
1106 |
cos_object_t **ppco);
|
|
|
1107 |
|
|
|
1108 |
/*
|
|
|
1109 |
* Look up a named object as for pdf_refer_named. If the object already
|
|
|
1110 |
* exists and is not simply a forward reference, return e_rangecheck;
|
|
|
1111 |
* if it exists as a forward reference, set its type and return 0;
|
|
|
1112 |
* otherwise, create the object with the given type and return 1.
|
|
|
1113 |
* pname = 0 is allowed: in this case, simply create the object.
|
|
|
1114 |
*/
|
|
|
1115 |
int pdf_make_named(gx_device_pdf * pdev, const gs_param_string * pname,
|
|
|
1116 |
cos_type_t cotype, cos_object_t **ppco, bool assign_id);
|
|
|
1117 |
int pdf_make_named_dict(gx_device_pdf * pdev, const gs_param_string * pname,
|
|
|
1118 |
cos_dict_t **ppcd, bool assign_id);
|
|
|
1119 |
|
|
|
1120 |
/*
|
|
|
1121 |
* Look up a named object as for pdf_refer_named. If the object does not
|
|
|
1122 |
* exist, or is a forward reference, return e_undefined; if the object
|
|
|
1123 |
* exists has the wrong type, return e_typecheck.
|
|
|
1124 |
*/
|
|
|
1125 |
int pdf_get_named(gx_device_pdf * pdev, const gs_param_string * pname,
|
|
|
1126 |
cos_type_t cotype, cos_object_t **ppco);
|
|
|
1127 |
|
|
|
1128 |
/*
|
|
|
1129 |
* Push the current local namespace onto the namespace stack, and reset it
|
|
|
1130 |
* to an empty namespace.
|
|
|
1131 |
*/
|
|
|
1132 |
int pdf_push_namespace(gx_device_pdf *pdev);
|
|
|
1133 |
|
|
|
1134 |
/*
|
|
|
1135 |
* Pop the top local namespace from the namespace stack. Return an error if
|
|
|
1136 |
* the stack is empty.
|
|
|
1137 |
*/
|
|
|
1138 |
int pdf_pop_namespace(gx_device_pdf *pdev);
|
|
|
1139 |
|
|
|
1140 |
/*
|
|
|
1141 |
* Scan a string for a token. <<, >>, [, and ] are treated as tokens.
|
|
|
1142 |
* Return 1 if a token was scanned, 0 if we reached the end of the string,
|
|
|
1143 |
* or an error. On a successful return, the token extends from *ptoken up
|
|
|
1144 |
* to but not including *pscan.
|
|
|
1145 |
*/
|
|
|
1146 |
int pdf_scan_token(const byte **pscan, const byte * end, const byte **ptoken);
|
|
|
1147 |
|
|
|
1148 |
/*
|
|
|
1149 |
* Scan a possibly composite token: arrays and dictionaries are treated as
|
|
|
1150 |
* single tokens.
|
|
|
1151 |
*/
|
|
|
1152 |
int pdf_scan_token_composite(const byte **pscan, const byte * end,
|
|
|
1153 |
const byte **ptoken);
|
|
|
1154 |
|
|
|
1155 |
/* Replace object names with object references in a (parameter) string. */
|
|
|
1156 |
int pdf_replace_names(gx_device_pdf *pdev, const gs_param_string *from,
|
|
|
1157 |
gs_param_string *to);
|
|
|
1158 |
|
|
|
1159 |
/* ================ Text module procedures ================ */
|
|
|
1160 |
|
|
|
1161 |
/* ---------------- Exported by gdevpdfw.c ---------------- */
|
|
|
1162 |
|
|
|
1163 |
/* For gdevpdf.c */
|
|
|
1164 |
|
|
|
1165 |
/*
|
|
|
1166 |
* Close the text-related parts of a document, including writing out font
|
|
|
1167 |
* and related resources.
|
|
|
1168 |
*/
|
|
|
1169 |
int pdf_close_text_document(gx_device_pdf *pdev);
|
|
|
1170 |
|
|
|
1171 |
/* ---------------- Exported by gdevpdft.c ---------------- */
|
|
|
1172 |
|
|
|
1173 |
/* For gdevpdf.c */
|
|
|
1174 |
|
|
|
1175 |
pdf_text_data_t *pdf_text_data_alloc(gs_memory_t *mem);
|
|
|
1176 |
void pdf_set_text_state_default(pdf_text_state_t *pts);
|
|
|
1177 |
void pdf_text_state_copy(pdf_text_state_t *pts_to, pdf_text_state_t *pts_from);
|
|
|
1178 |
void pdf_reset_text_page(pdf_text_data_t *ptd);
|
|
|
1179 |
void pdf_reset_text_state(pdf_text_data_t *ptd);
|
|
|
1180 |
void pdf_close_text_page(gx_device_pdf *pdev);
|
|
|
1181 |
|
|
|
1182 |
/* For gdevpdfb.c */
|
|
|
1183 |
|
|
|
1184 |
int pdf_char_image_y_offset(const gx_device_pdf *pdev, int x, int y, int h);
|
|
|
1185 |
|
|
|
1186 |
/* Begin a CharProc for an embedded (bitmap) font. */
|
|
|
1187 |
int pdf_begin_char_proc(gx_device_pdf * pdev, int w, int h, int x_width,
|
|
|
1188 |
int y_offset, gs_id id, pdf_char_proc_t **ppcp,
|
|
|
1189 |
pdf_stream_position_t * ppos);
|
|
|
1190 |
|
|
|
1191 |
/* End a CharProc. */
|
|
|
1192 |
int pdf_end_char_proc(gx_device_pdf * pdev, pdf_stream_position_t * ppos);
|
|
|
1193 |
|
|
|
1194 |
/* Put out a reference to an image as a character in an embedded font. */
|
|
|
1195 |
int pdf_do_char_image(gx_device_pdf * pdev, const pdf_char_proc_t * pcp,
|
|
|
1196 |
const gs_matrix * pimat);
|
|
|
1197 |
|
|
|
1198 |
/* Start charproc accumulation for a Type 3 font. */
|
|
|
1199 |
int pdf_start_charproc_accum(gx_device_pdf *pdev);
|
|
|
1200 |
/* Install charproc accumulator for a Type 3 font. */
|
|
|
1201 |
int pdf_set_charproc_attrs(gx_device_pdf *pdev, gs_font *font, const double *pw, int narg,
|
|
|
1202 |
gs_text_cache_control_t control, gs_char ch, gs_const_string *gnstr);
|
|
|
1203 |
/* Complete charproc accumulation for aType 3 font. */
|
|
|
1204 |
int pdf_end_charproc_accum(gx_device_pdf *pdev, gs_font *font,
|
|
|
1205 |
const pdf_char_glyph_pairs_t *cgp);
|
|
|
1206 |
|
|
|
1207 |
/* Open a stream object in the temporary file. */
|
|
|
1208 |
int pdf_open_aside(gx_device_pdf *pdev, pdf_resource_type_t rtype,
|
|
|
1209 |
gs_id id, pdf_resource_t **ppres, bool reserve_object_id, int options);
|
|
|
1210 |
|
|
|
1211 |
/* Close a stream object in the temporary file. */
|
|
|
1212 |
int pdf_close_aside(gx_device_pdf *pdev);
|
|
|
1213 |
|
|
|
1214 |
/* Enter the substream accumulation mode. */
|
|
|
1215 |
int pdf_enter_substream(gx_device_pdf *pdev, pdf_resource_type_t rtype,
|
|
|
1216 |
gs_id id, pdf_resource_t **ppres, bool reserve_object_id, bool compress);
|
|
|
1217 |
|
|
|
1218 |
/* Exit the substream accumulation mode. */
|
|
|
1219 |
int pdf_exit_substream(gx_device_pdf *pdev);
|
|
|
1220 |
/* Add procsets to substream Resources. */
|
|
|
1221 |
int pdf_add_procsets(cos_dict_t *pcd, pdf_procset_t procsets);
|
|
|
1222 |
/* Add a resource to substream Resources. */
|
|
|
1223 |
int pdf_add_resource(gx_device_pdf *pdev, cos_dict_t *pcd, const char *key, pdf_resource_t *pres);
|
|
|
1224 |
|
|
|
1225 |
|
|
|
1226 |
/* For gdevpdfu.c */
|
|
|
1227 |
|
|
|
1228 |
int pdf_from_stream_to_text(gx_device_pdf *pdev);
|
|
|
1229 |
int pdf_from_string_to_text(gx_device_pdf *pdev);
|
|
|
1230 |
void pdf_close_text_contents(gx_device_pdf *pdev);
|
|
|
1231 |
|
|
|
1232 |
#endif /* gdevpdfx_INCLUDED */
|