summaryrefslogtreecommitdiff
path: root/dviware/dvitops/printafm.ps
blob: fadd755271d9fbf077a1689c0e3a244ca8ae4ea3 (plain)
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
%!
% $Header: /usr/jjc/dvitops/RCS/printafm.ps,v 1.1 89/02/01 09:19:41 jjc Rel $
% written by James Clark <jjc@jclark.uucp>
% print an afm file on the standard output
% usage is `fontname printafm' eg `/Times-Roman printafm'

/buf 256 string def
/onechar 1 string def
/box 4 array def

% c toupper - c
/toupper {
	dup dup 8#141 ge exch 8#172 le and { 
		8#40 sub
	} if
} bind def


% dict printinfo -
/printinfo {
	/FontInfo get {
		exch
		buf cvs dup dup 0 get 0 exch toupper put print
		( ) print
		buf cvs =
	} forall
} bind def

% dict printbbox -

/printbbox {
	(FontBBox) print
	/FontBBox get {
		( ) print
		round cvi buf cvs print
	} forall
	(\n) print
} bind def
	
% dict printcharmetrics -

/printcharmetrics {
	/d exch def
	(StartCharMetrics ) print
	d /CharStrings get dup length exch /.notdef known { 1 sub } if =
	d 1000 scalefont setfont 0 0 moveto
	/e d /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
	d /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
	d maxlength dict /f exch def
	d {
		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 /d exch def
	d 1000 scalefont setfont
	% print a entry for each character not in old vector
	/e d /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
	buf cvs print
	( ; WX ) print
	onechar 0 3 -1 roll put
	onechar stringwidth pop round cvi buf cvs print
	( ; N ) print
	buf cvs print
	( ; B ) print
	onechar false charpath flattenpath pathbbox box astore {
		round cvi buf cvs print
		( ) print
	} forall
	(;) =
	saved restore
} bind def

% fontname printafm -

/printafm {
	findfont /d exch def
	(StartFontMetrics 2.0) =
	(FontName ) print d /FontName get =
	d printinfo
	d printbbox
	d printcharmetrics
	(EndFontMetrics) =
} bind def