% 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 .setlanguagelevel4 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 defcurrentdict 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 defcurrentdict end /MappedCategoryRedefiner /ProcSet findresource /Redefine get exec.setlanguagelevel
% 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