Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
/* Copyright (C) 2002 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: gdevpdtf.h,v 1.28 2005/04/05 09:48:46 igor Exp $ */
18
/* Font and CMap resource structure and API for pdfwrite */
19
 
20
#ifndef gdevpdtf_INCLUDED
21
#  define gdevpdtf_INCLUDED
22
 
23
#include "gdevpdtx.h"
24
 
25
/* ================ Types and structures ================ */
26
 
27
/* ---------------- Font resources ---------------- */
28
 
29
/*
30
 * pdfwrite manages several different flavors of font resources:
31
 *
32
 *  Those that have neither a FontDescriptor nor a base_font:
33
 *	Type 0 (composite) fonts
34
 *  Those that have no FontDescriptor, but do have a base_font:
35
 *	Standard 14 fonts
36
 *  Those that have a FontDescriptor but no base_font:
37
 *	Type 3 bitmap fonts
38
 *  Those that have a FontDescriptor with a base_font:
39
 *	Type 1 / Type 2 fonts
40
 *	Type 42 (TrueType) fonts
41
 *	CIDFontType 0 (Type 1/2) CIDFonts
42
 *	CIDFontType 2 (TrueType) CIDFonts
43
 */
44
/*
45
 * Font names in PDF files have caused an enormous amount of trouble, so we
46
 * document specifically how they are handled in each structure.
47
 *
48
 * The PDF Reference specifies the BaseFont of a font resource as follows,
49
 * depending on the font type:
50
 *
51
 *   Type 0 - if the descendant font is CIDFontType 0, the descendant font
52
 *     name followed by a hyphen and the CMap name (the value of Encoding,
53
 *     if a name, otherwise the CMapName from the CMap); if the descendant
54
 *     font is CIDFontType 2, the descendant font name.
55
 *
56
 *   Type 1 - "usually" the same as the FontName in the base font.
57
 *
58
 *   MM Type 1 - if embedded, the same as Type 1; if not embedded, spaces
59
 *     in the font name are replaced with underscores.
60
 *
61
 *   Type 3 - not used.
62
 *
63
 *   TrueType - initially, the PostScript name from the 'name' table in
64
 *     the font; if none, the "name by which the font is known in the host
65
 *     operating system".  Spaces are removed.  Then, under circumstances
66
 *     not defined, the string ",Bold", ",Italic", or ",BoldItalic" is
67
 *     appended if the font has the corresponding style properties.
68
 *     [We do not do this: we simply use the key_name or font_name.]
69
 *
70
 *   CIDFontType 0 - "usually" the same as the CIDFontName in the base font.
71
 *
72
 *   CIDFontType 2 - the same as TrueType.
73
 *
74
 * In addition, the BaseFont has a XXXXXX+ prefix if the font is a subset
75
 * (whether embedded or not).
76
 *
77
 * We would like to compute the BaseFont at the time that we create the font
78
 * resource object.  The font descriptor (which is needed to provide
79
 * information about embedding) and the base font are both available at that
80
 * time.  Unfortunately, the information as to whether the font will be
81
 * subsetted is not available.  Therefore, we do compute the BaseFont from
82
 * the base font name when the font resource is created, to allow checking
83
 * for duplicate names and for standard font names, but we compute it again
84
 * after writing out the base font.
85
 */
86
 
87
#ifndef gs_cmap_DEFINED
88
#  define gs_cmap_DEFINED
89
typedef struct gs_cmap_s gs_cmap_t;
90
#endif
91
 
92
#ifndef gs_font_type0_DEFINED
93
#  define gs_font_type0_DEFINED
94
typedef struct gs_font_type0_s gs_font_type0;
95
#endif
96
 
97
#ifndef pdf_base_font_DEFINED
98
#  define pdf_base_font_DEFINED
99
typedef struct pdf_base_font_s pdf_base_font_t;
100
#endif
101
 
102
#ifndef pdf_font_descriptor_DEFINED
103
#  define pdf_font_descriptor_DEFINED
104
typedef struct pdf_font_descriptor_s pdf_font_descriptor_t;
105
#endif
106
 
107
#ifndef pdf_char_glyph_pair_DEFINED
108
#  define pdf_char_glyph_pair_DEFINED
109
typedef struct pdf_char_glyph_pair_s pdf_char_glyph_pair_t;
110
#endif
111
 
112
struct pdf_char_glyph_pair_s {
113
    gs_char chr;
114
    gs_glyph glyph;
115
};
116
 
