shithub: riscv

ref: 5b7d8e1f6fb4167e354545fef7e6dd6676986441
dir: /sys/src/cmd/postscript/trofftable/trofftable.ps/

View raw version
%
% Prologue for building troff width tables. The gsave/grestore pairs are
% for hardcopy.
%

/slowdown 25 def
/flagduplicates false def

/ascenderheight -1 def
/descenderdepth 0 def
/octalescapes 256 def
/startcomments 256 def
/currentfontdict null def
/scratchstring 512 string def

/Print {
	scratchstring cvs print flush
	slowdown {1 pop} repeat
} def

/ReEncode {	% vector fontname ReEncode -
	dup
	findfont dup length dict begin
		{1 index /FID ne {def}{pop pop} ifelse} forall
		/Encoding 3 -1 roll def
		currentdict
	end
	definefont pop
} bind def

/SelectFont {	% fontname SelectFont -
	findfont
		dup /PaintType get 0 eq {
			/scaling 1 def
			unitwidth resolution 72.0 div mul
		}{
			/scaling resolution 72 div def
			unitwidth
		} ifelse 
	scalefont
	/currentfontdict exch def
} def

/ChangeMetrics {DpostPrologue begin addmetrics end} def

/NamedInPrologue {
	dup
	DpostPrologue exch known {
		DpostPrologue exch get type /nametype eq {
			(named in prologue\n) Print
		} if
	}{pop} ifelse
} def

/SetAscender {
	/str exch def

	gsave
		currentfontdict setfont
		newpath
		0 0 moveto
		str false charpath flattenpath pathbbox
		/descenderdepth 4 -1 roll .5 mul def
		exch pop exch pop

		newpath
		0 0 moveto
		str 0 1 getinterval false charpath flattenpath pathbbox
		4 1 roll pop pop pop
		dup 3 1 roll sub .25 mul add
		/ascenderheight exch def
	grestore
} def

/GetAscender {
	ascenderheight descenderdepth ge {
		gsave
			currentfontdict setfont
			newpath
			0 0 moveto
			( ) dup 0 4 -1 roll put
			false charpath flattenpath pathbbox
			exch pop 3 -1 roll pop
			ascenderheight gt {2}{0} ifelse
			exch descenderdepth lt {1}{0} ifelse
			or
		grestore
	}{0} ifelse
} def

/GetWidth {
	gsave
		currentfontdict setfont
		( ) dup 0 4 -1 roll put
		stringwidth pop scaling mul round cvi
	grestore
} def

/GetCode {
	256 3 1 roll		% last unprintable match
	0 3 -1 roll {
		2 index eq {
			dup 127 and 32 ge {exit} if
			3 -1 roll pop
			dup 3 1 roll
		} if
		1 add
	} forall
	exch pop
	dup 255 gt {pop}{exch pop} ifelse
} def

/BuildFontCharset {
	0 2 charset length 2 sub {
		/i exch def
		/chcode -1 def
		/chname null def
		/key charset i get def
		/val charset i 1 add get def

		val type /integertype eq {
			/chcode val def
			/chname currentfontdict /Encoding get chcode get def
		} if

		val type /nametype eq {
			/chname val def
			/chcode currentfontdict /Encoding get chname GetCode def
		} if

		val type /stringtype eq {/chcode 0 def} if

		chcode 0 lt chcode 255 gt or {
			chcode 0 lt {(syntaxerror: )}{(undefinedname: )} ifelse
			Print key Print (\t) Print val Print (\n) Print
			quit
		} if

		val type /stringtype eq {
			key Print
			(\t) Print val Print
			(\n) Print
		}{
			chcode octalescapes ge key (---) eq and {
				(\\0) Print chcode 8 (   ) cvrs Print
			}{key Print} ifelse
			(\t) Print chcode GetWidth Print
			(\t) Print chcode GetAscender Print
			(\t) Print chcode Print
			chcode startcomments ge {
				(\t# ) Print chname Print
			} if
			(\n) Print
			chcode octalescapes ge (---) key ne and {
				key (\\0) anchorsearch not {
					pop
					(\\0) Print chcode 8 (   ) cvrs Print
					(\t"\n) Print
				}{pop pop} ifelse
			} if
		} ifelse
	} for
} def

/BuildDescCharset {
	/DescDict 512 dict def
	/Characters 0 def

	0 1 charset length 1 sub {
		/i exch def
		/key charset i get def

		key length 2 eq {
			DescDict key cvn known {
				flagduplicates {	% for debugging
					(<<<duplicated character: ) Print
					key Print
					(>>>\n) Print
				} if
			}{
				DescDict key cvn 1 put
				key Print
				/Characters Characters 1 add def
				Characters 20 mod 0 eq {(\n)}{( )} ifelse Print
			} ifelse
		} if
	} for
} def