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