117
/*
118
 * The write_contents procedure is set by the implementation when the
119
 * font resource is created.  It is called after generic code has opened
120
 * the resource object and written the Type, BaseFont (if any),
121
 * FontDescriptor reference (if any), ToUnicode CMap reference (if any),
122
 * and additional dictionary entries (if any).
123
 * The write_contents procedure must write any remaining entries specific
124
 * to the FontType, followed by the closing ">>", and then call
125
 * pdf_end_separate.  The reason for this division of function is to allow
126
 * the write_contents procedure to write additional objects that the
127
 * resource object references, after closing the resource object.
128
 */
129
typedef int (*pdf_font_write_contents_proc_t)
130
     (gx_device_pdf *, pdf_font_resource_t *);
131
 
132
/*
133
 * Define an element of an Encoding.  The element is unused if glyph ==
134
 * GS_NO_GLYPH.
135
 */
136
typedef struct pdf_encoding_element_s {
137
    gs_glyph glyph;
138
    gs_const_string str;
139
    bool is_difference;		/* true if must be written in Differences */
140
} pdf_encoding_element_t;
141
#define private_st_pdf_encoding1() /* gdevpdtf.c */\
142
  gs_private_st_const_strings1(st_pdf_encoding1,\
143
    pdf_encoding_element_t, "pdf_encoding_element_t",\
144
    pdf_encoding1_enum_ptrs, pdf_encoding1_reloc_ptrs, str)
145
#define private_st_pdf_encoding_element() /* gdevpdtf.c */\
146
  gs_private_st_element(st_pdf_encoding_element, pdf_encoding_element_t,\
147
    "pdf_encoding_element_t[]", pdf_encoding_elt_enum_ptrs,\
148
    pdf_encoding_elt_reloc_ptrs, st_pdf_encoding1)
149
 
150
typedef struct {
151
    gs_id id;
152
    pdf_resource_type_t type;
153
} pdf_resource_ref_t;
154
 
155
/*
156
 * Widths are the widths in the outlines: this is what PDF interpreters
157
 * use, and what will be written in the PDF file.  real_widths are the
158
 * widths possibly modified by Metrics[2] and CDevProc: these define the
159
 * actual advance widths of the characters in the PostScript text.
160
 */
161
struct pdf_font_resource_s {
162
    pdf_resource_common(pdf_font_resource_t);
163
    font_type FontType;		/* copied from font, if any */
164
    pdf_font_write_contents_proc_t write_contents;
165
    gs_string BaseFont;		/* (not used for Type 3) */
166
    pdf_font_descriptor_t *FontDescriptor; /* (not used for Type 0, Type 3, */
167
				/* or standard 14 fonts) */
168
    /*
169
     * The base_font member is only used for
170
     * the standard 14 fonts, which do not have a FontDescriptor.
171
     */
172
    pdf_base_font_t *base_font;	/* == FontDescriptor->base_font */
173
    uint count;			/* # of chars/CIDs */
174
    double *Widths;		/* [count] (not used for Type 0) */
175
    byte *used;			/* [ceil(count/8)] bitmap of chars/CIDs used */
176
				/* (not used for Type 0 or Type 3) */
177
    pdf_resource_t *res_ToUnicode; /* CMap (not used for CIDFonts) */
178
    gs_cmap_t *cmap_ToUnicode;	   /* CMap (not used for CIDFonts) */
179
    union {
180
 
181
	struct /*type0*/ {
182
 
183
	    pdf_font_resource_t *DescendantFont; /* CIDFont */
184
	    /*
185
	     * The Encoding_name must be long enough to hold either the
186
	     * longest standard CMap name defined in the PDF Reference,
187
	     * or the longest reference to an embedded CMap (# 0 R).
188
	     */
189
	    char Encoding_name[max( /* standard name or <id> 0 R */
190
		      17,	/* /UniJIS-UCS2-HW-H */
191
		      sizeof(long) * 8 / 3 + 1 + 4 /* <id> 0 R */
192
		      ) + 1	/* \0 terminator */
193
	    ];
194
	    gs_const_string CMapName; /* copied from the original CMap, */
195
				/* or references the table of standard names */
196
	    bool cmap_is_standard;
197
	    int WMode;		/* of CMap */
198
 
199
	} type0;
200
 
201
	struct /*cidfont*/ {
202
 
203
	    /* [D]W[2] is Widths. */
204
	    long CIDSystemInfo_id; /* (written when font is allocated) */
205
	    ushort *CIDToGIDMap; /* (CIDFontType 2 only) [count] */
206
 	    gs_id glyphshow_font_id;
207
	    double *Widths2;	/* [count * 2] (x, y) */
208
	    double *v;		/* [count] */
209
	    byte *used2;	/* [(count + 7) / 8] */
210
	    pdf_font_resource_t *parent;
211
 
212
	} cidfont;
213
 
214
	struct /*simple*/ {
215
 
216
	    int FirstChar, LastChar; /* 0 <= FirstChar <= LastChar <= 255 */
217
	    /*
218
	     * The BaseEncoding can only be ENCODING_INDEX_WINANSI,
219
	     * ENCODING_INDEX_MACROMAN, ENCODING_INDEX_MACEXPERT, or -1.
220
	     */
221
	    gs_encoding_index_t BaseEncoding;
222
	    pdf_encoding_element_t *Encoding; /* [256], not for Type 3 */
223
	    gs_point *v; /* [256], glyph origin for WMode 1 */
224
 
225
	    union {
226
 
227
		struct /*type1*/ {
228
		    bool is_MM_instance;
229
		} type1;
230
 
231
		struct /*truetype*/ {
232
		    /*
233
		     * No extra info needed, but the ANSI standard doesn't
234
		     * allow empty structs.
235
		     */
236
		    int _dummy;
237
		} truetype;
238
 
239
		struct /*type3*/ {
240
		    gs_int_rect FontBBox;
241
		    gs_matrix FontMatrix;
242
		    pdf_char_proc_t *char_procs;
243
		    int max_y_offset;
244
		    bool bitmap_font;
245
		    pdf_resource_ref_t *used_resources;
246
		    int used_resources_count;
247
		    int used_resources_max;
248
		    byte *cached;
249
		} type3;
250
 
251
	    } s;
252
 
253
	} simple;
254
 
255
    } u;
256
};
257
/* The GC descriptor for resource types must be public. */
258
#define public_st_pdf_font_resource() /* gdevpdtf.c */\
259
  gs_public_st_composite(st_pdf_font_resource, pdf_font_resource_t,\
260
    "pdf_font_resource_t", pdf_font_resource_enum_ptrs,\
261
    pdf_font_resource_reloc_ptrs)
