xref: /386bsd/usr/local/lib/ghostscript/doc/fonts.doc (revision a2142627)
1   Copyright (C) 1990, 1991 Aladdin Enterprises.  All rights reserved.
2
3This file is part of Ghostscript.
4
5Ghostscript is distributed in the hope that it will be useful, but
6WITHOUT ANY WARRANTY.  No author or distributor accepts responsibility
7to anyone for the consequences of using it or for whether it serves any
8particular purpose or works at all, unless he says so in writing.  Refer
9to the Ghostscript General Public License for full details.
10
11Everyone is granted permission to copy, modify and redistribute
12Ghostscript, but only under the conditions described in the Ghostscript
13General Public License.  A copy of this license is supposed to have been
14given to you along with Ghostscript so you can know your rights and
15responsibilities.  It should be in a file named COPYING.  Among other
16things, the copyright notice and this notice must be preserved on all
17copies.
18
19- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
20
21This file, fonts.doc, describes the fonts and font facilities supplied
22with Ghostscript.
23
24For an overview of Ghostscript and a list of the documentation files, see
25README.
26
27About Ghostscript fonts
28=======================
29
30The fonts included with Ghostscript come in several parts:
31
32	- Font data in files *.gsf: each file defines one
33	  (transformable) font specified in outline form.
34
35	- BuildChar procedures in gs_fonts.ps: these provide the
36	  algorithms for interpreting the data in the .gsf files.
37
38	- The Fontmap file: this relates Ghostscript font names to .gsf
39	  file names.
40
41Currently, most of the fonts supplied with Ghostscript are based on
42various public domain bitmap fonts, primarily the ones supplied with the
43X11 distribution from MIT, and on the public domain Hershey fonts.  The
44fonts are distributed in the file `ghostscript-N.NNfonts.tar.Z'.  The
45bitmap-derived fonts include the usual Helvetica, Times-Roman, and so on;
46see the file `Fontmap' for the complete list, in the usual roman, italic,
47bold, and bold italic styles (for the most part).  The Hershey fonts, on
48the other hand, are quite different from traditional ones; the file
49`hershey.doc' describes them in more detail.
50
51There is also a single rather heavy home-grown font called Ugly.  This
52font is the file `uglyr.gsf' in the Ghostscript source distribution.
53
54The file gs_fonts.ps, which is loaded as part of Ghostscript
55initialization, arranges to load fonts on demand using the information
56from Fontmap.  If you want to preload all of the known fonts, invoke the
57procedure
58	loadallfonts
59This is not done by default, since the fonts occupy about 50K each and there
60are a lot of them.
61
62Ghostscript fonts are actually ordinary Ghostscript programs: they use the
63extension .gsf instead of .ps simply to be informative.  This convention
64is only embodied in the Fontmap file: there is no code that knows about
65it.
66
67If you want to try out the fonts, prfont.ps contains code for printing a
68sampler.  Load this program, by including it in the gs command line or by
69invoking
70	(prfont.ps) run
71and then to produce a sampler of a particular font, invoke
72	/fontName DoFont
73e.g.
74	/Times-Roman DoFont
75
76Contents of fonts
77-----------------
78
79A Ghostscript font is a dictionary with a standard set of keys as follows.
80The keys marked with a * have the same meanings as in P*stScr*pt fonts;
81those marked with # have the same meanings as in Adobe Type 1 fonts.  Note
82that FontName is required; StrokeWidth is required for all stroked or
83outlined fonts; and Metrics is not currently supported.
84
85*	- FontMatrix <array>: the transformation from character
86	  coordinates to user coordinates.
87
88*	- FontType <integer>: the type of the font, either 1 or 3.
89
90*	- FontBBox <array>: the bounding box of the font.
91
92*	- Encoding <array>: the map from character codes to character
93	  names.
94
95*	- FontName <name>: the name of the font.
96
97*	- PaintType <integer>: an indication of how to interpret the
98	  character description from CharInfo.
99
100*	- StrokeWidth <number>: the stroke width for outline fonts.
101
102*	- FontInfo <dictionary>: additional information about the font
103	  (optional, not used by the standard Ghostscript software).
104
105*	- UniqueID <integer>: a unique number identifying the font.
106
107*	- BuildChar <procedure>: the procedure for showing a character
108	  (not required in type 1 fonts).
109
110#	- CharStrings <dictionary>: the map from character names to character
111	  descriptions (relevant only in type 1 fonts).
112
113#	- Private <dictionary>: additional information used by the
114	  algorithms for rendering outlines fonts (relevant only in type 1
115	  fonts).
116
117The format of values in the CharStrings and Private dictionaries are
118described in the Adobe Type 1 Font Format book.
119
120Adding your own fonts
121=====================
122
123Ghostscript can use any Type 1 or Type 3 font that is acceptable to other
124PostScript language interpreters.  Ghostscript also provides a way to
125construct a Type 1 font from a bitmap font in BDF format, which is a
126popular format in the Unix world.
127
128If you want to add fonts of your own, you must edit Fontmap to include an
129entry for your new font at the end.  The format for entries is documented
130in the Fontmap file.  Since later entries in Fontmap override earlier
131entries, any fonts you add will supersede the corresponding fonts supplied
132with Ghostscript.
133
134In the PC world, Type 1 fonts are customarily given names ending in .PFA
135or .PFB.  Ghostscript can use these directly; you just need to make the
136entry in Fontmap.  If you are going to use a commercial Type 1 font (such
137as fonts obtained in conjunction with Adobe Type Manager) with
138Ghostscript, please read carefully the license that accompanies the font;
139Aladdin Enterprises takes no responsibility for any possible violations of
140such licenses.
141
142Converting BDF fonts
143--------------------
144
145If you want to convert a BDF file to a scalable outline, use the program
146bdftops.ps (and invoking shell script bdftops.bat or bdftops).  Run the
147shell command
148	bdftops <BDF_file_name> [<AFM_file1_name> ...] <your_gsf_file_name>
149	  <font_name> <uniqueID> [<encoding_name>]
150e.g.,
151	bdftops pzdr.bdf ZapfDingbats.afm pzdr.gsf ZapfDingbats 4100000
152Then make an entry for the .gsf file in Fontmap as described above.  You
153may find it helpful to read, and to add an entry to, the fonts.mak file,
154which is a makefile for converting the standard Ghostscript fonts.
155
156Precompiling fonts
157==================
158
159You can compile any Type 1 font into C and link it into the Ghostscript
160executable.  (Type 1 fonts include any font whose name ends with .pfa or
161.pfb, and it also includes all the Ghostscript .gsf fonts except for the
162Hershey fonts.)  This doesn't have any effect on rendering speed, but it
163eliminates the time for loading the font dynamically, which may make a big
164difference in total rendering time, especially for multi-page documents.
165(Because of RAM and compiler limitations, you should only use compiled
166fonts on MS-DOS systems if you are using a 32-bit compiler such as Watcom
167C/386 or djgpp; you will run out of memory if you use compiled fonts with
168the Borland compiler.)  Fonts that have been precompiled and linked in
169this way do not need to appear in the Fontmap, although if they do appear
170there, no harm is done.
171
172The utility for precompiling fonts is called font2c.  Note that font2c is
173a PostScript language program, so you must have Ghostscript already
174running to be able to run font2c; you must also have entries in the
175Fontmap for the fonts you want to compile.  For example, to precompile
176the Times-Italic font,
177	font2c Times-Italic ptmri.c
178where the first argument is the font name and the second is the name of
179the .c file.  You can use any file name you want, as long as it ends in
180.c.  It doesn't have to be limited to 8 characters, unless your operating
181system requires this.  We suggest that you use names xxxx.c, where
182xxxx.gsf or xxxx.pfa is the name of the font file in the Fontmap file,
183just so you don't have to keep track of another set of names.  (If you are
184running on a VMS platform, or another platform where the C compiler has a
185limit on the length of identifiers, you must do something slightly more
186complicated; see the section 'Platforms with identifier length limits'
187below.  Also, on VMS, you must put quotes "" around the font name so that
188the VMS command processor doesn't convert the name to lower case.)
189
190Besides running font2c, you must arrange things so that the file will be
191compiled from C to machine code, and linked into the executable.  All
192environments except VMS use the same procedure for this, which we will now
193describe.  For VMS environments, the necessary information is contained in
194comments in the command files (vms-cc.mak and vms-gcc.mak); if you are
195using Ghostscript on VMS, ignore the rest of this subsection.
196
197First, you must add the compiled fonts "feature" to your
198platform-specific makefile.  On MS-DOS systems, you edit tc.mak,
199bc.mak, bcwin.mak, msc.mak, or watc.mak; on Unix systems, you edit
200makefile.  Find the definition of FEATURE_DEVS in the makefile, e.g.,
201	FEATURE_DEVS=filter.dev dps.dev
202Add ccfonts.dev on the end, e.g.,
203	FEATURE_DEVS=filter.dev dps.dev ccfonts.dev
204
205Next, you must add the specific fonts to the generic makefile.  On MS-DOS
206systems, you edit gs.mak; on Unix systems, you edit makefile.  Find the
207line in the relevant makefile that says
208	ccfonts1_=ugly.$(OBJ)
209Edit this to add your compiled font file names, e.g.,
210	ccfonts1_=ugly.$(OBJ) ptmri.$(OBJ)
211If the line gets too long, add another line of the same form, e.g.,
212	ccfonts2_=ptmb.$(OBJ)
213Just below this, you will find a line that says
214	ccfonts1=Ugly
215Add your own fonts to the end of this line, e.g.,
216	ccfonts1=Ugly Times_Italic
217Notice that you must replace `-' by `_' in the font name.  Again, if
218the line gets too long, add another line of the same form, e.g.,
219	ccfonts1=Ugly
220	ccfonts2=Times_Italic
221Now find the lines that say
222	ugly.$(OBJ): ugly.c $(CCFONT)
223		$(CCCF) ugly.c
224Add a similar pair of lines for each font, separating these entries from
225the existing entries and from each other by a blank line.  (The makefile
226includes lines for a few more fonts than this already.)  In our example,
227	ugly.$(OBJ): ugly.c $(CCFONT)
228		$(CCCF) ugly.c
229
230	ptmri.$(OBJ): ptmri.c $(CCFONT)
231		$(CCCF) ptmri.c
232
233Finally, run `make'.  The executable will now include the fonts you added.
234They will be present in FontDirectory when Ghostscript starts up.
235
236Note that ugly.c, ncrr.c, etc. are not supplied with the Ghostscript
237fileset, since they are quite large and can easily be recreated using the
238font2c program as described above.
239
240Platforms with identifier length limits
241---------------------------------------
242
243On some platforms, the C compiler and/or linker have a limit on the number
244of significant characters in an identifier.  On such platforms, you must
245do a little extra work.
246
247Let N be the maximum number of significant characters in an identifier
248(typically 31).  For each font whose name is longer than N-5 characters,
249pick an arbitrary identifier that we will call the "short name".  This can
250be any string you want, as long as it contains only letters, digits, and
251underscores; is no longer than N-5 characters; and is not the same as any
252other font name or short name.  A good choice for this would be to use the
253name of the C file.  (There is no harm in doing this for fonts with names
254shorter than N-5 characters, it's just not necessary.)
255
256You must do two different things for fonts that require a short name.
257First, you must supply the short name as a third argument to the font2c
258program.  For example, to compile NewCenturySchlbk-BoldItalic using the
259short name "pncbi",
260	font2c NewCenturySchlbk-BoldItalic pncbi.c pncbi
261Then when you add the font to the gsaddmod line in the makefile, use the
262short name, not the actual font name, e.g.,
263	ccfonts2=pncbi
264instead of
265	ccfonts2=NewCenturySchlbk_BoldItalic
266Everything else is as described above.
267
268This procedure doesn't change the name of the font in the Fontmap, or as
269seen from within Ghostscript; it's just a workaround for a limitation of
270some older compilers.
271