home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume35 / psutils / part04 / getafm < prev    next >
Text File  |  1993-02-04  |  5KB  |  176 lines

  1. #!/bin/sh
  2. # getafm: get afm file from printer
  3. #         Note that the AFM file returned will not have any kerning
  4. #         information, but it is useful if you can't get the file anywhere else
  5. # usage:
  6. #       getafm Font-Name | lpr -Pprinter
  7.  
  8. if [ $# != 1 ]; then
  9.         echo "Usage: `basename $0` Font-Name" >&2
  10.         exit 1
  11. fi
  12.  
  13. cat <<EOF
  14. %!
  15. % Get character metrics and bounding box for $1
  16. /ns 30 string def
  17. /fname /$1 def
  18. /fn fname findfont 1000 scalefont def
  19. /en fn /Encoding get def
  20. fn setfont
  21.  
  22. /sp { ( )print } def
  23. /nl { (\n)print } def
  24. /pn { ns cvs print } def
  25.  
  26. /printbb { % llx lly urx ury => -
  27.    4 -1 roll round cvi pn sp
  28.    3 -1 roll round cvi pn sp
  29.    exch round cvi pn sp
  30.    round cvi pn
  31. } def
  32.  
  33. (StartFontMetrics 2.0\n)print
  34. (Comment Created by `basename $0` 1.00 (c) AJCD `date`\n)print
  35. fn /FontName known {
  36.    (FontName )print fn /FontName get pn nl
  37. } {
  38.    (FontName $1\n) print
  39. } ifelse
  40. en StandardEncoding eq {
  41.    (EncodingScheme AdobeStandardEncoding\n)print
  42. } {
  43.    en ISOLatin1Encoding eq {
  44.       (EncodingScheme ISOLatin1Encoding\n)print
  45.    } if
  46. } ifelse
  47. fn /FontInfo known {
  48.    fn /FontInfo get
  49.    dup /FamilyName known {
  50.       (FamilyName )print dup /FamilyName get print nl
  51.    } if
  52.    dup /FullName known {
  53.       (FullName )print dup /FullName get print nl
  54.    } if
  55.    dup /Notice known {
  56.       (Notice )print dup /Notice get print nl
  57.    } if
  58.    dup /Weight known {
  59.       (Weight )print dup /Weight get print nl
  60.    } if
  61.    dup /Version known {
  62.       (Version )print dup /Version get print nl
  63.    } if
  64.    dup /ItalicAngle known {
  65.       (ItalicAngle )print dup /ItalicAngle get pn nl
  66.    } if
  67.    dup /isFixedPitch known {
  68.       (IsFixedPitch )print dup /isFixedPitch get {(true)}{(false)}ifelse print
  69.        nl
  70.    } {
  71.       (IsFixedPitch false\n)print
  72.    } ifelse
  73.    dup /UnderlinePosition known {
  74.       (UnderlinePosition )print dup /UnderlinePosition get pn nl
  75.    } if
  76.    dup /UnderlineThickness known {
  77.       (UnderlineThickness )print dup /UnderlineThickness get pn nl
  78.    } if
  79.    pop
  80. } if
  81. (FontBBox )print fn /FontBBox get aload pop printbb nl
  82.  
  83. %CapHeight 662
  84. %XHeight 448
  85. %Descender -217
  86. %Ascender 682
  87. %(PaintType: )print fn /PaintType get pn (\n) print flush
  88.  
  89. (StartCharMetrics )print
  90. fn /CharStrings get length 1 sub pn nl
  91.  
  92. % check encoded chars
  93. 0 1 255 {
  94.    dup en exch get 
  95.    dup /.notdef ne { % C 77 ; WX 889 ; N M ; B 19 0 871 662 ;
  96.       (C ) print                                % character number
  97.       exch dup pn exch
  98.       ( ; WX ) print                            % character width
  99.       fn /Metrics known {
  100.          dup fn /Metrics get exch get 
  101.          dup type /arraytype eq {
  102.             dup length 2 eq
  103.             {1 get} {2 get} ifelse
  104.          } if
  105.       } {
  106.          ( ) dup 0 4 index put stringwidth pop round cvi
  107.       } ifelse
  108.       pn
  109.       ( ; N ) print                             % character name
  110.       pn
  111.       newpath 0 0 moveto
  112.       ( ; B ) print                             % BoundingBox
  113.       ( ) dup 0 4 -1 roll put
  114.       true charpath flattenpath pathbbox printbb
  115.       ( ;\n) print                              % finished!
  116.    } {pop pop} ifelse
  117. } for
  118.  
  119. % get unencoded characters into MyEncoding array (problem if >256 unencoded)
  120. /MyEncoding 256 array def
  121. /Reverse 256 dict def
  122. Reverse begin
  123.    en { % reverse encoding dictionary
  124.       true def
  125.    } forall
  126. end
  127.  
  128. 0 % start at beginning of MyEncoding
  129. fn /CharStrings get {
  130.    pop % discard encrypted string
  131.    dup Reverse exch known not % test if key is in normal encoding
  132.    {
  133.      MyEncoding 2 index 3 -1 roll put 1 add
  134.    } {pop} ifelse
  135. } forall
  136. 1 255 { % fill out with notdefs
  137.    MyEncoding exch /.notdef put
  138. } for
  139.  
  140. fn dup length dict begin
  141.   {1 index /FID ne {def} {pop pop} ifelse} forall
  142.   /Encoding MyEncoding def
  143.   currentdict
  144. end /newfont exch definefont
  145. dup /fn exch def setfont
  146. /en MyEncoding def
  147.  
  148. % check encoded chars
  149. 0 1 255 {
  150.    dup en exch get
  151.    dup /.notdef ne { % C -1 ; WX 889 ; N M ; B 19 0 871 662 ;
  152.       (C -1) print                                % character number
  153.       ( ; WX ) print                            % character width
  154.       fn /Metrics known {
  155.          dup fn /Metrics get exch get 
  156.          dup type /arraytype eq {
  157.             dup length 2 eq
  158.             {1 get} {2 get} ifelse
  159.          } if
  160.       } {
  161.          ( ) dup 0 4 index put stringwidth pop round cvi
  162.       } ifelse
  163.       pn
  164.       ( ; N ) print                             % character name
  165.       pn
  166.       newpath 0 0 moveto
  167.       ( ; B ) print                             % BoundingBox
  168.       ( ) dup 0 4 -1 roll put
  169.       true charpath flattenpath pathbbox printbb
  170.       ( ;\n) print                              % finished!
  171.    } {pop pop exit} ifelse
  172. } for
  173. (EndCharMetrics\n)print
  174. flush
  175. EOF
  176.