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: 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 */