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