147 lines · 3.2 KB · Text
RawDownload
%!% written by James Clark <jjc@jclark.uucp>% print an afm file on the standard output% usage is `fontname printafm' eg `/Times-Roman printafm' % From the `dvitops' distribution, which included this notice:% dvitops is not copyrighted; you can do with it exactly as you please.% I would, however, ask that if you make improvements or modifications,% you ask me before distributing them to others. % Altered by d.love@dl.ac.uk to produce input for Rokicki's afm2tfm,% which groks the format of the Adobe AFMs. % $Id: printafm.ps,v 1.4 2002/02/21 21:49:28 giles Exp $% Modified by L. Peter Deutsch 9/14/93:%   uses Ghostscript's =only procedure to replace 'buf cvs print'.% Modified by L. Peter Deutsch 9/6/95:%   uses Ghostscript's shellarguments facility to accept the font name%     on the command line. /onechar 1 string def % c toupper - c/toupper {	dup dup 8#141 ge exch 8#172 le and { 		8#40 sub	} if} bind def % printcharmetrics - /printcharmetrics {	(StartCharMetrics ) print	currentfont /CharStrings get dup length exch /.notdef known { 1 sub } if =	currentfont 1000 scalefont setfont 0 0 moveto	/e currentfont /Encoding get def	0 1 255 {		dup e exch get		dup /.notdef ne {			exch dup printmetric		} {			pop pop		} ifelse	} for	% s contains an entry for each name in the original encoding vector	/s 256 dict def	e {		s exch true put	} forall	% v is the new encoding vector	/v 256 array def	0 1 255 {		v exch /.notdef put	} for	% fill up v with names in CharStrings	/i 0 def	currentfont /CharStrings get {		pop		i 255 le {			v i 3 -1 roll put			/i i 1 add def		} {			pop		} ifelse	} forall	% define a new font with v as its encoding vector	currentfont maxlength dict /f exch def	currentfont {		exch dup dup /FID ne exch /Encoding ne and { 			exch f 3 1 roll put		} { 			pop pop 		} ifelse	} forall	f /Encoding v put	f /FontName /temp put	% make this new font the current font	/temp f definefont setfont	% print a entry for each character not in old vector	/e currentfont /Encoding get def	0 1 255 {		dup e exch get		dup dup /.notdef ne exch s exch known not and { 			exch -1 printmetric		} { 			pop pop		} ifelse	} for	(EndCharMetrics) =} bind def % name actual_code normal_code printmetric - /printmetric {	/saved save def	(C ) print =only	( ; WX ) print	onechar 0 3 -1 roll put	onechar stringwidth pop round cvi =only	( ; N ) print =only	( ; B ) print	onechar false charpath flattenpath mark pathbbox counttomark {		counttomark -1 roll		round cvi =only		( ) print	} repeat pop	(;) =	saved restore} bind def % fontname printafm - /printafm {	findfont gsave setfont	(StartFontMetrics 2.0) =	(FontName ) print currentfont /FontName get = 		% Print the FontInfo 	currentfont /FontInfo get {		exch		=string cvs dup dup 0 get 0 exch toupper put print		( ) print =	} forall 		% Print the FontBBox 	(FontBBox) print	currentfont /FontBBox get {		( ) print round cvi =only	} forall	(\n) print 	printcharmetrics	(EndFontMetrics) =	grestore} bind def % Check for command line arguments.[ shellarguments { ] dup length 1 eq    { 0 get printafm }    { (Usage: printafm fontname\n) print flush }   ifelse } { pop }ifelse