% 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 % -> bool { % Only for client's needs. dup type /nametype eq } bind def /RecordVirtualMethods 3 dict begin /MakeInstance % MakeInstance { % We know that currentdict is the category. /Substitute get FindResource % /Name <> dup length dict copy % /Name <> 1 index ResourceStatus pop exch pop % /Name <> size } bind def /GetFilePath % GetFilePath { % We know that currentdict is the category. exch pop /Substitute get exch ResourceFileName } bind def /GetSize % GetSize { % We know that currentdict is the category. /Substitute get ResourceStatus { exch pop exch pop } { /undefinedresource signalerror } ifelse } bind def /GetCSI % GetCSI null % 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 % IsActive { pop true } bind def currentdict end def /VerifyMap % VerifyMap - { % Checks for vicious substitution cycles. dup length dict copy % <> dup length dict % <> <> { % Choose a random record : true 2 index { % <> <> true /Name /Subs 3 2 roll pop false exit % <> <> /Name /Subs false } forall { exit % <> <> } if % <> <> /Name /Subs % Move the substitution chain to <>, checking for a cycle : 3 index 2 index undef % <> <> /Name /Subs exch 2 index exch 0 put % <> <> /Subs { //IsMyRecord exec not { % Not a substitution, the chain terminates. pop exit % <> <> } if % <> <> /Subs 1 index 1 index known { (Vicious substitution cycle in map file with the entry ) print =string cvs print ( .) = /VerifyMap cvx /undefinedresource signalerror } if % <> <> /Subs 1 index 1 index 0 put dup 3 index exch .knownget not { % <> <> /Subs % No more substitutions, the chain terminates. pop exit % <> <> } if % <> <> /Subs /Subs1 exch % <> <> /Subs1 /Subs 3 index exch undef % <> <> /Subs1 } loop % Not cycled, now purge the <> : { % Choose a random record : true 1 index { % <> <> true /Name /Subs 3 2 roll pop false exit % <> <> /Name /Subs false } forall { exit % <> <> } if % <> <> /Name /Subs % Remove it : pop 1 index exch undef % <> <> } loop } loop pop pop % } bind def /PreprocessRecord % PreprocessRecord { //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