xref: /plan9/sys/src/cmd/gs/src/gdevpdtd.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: gdevpdtd.h,v 1.5 2005/04/05 15:44:44 igor Exp $ */
18*593dc095SDavid du Colombier /* FontDescriptor structure and API for pdfwrite */
19*593dc095SDavid du Colombier 
20*593dc095SDavid du Colombier #ifndef gdevpdtd_INCLUDED
21*593dc095SDavid du Colombier #  define gdevpdtd_INCLUDED
22*593dc095SDavid du Colombier 
23*593dc095SDavid du Colombier #include "gdevpdtx.h"
24*593dc095SDavid du Colombier #include "gdevpdtb.h"
25*593dc095SDavid du Colombier 
26*593dc095SDavid du Colombier /* ================ Types and structures ================ */
27*593dc095SDavid du Colombier 
28*593dc095SDavid du Colombier /*
29*593dc095SDavid du Colombier  * FontDescriptors are handled as pseudo-resources.  Multiple Font resources
30*593dc095SDavid du Colombier  * may share a descriptor.  We don't need to use reference counting to keep
31*593dc095SDavid du Colombier  * track of this, since all descriptors persist until the device is closed.
32*593dc095SDavid du Colombier  * The CharSet entry in the FontDescriptor for a Type 1 subset font lists
33*593dc095SDavid du Colombier  * the glyphs that are included in the subset, so the FontDescriptor cannot
34*593dc095SDavid du Colombier  * be written until the font has been written, but we could use an indirect
35*593dc095SDavid du Colombier  * object for the CharSet and write the FontDescriptor itself early.
36*593dc095SDavid du Colombier  * However, we don't think that is worthwhile, since FontDescriptors are
37*593dc095SDavid du Colombier  * small objects compared to the fonts themselves, and it's simpler to keep
38*593dc095SDavid du Colombier  * all the FontDescriptors until the end.
39*593dc095SDavid du Colombier  *
40*593dc095SDavid du Colombier  * Note that FontDescriptors and BaseFonts correspond 1-to-1.  While the PDF
41*593dc095SDavid du Colombier  * specification allows multiple FontDescriptors for a single BaseFont, this
42*593dc095SDavid du Colombier  * has no value: all the information in the FontDescriptor is derived from
43*593dc095SDavid du Colombier  * the BaseFont, so all the FontDescriptors for the same BaseFont must be
44*593dc095SDavid du Colombier  * the same.
45*593dc095SDavid du Colombier  */
46*593dc095SDavid du Colombier /*
47*593dc095SDavid du Colombier  * Font names in PDF files have caused an enormous amount of trouble, so we
48*593dc095SDavid du Colombier  * document specifically how they are handled in each structure.
49*593dc095SDavid du Colombier  *
50*593dc095SDavid du Colombier  * The PDF Reference says that the FontName in a font descriptor must be
51*593dc095SDavid du Colombier  * the same as the BaseFont in the font or CIDFont resource(s) that
52*593dc095SDavid du Colombier  * reference(s) it.
53*593dc095SDavid du Colombier  *
54*593dc095SDavid du Colombier  * We never create a font descriptor without also creating a font resource
55*593dc095SDavid du Colombier  * that references it, so we set the FontName at the same time as the
56*593dc095SDavid du Colombier  * BaseFont of the font resource.  For more information, see gdevpdtf.h.
57*593dc095SDavid du Colombier  */
58*593dc095SDavid du Colombier 
59*593dc095SDavid du Colombier #ifndef pdf_font_descriptor_DEFINED
60*593dc095SDavid du Colombier #  define pdf_font_descriptor_DEFINED
61*593dc095SDavid du Colombier typedef struct pdf_font_descriptor_s pdf_font_descriptor_t;
62*593dc095SDavid du Colombier #endif
63*593dc095SDavid du Colombier 
64*593dc095SDavid du Colombier /* ================ Procedures ================ */
65*593dc095SDavid du Colombier 
66*593dc095SDavid du Colombier /*
67*593dc095SDavid du Colombier  * Allocate a FontDescriptor, initializing the FontType and rid from the
68*593dc095SDavid du Colombier  * gs_font.
69*593dc095SDavid du Colombier  */
70*593dc095SDavid du Colombier int pdf_font_descriptor_alloc(gx_device_pdf *pdev,
71*593dc095SDavid du Colombier 			      pdf_font_descriptor_t **ppfd,
72*593dc095SDavid du Colombier 			      gs_font_base *font, bool embed);
73*593dc095SDavid du Colombier 
74*593dc095SDavid du Colombier /*
75*593dc095SDavid du Colombier  * Get the object ID of a FontDescriptor.
76*593dc095SDavid du Colombier  */
77*593dc095SDavid du Colombier long pdf_font_descriptor_id(const pdf_font_descriptor_t *pfd);
78*593dc095SDavid du Colombier 
79*593dc095SDavid du Colombier /*
80*593dc095SDavid du Colombier  * Get the FontType of a FontDescriptor.
81*593dc095SDavid du Colombier  */
82*593dc095SDavid du Colombier font_type pdf_font_descriptor_FontType(const pdf_font_descriptor_t *pfd);
83*593dc095SDavid du Colombier 
84*593dc095SDavid du Colombier /*
85*593dc095SDavid du Colombier  * Get the embedding status of a FontDescriptor.
86*593dc095SDavid du Colombier  */
87*593dc095SDavid du Colombier bool pdf_font_descriptor_embedding(const pdf_font_descriptor_t *pfd);
88*593dc095SDavid du Colombier 
89*593dc095SDavid du Colombier /*
90*593dc095SDavid du Colombier  * Check for subset font.
91*593dc095SDavid du Colombier  */
92*593dc095SDavid du Colombier bool pdf_font_descriptor_is_subset(const pdf_font_descriptor_t *pfd);
93*593dc095SDavid du Colombier 
94*593dc095SDavid du Colombier /*
95*593dc095SDavid du Colombier  * Return a reference to the FontName of a FontDescriptor, similar to
96*593dc095SDavid du Colombier  * pdf_base_font_name.
97*593dc095SDavid du Colombier  */
98*593dc095SDavid du Colombier gs_string *pdf_font_descriptor_name(pdf_font_descriptor_t *pfd);
99*593dc095SDavid du Colombier 
100*593dc095SDavid du Colombier /*
101*593dc095SDavid du Colombier  * Return the (copied, subset or complete) font associated with a FontDescriptor.
102*593dc095SDavid du Colombier  * This procedure probably shouldn't exist....
103*593dc095SDavid du Colombier  */
104*593dc095SDavid du Colombier gs_font_base *pdf_font_descriptor_font(const pdf_font_descriptor_t *pfd, bool complete);
105*593dc095SDavid du Colombier 
106*593dc095SDavid du Colombier /*
107*593dc095SDavid du Colombier  * Drop the copied complete font associated with a FontDescriptor.
108*593dc095SDavid du Colombier  */
109*593dc095SDavid du Colombier void pdf_font_descriptor_drop_complete_font(const pdf_font_descriptor_t *pfd);
110*593dc095SDavid du Colombier 
111*593dc095SDavid du Colombier /*
112*593dc095SDavid du Colombier  * Return a reference to the name of a FontDescriptor's base font, per
113*593dc095SDavid du Colombier  * pdf_base_font_name.
114*593dc095SDavid du Colombier  */
115*593dc095SDavid du Colombier gs_string *pdf_font_descriptor_base_name(const pdf_font_descriptor_t *pfd);
116*593dc095SDavid du Colombier 
117*593dc095SDavid du Colombier /*
118*593dc095SDavid du Colombier  * Copy a glyph from a font to the stable copy.  Return 0 if this is a
119*593dc095SDavid du Colombier  * new glyph, 1 if it was already copied.
120*593dc095SDavid du Colombier  */
121*593dc095SDavid du Colombier int pdf_font_used_glyph(pdf_font_descriptor_t *pfd, gs_glyph glyph,
122*593dc095SDavid du Colombier 			gs_font_base *font);
123*593dc095SDavid du Colombier 
124*593dc095SDavid du Colombier /*
125*593dc095SDavid du Colombier  * Compute the FontDescriptor metrics for a font.
126*593dc095SDavid du Colombier  */
127*593dc095SDavid du Colombier int pdf_compute_font_descriptor(pdf_font_descriptor_t *pfd);
128*593dc095SDavid du Colombier 
129*593dc095SDavid du Colombier /*
130*593dc095SDavid du Colombier  * Finish a FontDescriptor by computing the metric values, and then
131*593dc095SDavid du Colombier  * writing the associated embedded font if any.
132*593dc095SDavid du Colombier  */
133*593dc095SDavid du Colombier int pdf_finish_FontDescriptor(gx_device_pdf *pdev,
134*593dc095SDavid du Colombier 			      pdf_font_descriptor_t *pfd);
135*593dc095SDavid du Colombier 
136*593dc095SDavid du Colombier int pdf_finish_font_descriptors(gx_device_pdf *pdev,
137*593dc095SDavid du Colombier 			int (*finish_proc)(gx_device_pdf *,
138*593dc095SDavid du Colombier 					   pdf_font_descriptor_t *));
139*593dc095SDavid du Colombier /*
140*593dc095SDavid du Colombier  * Write a FontDescriptor.
141*593dc095SDavid du Colombier  */
142*593dc095SDavid du Colombier int pdf_write_FontDescriptor(gx_device_pdf *pdev,
143*593dc095SDavid du Colombier 			     pdf_font_descriptor_t *pfd);
144*593dc095SDavid du Colombier 
145*593dc095SDavid du Colombier /*
146*593dc095SDavid du Colombier  * Release a FontDescriptor components.
147*593dc095SDavid du Colombier  */
148*593dc095SDavid du Colombier int pdf_release_FontDescriptor_components(gx_device_pdf *pdev, pdf_font_descriptor_t *pfd);
149*593dc095SDavid du Colombier 
150*593dc095SDavid du Colombier #endif /* gdevpdtd_INCLUDED */
151