blob: e1f8c2415a25504bd7c985d9e20beb2ab6414dee [file] [log] [blame]
% Encoding vector, operator and procedure redefinitions for Plan 9 UTF
% encoding. Prologues are expected to take steps to ensure operator
% redefinitions given here are actually used. Current implementation
% assumes UTF byte streams that represent ASCII or Latin1 text.
/UTFLatin1Encoding [
] def
/NewFontDirectory FontDirectory maxlength dict def
% Apparently no guarantee findfont is defined in systemdict so the obvious
% systemdict /findfont get exec
% can generate an error. So far the only exception is a VT600 (version 48.0).
userdict /@RealFindfont known not {
userdict begin
/@RealFindfont systemdict begin /findfont load end def
} if
/findfont {
dup NewFontDirectory exch known not {
%dup systemdict /findfont get exec % not always in systemdict
dup userdict /@RealFindfont get exec
dup /Encoding get StandardEncoding eq {
dup length 1 add dict begin
{1 index /FID ne {def}{pop pop} ifelse} forall
/Encoding UTFLatin1Encoding def
/Metrics 1 dict def
Metrics /.notdef 0 put
/DummyFontName exch definefont
} if
NewFontDirectory 3 1 roll put
} if
NewFontDirectory exch get
} bind def
% UTF string decoding for ASCII and Latin1 only:
% C2 XX => 00 XX
% C3 XX => XX+40 00
% Two passes through each string with search is undoubtedly faster than
% PostScript that examines each byte.
/UTFstring {
dup {
(\302) search {
0 0 put
}{pop exit} ifelse
} loop
dup {
(\303) search {
1 index 0 get 16#40 add 0 exch put
dup length 0 gt {dup 0 0 put} if
}{pop exit} ifelse
} loop
} bind def
/ashow {mark 4 1 roll UTFstring //ashow cvx exec cleartomark} bind def
/awidthshow {mark 7 1 roll UTFstring //awidthshow cvx exec cleartomark} bind def
/show {mark exch UTFstring //show cvx exec cleartomark} bind def
/stringwidth {UTFstring //stringwidth cvx exec} bind def
/widthshow {mark 5 1 roll UTFstring //widthshow cvx exec cleartomark} bind def
% kshow is harder - stack can't change because of the procedure.
/kshow dup load type /operatortype eq
{{UTFstring kshow} bind}
{{UTFstring //kshow cvx exec} bind}
ifelse def