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: gdevpdtb.h,v 1.11 2005/04/04 08:53:07 igor Exp $ */
|
|
|
18 |
/* BaseFont structure and API for pdfwrite */
|
|
|
19 |
|
|
|
20 |
#ifndef gdevpdtb_INCLUDED
|
|
|
21 |
# define gdevpdtb_INCLUDED
|
|
|
22 |
|
|
|
23 |
#include "gdevpdtx.h"
|
|
|
24 |
|
|
|
25 |
/* ================ Types and structures ================ */
|
|
|
26 |
|
|
|
27 |
/*
|
|
|
28 |
* A "base font" pdf_base_font_t contains a stable copy of a gs_font. The
|
|
|
29 |
* only supported font types are Type 1/2, TrueType / Type 42, CIDFontType
|
|
|
30 |
* 0, and CIDFontType 2.
|
|
|
31 |
*
|
|
|
32 |
* At the time a base font is created, we copy the fixed elements of the
|
|
|
33 |
* gs_font (that is, everything except the data for individual glyphs) into
|
|
|
34 |
* stable memory; we then copy individual glyphs as they are used. If
|
|
|
35 |
* subsetting is not mandatory (that is, if the entire font might be
|
|
|
36 |
* embedded or its Widths written), we also save a separate copy of the
|
|
|
37 |
* entire font, since the subsetting decision cannot be made until the font
|
|
|
38 |
* is written out (normally at the end of the document).
|
|
|
39 |
*
|
|
|
40 |
* In an earlier design, we deferred making the complete copy until the font
|
|
|
41 |
* was about to be freed. We decided that the substantial extra complexity
|
|
|
42 |
* of this approach did not justify the space that would be saved in the
|
|
|
43 |
* usual (subsetted) case.
|
|
|
44 |
*
|
|
|
45 |
* The term "base font" is used, confusingly, for at least 3 different
|
|
|
46 |
* concepts in Ghostscript. However, the above meaning is used consistently
|
|
|
47 |
* within the PDF text code (gdevpdt*.[ch]).
|
|
|
48 |
*/
|
|
|
49 |
/*
|
|
|
50 |
* Font names in PDF files have caused an enormous amount of trouble, so we
|
|
|
51 |
* document specifically how they are handled in each structure.
|
|
|
52 |
*
|
|
|
53 |
* The PDF Reference doesn't place any constraints on the [CID]FontName of
|
|
|
54 |
* base fonts, although it does say that the BaseFont name in the font
|
|
|
55 |
* resource is "usually" derived from the [CID]FontName of the base font.
|
|
|
56 |
* The code in this module allows setting the font name. It initializes
|
|
|
57 |
* the name to the key_name of the base font, or to the font_name if the
|
|
|
58 |
* base font has no key_name, minus any XXXXXX+ subset prefix; the
|
|
|
59 |
* pdf_do_subset_font procedure adds the XXXXXX+ prefix if the font will
|
|
|
60 |
* be subsetted.
|
|
|
61 |
*/
|
|
|
62 |
|
|
|
63 |
#ifndef pdf_base_font_DEFINED
|
|
|
64 |
# define pdf_base_font_DEFINED
|
|
|
65 |
typedef struct pdf_base_font_s pdf_base_font_t;
|
|
|
66 |
#endif
|
|
|
67 |
|
|
|
68 |
/* ================ Procedures ================ */
|
|
|
69 |
|
|
|
70 |
/*
|
|
|
71 |
* Allocate and initialize a base font structure, making the required
|
|
|
72 |
* stable copy/ies of the gs_font. Note that this removes any XXXXXX+
|
|
|
73 |
* font name prefix from the copy. If complete is true, the copy is
|
|
|
74 |
* a complete one, and adding glyphs or Encoding entries is not allowed.
|
|
|
75 |
*/
|
|
|
76 |
int pdf_base_font_alloc(gx_device_pdf *pdev, pdf_base_font_t **ppbfont,
|
|
|
77 |
gs_font_base *font, const gs_matrix *orig_matrix,
|
|
|
78 |
bool is_standard, bool orig_name);
|
|
|
79 |
|
|
|
80 |
/*
|
|
|
81 |
* Return a reference to the name of a base font. This name is guaranteed
|
|
|
82 |
* not to have a XXXXXX+ prefix. The client may change the name at will,
|
|
|
83 |
* but must not add a XXXXXX+ prefix.
|
|
|
84 |
*/
|
|
|
85 |
gs_string *pdf_base_font_name(pdf_base_font_t *pbfont);
|
|
|
86 |
|
|
|
87 |
/*
|
|
|
88 |
* Return the (copied, subset or complete) font associated with a base font.
|
|
|
89 |
* This procedure probably shouldn't exist....
|
|
|
90 |
*/
|
|
|
91 |
gs_font_base *pdf_base_font_font(const pdf_base_font_t *pbfont, bool complete);
|
|
|
92 |
|
|
|
93 |
/*
|
|
|
94 |
* Check for subset font.
|
|
|
95 |
*/
|
|
|
96 |
bool pdf_base_font_is_subset(const pdf_base_font_t *pbfont);
|
|
|
97 |
|
|
|
98 |
/*
|
|
|
99 |
* Drop the copied complete font associated with a base font.
|
|
|
100 |
*/
|
|
|
101 |
void pdf_base_font_drop_complete(pdf_base_font_t *pbfont);
|
|
|
102 |
|
|
|
103 |
/*
|
|
|
104 |
* Copy a glyph (presumably one that was just used) into a saved base
|
|
|
105 |
* font. Note that it is the client's responsibility to determine that
|
|
|
106 |
* the source font is compatible with the target font. (Normally they
|
|
|
107 |
* will be the same.)
|
|
|
108 |
*/
|
|
|
109 |
int pdf_base_font_copy_glyph(pdf_base_font_t *pbfont, gs_glyph glyph,
|
|
|
110 |
gs_font_base *font);
|
|
|
111 |
|
|
|
112 |
/*
|
|
|
113 |
* Determine whether a font is a subset font by examining the name.
|
|
|
114 |
*/
|
|
|
115 |
bool pdf_has_subset_prefix(const byte *str, uint size);
|
|
|
116 |
|
|
|
117 |
/*
|
|
|
118 |
* Add the XXXXXX+ prefix for a subset font.
|
|
|
119 |
*/
|
|
|
120 |
int pdf_add_subset_prefix(const gx_device_pdf *pdev, gs_string *pstr,
|
|
|
121 |
byte *used, int count);
|
|
|
122 |
|
|
|
123 |
/*
|
|
|
124 |
* Determine whether a copied font should be subsetted.
|
|
|
125 |
*/
|
|
|
126 |
bool pdf_do_subset_font(gx_device_pdf *pdev, pdf_base_font_t *pbfont,
|
|
|
127 |
gs_id rid);
|
|
|
128 |
|
|
|
129 |
/*
|
|
|
130 |
* Write the FontFile entry for an embedded font, /FontFile<n> # # R.
|
|
|
131 |
*/
|
|
|
132 |
int pdf_write_FontFile_entry(gx_device_pdf *pdev, pdf_base_font_t *pbfont);
|
|
|
133 |
|
|
|
134 |
/*
|
|
|
135 |
* Write an embedded font, possibly subsetted.
|
|
|
136 |
*/
|
|
|
137 |
int pdf_write_embedded_font(gx_device_pdf *pdev, pdf_base_font_t *pbfont,
|
|
|
138 |
gs_int_rect *FontBBox, gs_id rid, cos_dict_t **ppcd);
|
|
|
139 |
|
|
|
140 |
/*
|
|
|
141 |
* Write the CharSet data for a subsetted font, as a PDF string.
|
|
|
142 |
*/
|
|
|
143 |
int pdf_write_CharSet(gx_device_pdf *pdev, pdf_base_font_t *pbfont);
|
|
|
144 |
|
|
|
145 |
/*
|
|
|
146 |
* Write the CIDSet object for a subsetted CIDFont.
|
|
|
147 |
*/
|
|
|
148 |
int pdf_write_CIDSet(gx_device_pdf *pdev, pdf_base_font_t *pbfont,
|
|
|
149 |
long *pcidset_id);
|
|
|
150 |
|
|
|
151 |
/*
|
|
|
152 |
* Check whether a base font is standard.
|
|
|
153 |
*/
|
|
|
154 |
bool pdf_is_standard_font(pdf_base_font_t *bfont);
|
|
|
155 |
|
|
|
156 |
void pdf_set_FontFile_object(pdf_base_font_t *bfont, cos_dict_t *pcd);
|
|
|
157 |
const cos_dict_t * pdf_get_FontFile_object(pdf_base_font_t *bfont);
|
|
|
158 |
|
|
|
159 |
#endif /* gdevpdtb_INCLUDED */
|