diff options
Diffstat (limited to 'Master/xemtex/gslib/cid2code.ps')
-rw-r--r-- | Master/xemtex/gslib/cid2code.ps | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/Master/xemtex/gslib/cid2code.ps b/Master/xemtex/gslib/cid2code.ps new file mode 100644 index 00000000000..48a4c28bef4 --- /dev/null +++ b/Master/xemtex/gslib/cid2code.ps @@ -0,0 +1,161 @@ +% Copyright (C) 1998, 2000 Aladdin Enterprises. All rights reserved. +% +% This program is free software; you can redistribute it and/or modify it +% under the terms of the GNU General Public License as published by the +% Free Software Foundation; either version 2 of the License, or (at your +% option) any later version. +% +% This program is distributed in the hope that it will be useful, but +% WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +% Public License for more details. +% +% You should have received a copy of the GNU General Public License along +% with this program; if not, write to the Free Software Foundation, Inc., +% 59 Temple Place, Suite 330, Boston, MA, 02111-1307. + +% $Id: cid2code.ps,v 1.3.4.1.2.1 2003/04/12 14:02:38 giles Exp $ +% Construct an inverse map from CIDs to codes. + +% Create an inverse map from CIDs to code values. +% We only use this for 16-bit Unicode, so it has some limitations. +% After invoking .cmap2code, loading a CMap file prints out the map +% instead of doing what it usually does. For example: +% +% gs -dNODISPLAY -dBATCH lib/cid2code.ps -c .cmap2code\ +% -f Resource/CMap/UniJIS-UCS2-H > mapfile + +/.cmap2codedict 10 dict begin + +/begincmap { + mark +} def +/endcmap { + % Stack: mark code_lo1 code_hi1 cid1 ... + 20 dict begin + /depth counttomark 3 sub def + % Do a first pass to determine the maximum CID. + 0 0 3 depth { + 1 add /d exch def + d index d 2 add index 1 get add d 3 add index 1 get sub .max + } for + 1 add /ncid exch def + /map ncid 2 mul string def + % Now fill in the map. + 0 3 depth { + /d exch def + d index 2 mul /cid2 exch def + d 1 add index /hi exch def + d 2 add index 2 string copy /lo exch def + lo 1 get 1 hi 1 get { + map cid2 lo 0 get put + map cid2 1 add 3 -1 roll put + /cid2 cid2 2 add def + } for + } for + % Print the map. + (%stdout) (w) file + dup (<) print + dup /ASCIIHexEncode filter + dup map writestring + closefile + () = flush + closefile + end +} def +%/begincodespacerange +/endcodespacerange {cleartomark} def +%/usecmap + +%/beginbfchar +/endbfchar {cleartomark} def +%/beginbfrange +/endbfrange {cleartomark} def + +%/begincidchar +/endcidchar { + counttomark 2 idiv { dup counttomark 1 add 3 roll } repeat pop +} def +%/begincidrange +/endcidrange { + counttomark 1 add -1 roll pop +} def + +%/beginnotdefchar +/endnotdefchar {cleartomark} def +%/beginnotdefrange +/endnotdefrange {cleartomark} def + +currentdict end readonly def + +/.cmap2code { % - .cmap2code - + /CIDInit /ProcSet findresource dup length dict copy + .cmap2codedict { 3 copy put pop pop } forall + /CIDInit exch /ProcSet defineresource pop +} def + +% Extract and print reverse mapping information from a cid2code.txt file. +/.printhex2 { % <int16> .printhex2 - + (<) print + 16#10000 add 16 =string cvrs 1 4 getinterval print + (>) print +} def +/.cid2code { % <cmaptemplate> <file> <column> .cid2code - + 30 dict begin + /column exch def + (r) file /f exch def + (%!) = + (/CIDInit /ProcSet findresource begin 12 dict begin begincmap) = + % Print the information from the template. + { + exch ==only ( ) print + dup type /dicttype eq { + dup length =only ( dict dup begin) = { + ( ) print exch ===only ( ) print ===only ( def) = + } forall (end def) = + } { + ===only + } ifelse ( def) = + } forall + % Read the data from the cid2code.txt file. + { + f =string readline pop (CID\t) anchorsearch { pop pop exit } if pop + } loop + /map [ { + f =string readline not { pop exit } if + column { (\t) search pop pop pop } repeat + (\t) search { exch pop exch pop } if + (,) search { exch pop exch pop } if + dup length 4 ne { pop (*) } if + dup (*) eq { pop (0000) } if + (16#) exch concatstrings cvi + } loop ] def + % Print the code space range(s). + /maxcid map length 1 sub def + mark maxcid + dup 255 and 255 eq { + 0 exch + } { + dup 16#ff00 and exch 0 2 index 1 sub + } ifelse + counttomark 2 idiv dup =only ( begincodespacerange) = { + exch .printhex2 .printhex2 () = + } repeat (endcodespacerange) = + % Print the map data. + 0 1 100 maxcid { + /lo exch def + /hi lo 99 add maxcid .min def + 0 lo 1 hi { map exch get 0 ne { 1 add } if } for + dup 0 eq { + pop + } { + =only ( begincidchar) = lo 1 hi { + map 1 index get dup 0 eq { pop pop } { exch .printhex2 = } ifelse + } for (endcidchar) = + } ifelse + } for + % Wrap up. + (endcmap CMapName currentdict /CMap defineresource pop end end) = + f closefile + end +} bind def |