home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Usenet 1994 October
/
usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso
/
misc
/
volume35
/
psutils
/
part04
/
getafm
< prev
next >
Wrap
Text File
|
1993-02-04
|
5KB
|
176 lines
#!/bin/sh
# getafm: get afm file from printer
# Note that the AFM file returned will not have any kerning
# information, but it is useful if you can't get the file anywhere else
# usage:
# getafm Font-Name | lpr -Pprinter
if [ $# != 1 ]; then
echo "Usage: `basename $0` Font-Name" >&2
exit 1
fi
cat <<EOF
%!
% Get character metrics and bounding box for $1
/ns 30 string def
/fname /$1 def
/fn fname findfont 1000 scalefont def
/en fn /Encoding get def
fn setfont
/sp { ( )print } def
/nl { (\n)print } def
/pn { ns cvs print } def
/printbb { % llx lly urx ury => -
4 -1 roll round cvi pn sp
3 -1 roll round cvi pn sp
exch round cvi pn sp
round cvi pn
} def
(StartFontMetrics 2.0\n)print
(Comment Created by `basename $0` 1.00 (c) AJCD `date`\n)print
fn /FontName known {
(FontName )print fn /FontName get pn nl
} {
(FontName $1\n) print
} ifelse
en StandardEncoding eq {
(EncodingScheme AdobeStandardEncoding\n)print
} {
en ISOLatin1Encoding eq {
(EncodingScheme ISOLatin1Encoding\n)print
} if
} ifelse
fn /FontInfo known {
fn /FontInfo get
dup /FamilyName known {
(FamilyName )print dup /FamilyName get print nl
} if
dup /FullName known {
(FullName )print dup /FullName get print nl
} if
dup /Notice known {
(Notice )print dup /Notice get print nl
} if
dup /Weight known {
(Weight )print dup /Weight get print nl
} if
dup /Version known {
(Version )print dup /Version get print nl
} if
dup /ItalicAngle known {
(ItalicAngle )print dup /ItalicAngle get pn nl
} if
dup /isFixedPitch known {
(IsFixedPitch )print dup /isFixedPitch get {(true)}{(false)}ifelse print
nl
} {
(IsFixedPitch false\n)print
} ifelse
dup /UnderlinePosition known {
(UnderlinePosition )print dup /UnderlinePosition get pn nl
} if
dup /UnderlineThickness known {
(UnderlineThickness )print dup /UnderlineThickness get pn nl
} if
pop
} if
(FontBBox )print fn /FontBBox get aload pop printbb nl
%CapHeight 662
%XHeight 448
%Descender -217
%Ascender 682
%(PaintType: )print fn /PaintType get pn (\n) print flush
(StartCharMetrics )print
fn /CharStrings get length 1 sub pn nl
% check encoded chars
0 1 255 {
dup en exch get
dup /.notdef ne { % C 77 ; WX 889 ; N M ; B 19 0 871 662 ;
(C ) print % character number
exch dup pn exch
( ; WX ) print % character width
fn /Metrics known {
dup fn /Metrics get exch get
dup type /arraytype eq {
dup length 2 eq
{1 get} {2 get} ifelse
} if
} {
( ) dup 0 4 index put stringwidth pop round cvi
} ifelse
pn
( ; N ) print % character name
pn
newpath 0 0 moveto
( ; B ) print % BoundingBox
( ) dup 0 4 -1 roll put
true charpath flattenpath pathbbox printbb
( ;\n) print % finished!
} {pop pop} ifelse
} for
% get unencoded characters into MyEncoding array (problem if >256 unencoded)
/MyEncoding 256 array def
/Reverse 256 dict def
Reverse begin
en { % reverse encoding dictionary
true def
} forall
end
0 % start at beginning of MyEncoding
fn /CharStrings get {
pop % discard encrypted string
dup Reverse exch known not % test if key is in normal encoding
{
MyEncoding 2 index 3 -1 roll put 1 add
} {pop} ifelse
} forall
1 255 { % fill out with notdefs
MyEncoding exch /.notdef put
} for
fn dup length dict begin
{1 index /FID ne {def} {pop pop} ifelse} forall
/Encoding MyEncoding def
currentdict
end /newfont exch definefont
dup /fn exch def setfont
/en MyEncoding def
% check encoded chars
0 1 255 {
dup en exch get
dup /.notdef ne { % C -1 ; WX 889 ; N M ; B 19 0 871 662 ;
(C -1) print % character number
( ; WX ) print % character width
fn /Metrics known {
dup fn /Metrics get exch get
dup type /arraytype eq {
dup length 2 eq
{1 get} {2 get} ifelse
} if
} {
( ) dup 0 4 index put stringwidth pop round cvi
} ifelse
pn
( ; N ) print % character name
pn
newpath 0 0 moveto
( ; B ) print % BoundingBox
( ) dup 0 4 -1 roll put
true charpath flattenpath pathbbox printbb
( ;\n) print % finished!
} {pop pop exit} ifelse
} for
(EndCharMetrics\n)print
flush
EOF