123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- % Copyright (C) 1998, 2000 Aladdin Enterprises. All rights reserved.
- %
- % This file is part of AFPL Ghostscript.
- %
- % AFPL Ghostscript is distributed with NO WARRANTY OF ANY KIND. No author or
- % distributor accepts any responsibility for the consequences of using it, or
- % for whether it serves any particular purpose or works at all, unless he or
- % she says so in writing. Refer to the Aladdin Free Public License (the
- % "License") for full details.
- %
- % Every copy of AFPL Ghostscript must include a copy of the License, normally
- % in a plain ASCII text file named PUBLIC. The License grants you the right
- % to copy, modify and redistribute AFPL Ghostscript, but only under certain
- % conditions described in the License. Among other things, the License
- % requires that the copyright notice and this notice be preserved on all
- % copies.
- % $Id: cid2code.ps,v 1.3 2000/11/30 18:22:11 lpd 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
|