Subversion Repositories planix.SVN

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
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 */