plan9fox/sys/lib/ghostscript/printafm.ps
2011-03-30 19:35:09 +03:00

148 lines
3.2 KiB
PostScript

%!
% 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