262
 
263
/*
264
 * Define the possible embedding statuses of a font.
265
 */
266
typedef enum {
267
    FONT_EMBED_STANDARD,	/* 14 standard fonts */
268
    FONT_EMBED_NO,
269
    FONT_EMBED_YES
270
} pdf_font_embed_t;
271
 
272
/* ---------------- Global structures ---------------- */
273
 
274
/*
275
 * Define a structure for keeping track of the (unique) resource for
276
 * each standard font.  Note that standard fonts do not have descriptors:
277
 * the base_font and copied_font members of the font resource provide the
278
 * necessary information.
279
 */
280
typedef struct pdf_standard_font_s {
281
    pdf_font_resource_t *pdfont;
282
    gs_matrix orig_matrix;	/* ****** do we need this? */
283
} pdf_standard_font_t;
284
#define private_st_pdf_standard_font() /* gdevpdtf.c */\
285
  gs_private_st_ptrs1(st_pdf_standard_font, pdf_standard_font_t,\
286
    "pdf_standard_font_t", pdf_std_font_enum_ptrs, pdf_std_font_reloc_ptrs,\
287
    pdfont)
288
#define private_st_pdf_standard_font_element() /* gdevpdtf.c */\
289
  gs_private_st_element(st_pdf_standard_font_element, pdf_standard_font_t,\
290
    "pdf_standard_font_t[]", pdf_std_font_elt_enum_ptrs,\
291
    pdf_std_font_elt_reloc_ptrs, st_pdf_standard_font)
292
 
293
/*
294
 * There is a single instance (per device) of a structure that tracks global
295
 * information about outline fonts.  It is defined here, rather than
296
 * opaquely in the implementation file, because the text processing code
297
 * needs access to it.
298
 */
299
 
300
/*typedef struct pdf_outline_fonts_s pdf_outline_fonts_t;*/  /* gdevpdtx.h */
301
struct pdf_outline_fonts_s {
302
    pdf_standard_font_t *standard_fonts; /* [PDF_NUM_STANDARD_FONTS] */
303
};
304
#define private_st_pdf_outline_fonts() /* gdevpdtf.c */\
305
  gs_private_st_ptrs1(st_pdf_outline_fonts, pdf_outline_fonts_t,\
306
    "pdf_outline_fonts_t", pdf_outline_fonts_enum_ptrs,\
307
    pdf_outline_fonts_reloc_ptrs, standard_fonts)
