% Copyright (C) 1990, 1991 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. % % *********************************************************************** % * * % * M M OOO DDDD III FFFFF III EEEEE DDDD * % * MM MM O O D D I F I E D D * % * M M M O O D D I F I E D D * % * M M O O D D I FFF I EEE D D * % * M M O O D D I F I E D D * % * M M O O D D I F I E D D * % * M M OOO DDDD III F III EEEEE DDDD * % * * % * * % * FFFFF III L EEEEE * % * F I L E * % * F I L E * % * FFF I L EEE * % * F I L E * % * F I L E * % * F III LLLLL EEEEE * % * * % *********************************************************************** % % .-------------. % | /\ | % | / \ | % | / /\ \ | % | / / \ \ | % | / / /\ \ \ | % | / / / \ \ \| % `-------------' (R) % Autodesk, Inc. % Tools For the Golden Age of Engineering % % In keeping with subparagraph 2a of the Gnu General Public License % (Version 1, February 1989): % % 2. You may modify your copy or copies of the Program or any % portion of it, and copy and distribute such modifications under % the terms of Paragraph 1 above, provided that you also do the % following: % % a) cause the modified files to carry prominent notices stating % that you changed the files and the date of any change; and... % % the following is a summary of the changes to this file made by % Autodesk, Inc. in August 1991 in order to adapt Ghostscript to run % as an ADS application and thereby to perform rendering of % PostScript files within AutoCAD. % % ACADPSF.PS Ghostscript font loading procedures. Called % GS_FONTS.PS in standard Ghostscript. % % Added handling for various strange characteristics of % fonts encountered in the real world. % % Added exception handling when fontmap.ps has an incorrect % entry, to prevent infinite recursion. % ************************************************************************ % 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.ps) 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 definefont. This is a procedure built on an operator that % does all the error checking and key insertion. /definefont { 1 dict begin count /d exch def % save stack depth in case of error { .buildfont readonly } stopped { count d sub { pop } repeat end /invalidfont signalerror } { end dup FontDirectory 4 2 roll put } ifelse } odef /GnernDict 1 dict 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 { FontDirectory exch get } { 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 { QUIET not { (Substituting ) print defaultfontname cvx =only ( for unknown font ) print == flush } { pop } ifelse pop defaultfontname findfont } { FontFileMap exch get % If we can't find the file, substitute for the font. dup findlibfile % save the filename here; we'll need it if the load fails. 2 index /savedfilename exch def { QUIET not { (Loading font file ) print exch print (... ) print flush } { exch pop } ifelse % % Discard trash before PostScript sentinel % % Fonts that come with Adobe Type Manager have some % trash binary bytes before the "%!" sentinel. Walk % through the file and make sure we start reading at % the sentinel. % { dup read { 37 eq { dup read { 33 eq { dup dup fileposition 2 sub setfileposition exit } { unread } } { exit} ifelse ifelse } if } { exit } ifelse } loop % % End discarding of trash before PostScript sentinel % % Now it's time for some more adhocracy, another % indulgence in Kelvinist predestination. It turns out % that the various fonts we've accreted over the years % obey no coherent conventions for what they leave or don't % leave on the stack and some, based on the Adobe Type 1 % encryption decoder, even leave marks on the stack. To % guarantee that we emerge from the font code with the % stack in a valid state, we save the stack depth in a % variable then programmatically pop any trash off the % stack when we're done. This is ugly, but it works % with every font I've tried. count GnernDict begin /GnernK exch def end mark exch systemdict begin run end % run can take a file cleartomark % Now for the actial dirty work to put the stack back % the way it was before we loaded the font. GnernDict begin { count GnernK lt { exit } if pop} loop end QUIET not { vmstatus 3 { =only ( ) print } repeat (done.\n) print flush } if % OK, make sure the thing has really been loaded. dup FontDirectory exch known not { % Oops. (The font ) print =only ( is not really in the file ) print savedfilename =only (\n) print flush defaultfontname } if findfont } { 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 findfont } ifelse } ifelse } ifelse } ifelse } 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 { QUIET not { (Substituting .notdef for ) print = flush } { pop } ifelse /.notdef } if CharStrings exch get PaintType 0 ne { 1 setmiterlimit 1 setlinejoin 1 setlinecap currentdict /StrokeWidth known { StrokeWidth } { 0 } ifelse setlinewidth } if type1addpath % does a fill or stroke end } bind def