365 lines
6.2 KiB
Bash
365 lines
6.2 KiB
Bash
#!/bin/sh
|
|
|
|
if [ $# -ne 1 ]; then
|
|
echo "usage: $0 font-name | gsnd -q - >font-name.afm" >&2
|
|
exit 1
|
|
fi
|
|
|
|
cat << EOF
|
|
%!
|
|
% produce .afm for $1
|
|
% (c) 1993 by Robert Joop <rj@rainbow.in-berlin.de>
|
|
% inspired by two other versions of this theme which are
|
|
% getafm 1.00 (c) AJCD
|
|
% and getafm.ps by an unknown author,
|
|
% modified by J. Daniel Smith <dsmith@mailhost.aa.cad.slb.com>
|
|
%
|
|
% modified by Joachim H. Kaiser <jhk@cmpnetmail.com>:
|
|
% - suggest a quiet gs run in usage
|
|
% - get font version info (from 'version', not 'Version')
|
|
% - add copyright field to output
|
|
|
|
% Metrics dictionary code added by AJCD, 7/6/93
|
|
|
|
/getafmdict 100 dict dup begin
|
|
|
|
/buf 256 string def
|
|
/buf2 16 string def
|
|
|
|
/prany % dict dictname printname -> dict
|
|
{
|
|
2 index 2 index cvn known
|
|
{
|
|
print % printname
|
|
( ) print
|
|
1 index exch cvn get =
|
|
}
|
|
{
|
|
(Comment /FontInfo contains no /) print
|
|
2 copy eq
|
|
{
|
|
= % printname
|
|
pop % dictname
|
|
}
|
|
{
|
|
exch
|
|
print % dictname
|
|
(, therefore no ) print
|
|
= % printname
|
|
}
|
|
ifelse
|
|
}
|
|
ifelse
|
|
}
|
|
bind def
|
|
|
|
/printfontname
|
|
{
|
|
(FontName)dup prany
|
|
}
|
|
bind def
|
|
|
|
/printfontinfo
|
|
{
|
|
dup /FontInfo known
|
|
{
|
|
dup /FontInfo get
|
|
(FullName)dup prany
|
|
(FamilyName)dup prany
|
|
(Weight)dup prany
|
|
(ItalicAngle)dup prany
|
|
(isFixedPitch)(IsFixedPitch) prany
|
|
(UnderlinePosition)dup prany
|
|
(UnderlineThickness)dup prany
|
|
(version)(Version) prany
|
|
(Notice)dup prany
|
|
(Copyright)dup prany
|
|
pop
|
|
}
|
|
{
|
|
(Comment Font lacks a /FontInfo!)=
|
|
}
|
|
ifelse
|
|
}
|
|
bind def
|
|
|
|
/prbbox % llx lly urx ury -> -
|
|
{
|
|
4 1 roll 3 1 roll exch % swap top 4 elements
|
|
4 { ( ) print buf cvs print } repeat
|
|
}
|
|
bind def
|
|
|
|
/getbbox % fontdict chardict character -> fontdict chardict llx lly urx ury
|
|
{
|
|
gsave
|
|
2 index setfont 0 0 moveto
|
|
false charpath flattenpath pathbbox
|
|
grestore
|
|
}
|
|
bind def
|
|
|
|
/printmiscinfo
|
|
{
|
|
dup /FontBBox known
|
|
{
|
|
(FontBBox) print
|
|
dup /FontBBox get aload pop prbbox ()=
|
|
}
|
|
{
|
|
(Comment missing required /FontBBox)=
|
|
quit
|
|
}
|
|
ifelse
|
|
2 copy exch get
|
|
dup /H known
|
|
1 index /x known and
|
|
1 index /d known and
|
|
1 index /p known and
|
|
dup /looksRoman exch def
|
|
{
|
|
(CapHeight ) print
|
|
(H) getbbox
|
|
ceiling cvi = pop pop pop
|
|
(XHeight ) print
|
|
(x) getbbox
|
|
ceiling cvi = pop pop pop
|
|
(Ascender ) print
|
|
(d) getbbox
|
|
ceiling cvi = pop pop pop
|
|
(Descender ) print
|
|
(p) getbbox
|
|
pop pop floor cvi = pop
|
|
}
|
|
{
|
|
(Comment font doesn't contain H, x, d and p; therefore no CapHeight, XHeight, Ascender and Descender)=
|
|
}
|
|
ifelse
|
|
pop
|
|
dup /Encoding get
|
|
[
|
|
[ (ISOLatin1Encoding) /ISOLatin1Encoding ]
|
|
[ (AdobeStandardEncoding) /StandardEncoding ]
|
|
]
|
|
{
|
|
aload pop dup where
|
|
{
|
|
exch get 2 index eq
|
|
{
|
|
(EncodingScheme ) print
|
|
buf cvs =
|
|
}
|
|
{
|
|
pop
|
|
}
|
|
ifelse
|
|
}
|
|
{
|
|
pop pop
|
|
}
|
|
ifelse
|
|
}
|
|
forall
|
|
pop
|
|
}
|
|
bind def
|
|
|
|
/printcharmetric
|
|
{
|
|
% chardictname fontdict charnamedict encoding charindex charname
|
|
|
|
4 index dup length dict dup begin exch
|
|
{
|
|
1 index /FID ne
|
|
2 index /UniqueID ne
|
|
and
|
|
{
|
|
1 index /Encoding eq { 256 array copy } if
|
|
def
|
|
}
|
|
{ pop pop }
|
|
ifelse
|
|
}
|
|
forall
|
|
end
|
|
dup /Encoding get 32 3 index put
|
|
/f2 exch definefont
|
|
setfont
|
|
|
|
(C ) print
|
|
1 index buf cvs print
|
|
|
|
( ; WX ) print
|
|
% Metrics entries are:
|
|
% 1 number: which is the character width
|
|
% an array of 2 numbers: which are the left sidebearing and width
|
|
% an array of 4 numbers: x & y left sidebearing, width and height
|
|
dup 5 index % /charname fontdict
|
|
dup /Metrics known {
|
|
/Metrics get exch 2 copy known {
|
|
get dup type /arraytype eq {
|
|
dup length 2 eq
|
|
{1 get} {2 get} ifelse
|
|
} if
|
|
round cvi buf cvs print
|
|
} {
|
|
pop pop ( ) stringwidth pop round cvi buf cvs print
|
|
} ifelse
|
|
} {
|
|
pop pop ( ) stringwidth pop round cvi buf cvs print
|
|
} ifelse
|
|
|
|
( ; N ) print
|
|
dup buf cvs print
|
|
|
|
( ; B) print
|
|
gsave
|
|
newpath 0 0 moveto
|
|
( ) true charpath flattenpath pathbbox
|
|
grestore
|
|
2 { ceiling cvi 4 1 roll } repeat
|
|
2 { floor cvi 4 1 roll } repeat
|
|
prbbox
|
|
|
|
looksRoman
|
|
{
|
|
[
|
|
[ /f [ /i /f /l ] ]
|
|
[ /ff [ /i /l ] ]
|
|
]
|
|
{
|
|
aload pop 1 index 3 index eq
|
|
{
|
|
{
|
|
1 index buf cvs
|
|
length
|
|
1 index buf2 cvs dup length
|
|
2 index add
|
|
buf
|
|
4 2 roll putinterval
|
|
buf 0
|
|
3 -1 roll getinterval
|
|
dup cvn
|
|
7 index
|
|
exch known
|
|
{
|
|
exch
|
|
( ; L ) print
|
|
buf2 cvs print
|
|
( ) print
|
|
print
|
|
}
|
|
{
|
|
pop pop
|
|
}
|
|
ifelse
|
|
}
|
|
forall
|
|
pop
|
|
}
|
|
{
|
|
pop pop
|
|
}
|
|
ifelse
|
|
}
|
|
forall
|
|
}
|
|
if
|
|
pop
|
|
|
|
( ;)=
|
|
}
|
|
bind def
|
|
|
|
/printcharmetrics
|
|
{
|
|
(StartCharMetrics ) print
|
|
2 copy exch get length 1 sub buf cvs =
|
|
|
|
256 dict dup begin
|
|
1 index /Encoding get
|
|
{ null def }
|
|
forall
|
|
end
|
|
% chardictname fontdict charnamedict
|
|
1 index /Encoding get
|
|
0 1 255
|
|
{
|
|
% encoding index
|
|
2 copy get
|
|
dup /.notdef eq { pop } { printcharmetric } ifelse
|
|
pop % index
|
|
} for
|
|
|
|
-1
|
|
3 index 5 index get
|
|
{
|
|
pop
|
|
dup /.notdef eq
|
|
{ pop }
|
|
{
|
|
% chardictname fontdict charnamedict encoding charindex charname
|
|
dup 4 index exch known
|
|
{ pop }
|
|
{ printcharmetric }
|
|
ifelse
|
|
}
|
|
ifelse
|
|
}
|
|
forall
|
|
% charnamedict encoding index
|
|
pop pop pop
|
|
|
|
(EndCharMetrics)=
|
|
}
|
|
bind def
|
|
|
|
/printfontmetrics
|
|
{
|
|
(StartFontMetrics 3.0)=
|
|
(Comment Produced by getafm 3.0 (which is by rj@rainbow.in-berlin.de))=
|
|
|
|
printfontname
|
|
printfontinfo
|
|
printmiscinfo
|
|
printcharmetrics
|
|
|
|
(EndFontMetrics)=
|
|
}
|
|
bind def
|
|
|
|
end def
|
|
|
|
/getafm
|
|
{
|
|
getafmdict begin
|
|
save exch
|
|
findfont 1000 scalefont
|
|
|
|
null
|
|
[ /CharDefs /CharData /CharProcs /CharStrings ]
|
|
{
|
|
2 index 1 index known { exch } if
|
|
pop
|
|
}
|
|
forall
|
|
dup null eq
|
|
{
|
|
(can't find dictionary with character data!)=
|
|
quit
|
|
}
|
|
if
|
|
exch % dictname fontdict
|
|
|
|
printfontmetrics
|
|
|
|
pop pop
|
|
restore
|
|
end
|
|
}
|
|
bind def
|
|
|
|
/$1 getafm
|
|
|
|
EOF
|