308
 
309
/* ================ Procedures ================ */
310
 
311
/* ---------------- Font resources ---------------- */
312
 
313
/*
314
 * Allocate and initialize bookkeeping for outline fonts.
315
 */
316
pdf_outline_fonts_t *pdf_outline_fonts_alloc(gs_memory_t *mem);
317
 
318
/*
319
 * Return the standard fonts array.
320
 */
321
pdf_standard_font_t *pdf_standard_fonts(const gx_device_pdf *pdev);
322
 
323
/*
324
 * Clean the standard fonts array.
325
 */
326
void pdf_clean_standard_fonts(const gx_device_pdf *pdev);
327
 
328
/* Free font cache. */
329
int pdf_free_font_cache(gx_device_pdf *pdev);
330
 
331
/*
332
 * Allocate specific types of font resource.
333
 */
334
int pdf_font_type0_alloc(gx_device_pdf *pdev, pdf_font_resource_t **ppfres,
335
			 gs_id rid, pdf_font_resource_t *DescendantFont,
336
			 const gs_const_string *CMapName);
337
int pdf_font_type3_alloc(gx_device_pdf *pdev, pdf_font_resource_t **ppfres,
338
			 pdf_font_write_contents_proc_t write_contents);
339
int pdf_font_std_alloc(gx_device_pdf *pdev, pdf_font_resource_t **ppfres,
340
		   bool is_original, gs_id rid, gs_font_base *pfont, int index);
341
int pdf_font_simple_alloc(gx_device_pdf *pdev, pdf_font_resource_t **ppfres,
342
			  gs_id rid, pdf_font_descriptor_t *pfd);
343
int pdf_font_cidfont_alloc(gx_device_pdf *pdev, pdf_font_resource_t **ppfres,
344
			   gs_id rid, pdf_font_descriptor_t *pfd);
345
int pdf_obtain_cidfont_widths_arrays(gx_device_pdf *pdev, pdf_font_resource_t *pdfont, 
346
		    int wmode, double **w, double **w0, double **v);
347
int font_resource_encoded_alloc(gx_device_pdf *pdev, pdf_font_resource_t **ppfres,
348
			    gs_id rid, font_type ftype,
349
			    pdf_font_write_contents_proc_t write_contents);
350
 
351
/* Resize font resource arrays. */
352
int pdf_resize_resource_arrays(gx_device_pdf *pdev, pdf_font_resource_t *pfres, 
353
	int chars_count);
354
 
355
/*
356
 * Return the (copied, subset or complete) font associated with a font resource.
357
 * If this font resource doesn't have a descriptor (Type 0, Type 3, or
358
 * standard 14), return 0.
359
 */
360
gs_font_base *pdf_font_resource_font(const pdf_font_resource_t *pdfont, bool complete);
361
 
362
/*
363
 * Determine the embedding status of a font.  If the font is in the base
364
 * 14, store its index (0..13) in *pindex and its similarity to the base
365
 * font (as determined by the font's same_font procedure) in *psame.
366
 * (pindex and/or psame may be NULL.)
367
 */
368
pdf_font_embed_t pdf_font_embed_status(gx_device_pdf *pdev, gs_font *font,
369
				       int *pindex,
370
				       pdf_char_glyph_pair_t *pairs, int num_glyphs);
371
 
372
/*
373
 * Compute the BaseFont of a font according to the algorithm described
374
 * above.
375
 */
376
int pdf_compute_BaseFont(gx_device_pdf *pdev, pdf_font_resource_t *pdfont, bool finish);
377
 
378
/*
379
 * Close the text-related parts of a document, including writing out font
380
 * and related resources.
381
 */
382
int pdf_close_text_document(gx_device_pdf *pdev); /* in gdevpdtw.c */
383
 
384
/*
385
 * Choose a name for embedded font.
386
 */
387
const gs_font_name *pdf_choose_font_name(gs_font *font, bool key_name);
388
 
389
/* ---------------- CMap resources ---------------- */
390
 
391
/*
392
 * Allocate a CMap resource.
393
 */
394
int pdf_cmap_alloc(gx_device_pdf *pdev, const gs_cmap_t *pcmap,
395
		   pdf_resource_t **ppres /* CMap */, int font_index_only);
396
 
397
/*
398
 * Add a CID-to-GID mapping to a CIDFontType 2 font resource.
399
 */
400
int pdf_font_add_cid_to_gid(pdf_font_resource_t *pdfont, uint cid, uint gid);
401
 
402
#endif /* gdevpdtf_INCLUDED */