1 % Copyright (C) 2000 artofcode LLC. All rights reserved.
3 % This software is provided AS-IS with no warranty, either express or
6 % This software is distributed under license and may not be copied,
7 % modified or distributed except as expressly authorized under the terms
8 % of the license contained in the file LICENSE in this distribution.
10 % For more information about licensing, please refer to
11 % http://www.ghostscript.com/licensing/. For information on
12 % commercial licensing, go to http://www.artifex.com/licensing/ or
13 % contact Artifex Software, Inc., 101 Lucas Valley Road #110,
14 % San Rafael, CA 94903, U.S.A., +1(415)492-9861.
16 % $Id: gs_cidfm.ps,v 1.7 2004/10/25 15:11:37 igor Exp $
17 % Redefine CIDFont category with cidfmap .
19 languagelevel 2 .setlanguagelevel
22 /CategoryName /CIDFont def
24 /MapFileName (cidfmap) def
26 /IsMyRecord % <raw_record> -> <raw_record> bool
27 { % Only for client's needs.
31 /RecordVirtualMethods 3 dict begin
33 /MakeInstance % <Name> <record> MakeInstance <Name> <Instance> <size>
34 { % We know that currentdict is the category.
35 /Substitute get FindResource % /Name <<CIDFont>>
36 dup length dict copy % /Name <<CIDFont>>
37 1 index ResourceStatus pop exch pop % /Name <<CIDFont>> size
40 /GetFilePath % <scratch> <Name> <record> GetFilePath <filepath>
41 { % We know that currentdict is the category.
43 /Substitute get exch ResourceFileName
46 /GetSize % <Name> <record> GetSize <size>
47 { % We know that currentdict is the category.
48 /Substitute get ResourceStatus {
51 /undefinedresource signalerror
55 /GetCSI % <record> GetCSI null
56 % <record> GetCSI dict
57 { % We know that currentdict is the category.
58 RESMPDEBUG { (cidfm GetCSI beg ) = } if
59 /Substitute get % /Name
60 GetCIDSystemInfoFromMap
61 RESMPDEBUG { (cidfm GetCSI end ) print dup = } if
64 /IsActive % <record> IsActive <bool>
70 /VerifyMap % <raw_map> VerifyMap -
71 { % Checks for vicious substitution cycles.
72 dup length dict copy % <<map>>
73 dup length dict % <<map>> <<temp>>
74 { % Choose a random record :
75 true 2 index { % <<map>> <<temp>> true /Name /Subs
76 3 2 roll pop false exit % <<map>> <<temp>> /Name /Subs false
78 { exit % <<map>> <<temp>>
79 } if % <<map>> <<temp>> /Name /Subs
80 % Move the substitution chain to <<temp>>, checking for a cycle :
81 3 index 2 index undef % <<map>> <<temp>> /Name /Subs
82 exch 2 index exch 0 put % <<map>> <<temp>> /Subs
83 { //IsMyRecord exec not {
84 % Not a substitution, the chain terminates.
85 pop exit % <<map>> <<temp>>
86 } if % <<map>> <<temp>> /Subs
87 1 index 1 index known {
88 (Vicious substitution cycle in map file with the entry ) print =string cvs print ( .) =
89 /VerifyMap cvx /undefinedresource signalerror
90 } if % <<map>> <<temp>> /Subs
92 dup 3 index exch .knownget not { % <<map>> <<temp>> /Subs
93 % No more substitutions, the chain terminates.
94 pop exit % <<map>> <<temp>>
95 } if % <<map>> <<temp>> /Subs /Subs1
96 exch % <<map>> <<temp>> /Subs1 /Subs
97 3 index exch undef % <<map>> <<temp>> /Subs1
99 % Not cycled, now purge the <<temp>> :
100 { % Choose a random record :
101 true 1 index { % <<map>> <<temp>> true /Name /Subs
102 3 2 roll pop false exit % <<map>> <<temp>> /Name /Subs false
104 { exit % <<map>> <<temp>>
105 } if % <<map>> <<temp>> /Name /Subs
107 pop 1 index exch undef % <<map>> <<temp>>
113 /PreprocessRecord % <map> <Name> <raw_record> PreprocessRecord <map> <Name> <record> <bool>
114 { //IsMyRecord exec {
117 /RecordVirtualMethods //RecordVirtualMethods def
127 /MappedCategoryRedefiner /ProcSet findresource /Redefine get exec