blob: b455706484f75191e9d0a8508ab24c201bb6efc8 [file] [log] [blame]
% Copyright (C) 1990 Aladdin Enterprises. All rights reserved.
% Distributed by Free Software Foundation, Inc.
%
% This file is part of Ghostscript.
%
% Ghostscript is distributed in the hope that it will be useful, but
% WITHOUT ANY WARRANTY. No author or distributor accepts responsibility
% to anyone for the consequences of using it or for whether it serves any
% particular purpose or works at all, unless he says so in writing. Refer
% to the Ghostscript General Public License for full details.
%
% Everyone is granted permission to copy, modify and redistribute
% Ghostscript, but only under the conditions described in the Ghostscript
% General Public License. A copy of this license is supposed to have been
% given to you along with Ghostscript so you can know your rights and
% responsibilities. It should be in a file named COPYING. Among other
% things, the copyright notice and this notice must be preserved on all
% copies.
% Font initialization for Ghostscript. Despite anything claimed below,
% Ghostscript fonts are actually in the same format as Adobe Type 1 fonts,
% except that the external form customarily does not use eexec encryption.
% Someday there will be GNU documentation that describes this format.
% Until then, you'll have to either get a copy of Adobe's book, or read
% the Ghostscript code. The interpreter for Type 1 fonts, which reveals
% most of their structure, is in the file gstype1.c.
% Define the default font.
/defaultfontname /Ugly def
% Internal procedure to load the font name -> font file name map
% if it isn't loaded already, and push it on the stack.
/Fontmap
{ /FontFileMap where
{ /FontFileMap get }
{ (Fontmap) findlibfile not
{ (Can't find ) print print (!\n) print stop }
if
FontDirectory maxlength dict exch
2 dict begin
mark exch 2 index exch
/;
{ % The stack contains a mark, the dictionary, the font name,
% the file name, and additional information about the font.
counttomark 3 sub { pop } repeat put
1 index
} bind def
run
end
pop pop % pop the mark and the copy of the dictionary
userdict exch /FontFileMap exch put
FontFileMap
}
ifelse
} bind def
% Define findfont so it tries to load a font if it's not found.
/findfont
{
% If the key is a string, convert it to a name for lookup.
dup type /stringtype eq { cvn } if
% If the font isn't in FontDirectory already, load it.
dup FontDirectory exch known not
{ dup % save the font name on the stack
% Push the font name -> font file name map on the stack,
% loading it if necessary.
Fontmap
% Read the file name from the map.
% (The stack contains the font name and the font file map.)
1 index known not
{ (Substituting ) print defaultfontname cvx =only
( for ) print == flush
pop defaultfontname
}
{ FontFileMap exch get
% If we can't find the file, substitute for the font.
dup findlibfile
{ (Loading font file ) print exch print (... ) print flush
mark exch run cleartomark % run can take a file
(done.\n) print flush
}
{ pop 1 index defaultfontname eq
{ (Can't find default font!\n) print
pop pop /NullFont
}
{ (Can't find font file ) print print
(, substituting ) print defaultfontname cvx =only
(.\n) print flush
pop defaultfontname
}
ifelse
}
ifelse
}
ifelse
} if
% Get the font from the augmented FontDirectory.
% Check for the possibility that we haven't loaded
% the default font yet.
dup FontDirectory exch known not
{ findfont }
{ FontDirectory exch get }
ifelse
} bind def
% Here is a reference implementation of addcharpath for "type 7" paths
% (the type formerly used by Ghostscript). We include this for backward
% compatibility because Ghostscript's format has changed.
/addcharpath % <string> <pathtype> ->
{ pop % don't bother to check the pathtype
{ moveto 3 -1 roll pop { rlineto } 3 1 roll } exch
% In the loop, the top element of the stack is the remaining part
% of the string, and the next element is the moveto/rlineto procedure.
{ dup length 0 eq { exit } if
dup 0 get
dup 16#88 eq
{ pop exch pop
{ moveto 3 -1 roll pop { rlineto } 3 1 roll } exch
1
}
{ dup 16 ge
{ dup 15 and 0 ne
{ % xx
dup -4 bitshift 8 sub exch 15 and 8 sub 1
}
{ % x0
-4 bitshift 8 sub 1 index 1 get 128 sub 2
}
ifelse
}
{ dup 15 and 0 ne
{ % 0x
8 sub 1 index 1 get 128 sub exch 2
}
{ % 00
pop dup 1 get 128 sub 1 index 2 get 128 sub 3
}
ifelse
}
ifelse
3 1 roll % now: proc string nbytes dx dy
0.25 mul exch 0.25 mul exch
4 index exec
}
ifelse
dup 2 index length exch sub getinterval
} loop
pop pop
}
bind def
% The CharStrings for a Ghostscript font are a dictionary in which
% the key is the character name, and the value is a compressed
% representation of a path, as produced by type1imagepath.
% For detailed information, see the book
% "Adobe Type 1 Font Format", published by Adobe Systems Inc.
% Here is the BuildChar implementation
% for Type 1 (Ghostscript standard) fonts.
% The name Type1BuildChar is known to the interpreter.
/Type1BuildChar
{ exch begin
Encoding exch get
dup CharStrings exch known not
{ (Substituting .notdef for ) print = flush /.notdef } if
CharStrings exch get
PaintType 0 ne
{ 1 setmiterlimit 1 setlinejoin 1 setlinecap
StrokeWidth setlinewidth }
if
type1addpath % does a fill or stroke
end
} bind def