/usr/bin/getafm is in psutils 1.17-31.
This file is owned by root:root, with mode 0o755.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 | #!/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
|