129 lines · 4.5 KB · Text
RawDownload
%    Copyright (C) 2000 artofcode LLC.  All rights reserved.% % This software is provided AS-IS with no warranty, either express or% implied.% % This software is distributed under license and may not be copied,% modified or distributed except as expressly authorized under the terms% of the license contained in the file LICENSE in this distribution.% % For more information about licensing, please refer to% http://www.ghostscript.com/licensing/. For information on% commercial licensing, go to http://www.artifex.com/licensing/ or% contact Artifex Software, Inc., 101 Lucas Valley Road #110,% San Rafael, CA  94903, U.S.A., +1(415)492-9861. % $Id: gs_cidfm.ps,v 1.7 2004/10/25 15:11:37 igor Exp $% Redefine CIDFont category with cidfmap . languagelevel 2 .setlanguagelevel 4 dict begin/CategoryName /CIDFont def /MapFileName (cidfmap) def /IsMyRecord      % <raw_record> -> <raw_record> bool{ % Only for client's needs.  dup type /nametype eq} bind def /RecordVirtualMethods 3 dict begin   /MakeInstance   % <Name> <record> MakeInstance <Name> <Instance> <size>  { % We know that currentdict is the category.    /Substitute get FindResource            % /Name <<CIDFont>>    dup length dict copy                    % /Name <<CIDFont>>    1 index ResourceStatus pop exch pop     % /Name <<CIDFont>> size  } bind def   /GetFilePath  % <scratch> <Name> <record> GetFilePath <filepath>  { % We know that currentdict is the category.    exch pop    /Substitute get exch ResourceFileName  } bind def   /GetSize   % <Name> <record> GetSize <size>  { % We know that currentdict is the category.    /Substitute get ResourceStatus {      exch pop exch pop    } {      /undefinedresource signalerror    } ifelse  } bind def   /GetCSI   % <record> GetCSI null  	    % <record> GetCSI dict  { % We know that currentdict is the category.    RESMPDEBUG { (cidfm GetCSI beg ) = } if    /Substitute get			% /Name    GetCIDSystemInfoFromMap    RESMPDEBUG { (cidfm GetCSI end ) print dup = } if  } bind def   /IsActive % <record> IsActive <bool>  { pop true  } bind def currentdict end def /VerifyMap  % <raw_map> VerifyMap -{ % Checks for vicious substitution cycles.  dup length dict copy                  % <<map>>  dup length dict                       % <<map>> <<temp>>  { % Choose a random record :    true 2 index {                      % <<map>> <<temp>> true /Name /Subs      3 2 roll pop false exit           % <<map>> <<temp>> /Name /Subs false    } forall    { exit                              % <<map>> <<temp>>    } if                                % <<map>> <<temp>> /Name /Subs    % Move the substitution chain to <<temp>>, checking for a cycle :    3 index 2 index undef               % <<map>> <<temp>> /Name /Subs    exch 2 index exch 0 put             % <<map>> <<temp>> /Subs    { //IsMyRecord exec not {        % Not a substitution, the chain terminates.        pop exit                        % <<map>> <<temp>>      } if                              % <<map>> <<temp>> /Subs      1 index 1 index known {        (Vicious substitution cycle in map file with the entry ) print =string cvs print ( .) =        /VerifyMap cvx /undefinedresource signalerror      } if                              % <<map>> <<temp>> /Subs      1 index 1 index 0 put      dup 3 index exch .knownget not {  % <<map>> <<temp>> /Subs        % No more substitutions, the chain terminates.        pop exit                        % <<map>> <<temp>>      } if                              % <<map>> <<temp>> /Subs /Subs1      exch                              % <<map>> <<temp>> /Subs1 /Subs      3 index exch undef                % <<map>> <<temp>> /Subs1    } loop    % Not cycled, now purge the <<temp>> :    { % Choose a random record :      true 1 index {                    % <<map>> <<temp>> true /Name /Subs        3 2 roll pop false exit         % <<map>> <<temp>> /Name /Subs false      } forall      { exit                            % <<map>> <<temp>>      } if                              % <<map>> <<temp>> /Name /Subs      % Remove it :      pop 1 index exch undef            % <<map>> <<temp>>    } loop  } loop  pop pop                               %} bind def /PreprocessRecord  % <map> <Name> <raw_record> PreprocessRecord <map> <Name> <record> <bool>{ //IsMyRecord exec {    1 dict begin    /Substitute exch def    /RecordVirtualMethods //RecordVirtualMethods def    currentdict end    true  } {    false  } ifelse} bind def currentdict end  /MappedCategoryRedefiner /ProcSet findresource /Redefine get exec .setlanguagelevel