diff options
Diffstat (limited to 'Master/tlpkg/tlgs/Resource/Init/gs_cidfm.ps')
-rw-r--r-- | Master/tlpkg/tlgs/Resource/Init/gs_cidfm.ps | 254 |
1 files changed, 254 insertions, 0 deletions
diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_cidfm.ps b/Master/tlpkg/tlgs/Resource/Init/gs_cidfm.ps new file mode 100644 index 00000000000..9011634ef95 --- /dev/null +++ b/Master/tlpkg/tlgs/Resource/Init/gs_cidfm.ps @@ -0,0 +1,254 @@ +% Copyright (C) 2001-2012 Artifex Software, Inc. +% 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. +% +% Refer to licensing information at http://www.artifex.com or contact +% Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, San Rafael, +% CA 94903, U.S.A., +1(415)492-9861, for further information. +% + +% 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 /stringtype eq exch + dup type /nametype eq 3 -1 roll or +} bind def + +/RecordVirtualMethods 3 dict begin + + /MakeInstance % <Name> <record> MakeInstance <Name> <Instance> <size> + { % We know that currentdict is the category. + /Substitute get dup type /stringtype eq + { + (r) file dup cvx exec closefile + dup + } if + + 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 dup type /stringtype eq not + { + exch ResourceFileName + } if + } bind def + + /GetSize % <Name> <record> GetSize <size> + { % We know that currentdict is the category. + dup /Substitute get dup type /stringtype eq + { + % The simplest solution is to instantiate the resource + pop //MakeInstance exec + 3 1 roll pop pop + } + { + exch pop + ResourceStatus { + exch pop exch pop + } { + /undefinedresource signalerror + } ifelse + }ifelse + } bind def + + /GetCSI % <record> GetCSI null + % <record> GetCSI dict + { % We know that currentdict is the category. + RESMPDEBUG { (cidfm GetCSI beg ) = } if + dup /Substitute get dup type /stringtype eq + { + pop + dup /Name get exch //MakeInstance exec + pop exch pop + /CIDSystemInfo get + } + { + exch pop % /Name + GetCIDSystemInfoFromMap + } ifelse + RESMPDEBUG { (cidfm GetCSI end ) print dup = } if + } bind def + + /IsActive % <record> IsActive <bool> + { pop //true + } bind def + +currentdict end def + +% This is the default definition of our fallback CIDFont +/DefaultCIDFallBack +<< + /Path + systemdict /CIDFSubstPath .knownget + { + (/) concatstrings + } + { + (CIDFSUBSTPATH) getenv + { + (/) concatstrings + } + { + currentsystemparams /GenericResourceDir get (CIDFSubst/) concatstrings + } ifelse + } ifelse + + systemdict /CIDFSubstFont .knownget not + { + (CIDFSUBSTFONT) getenv not + { + (DroidSansFallback.ttf) + } if + } if + concatstrings + % The CSI data just has to be valid, the substition machinery will + % generally overwrite it with appropriate values for the missing font. + /CSI [(Identity) 0] + /RecordVirtualMethods //RecordVirtualMethods + /FileType /TrueType + + (CIDFSUBSTFONTID) getenv + { + /SubfontID exch cvi + } if +>> def + +/VerifyMap % <raw_map> VerifyMap - +{ + % Remove any mappings for which we cannot find the font file + dup + { + % if we have a name1->name2 mapping, follow the "trail", + % so if the name2 mapping is known in the .map dict, retrieve + % that map value and loop round until we either reach a map + % which references a TTF (i.e. a dictionary record) or we have + % a name not known in the .map, in which case we have to resort + % to the normal Postscript "resourcestatus". + { + dup type /nametype eq + { + dup 3 index exch .knownget + { exch pop } + { + /CIDFont resourcestatus + { pop pop pop } + { 2 index exch .undef } + ifelse + exit + } ifelse + } + { + dup type /dicttype eq + { + /Path .knownget + { + .libfile + {closefile pop} + { + {(r) file} .internalstopped + {pop pop 2 index exch .undef} + {closefile pop} ifelse + } ifelse + } + {2 index exch .undef} + ifelse + exit + } if + } ifelse + } loop + } forall + + % This is where we insert the default fallback into the map + % checking first to see if there is a user specified alternative + dup /CIDFallBack known not{ + //DefaultCIDFallBack dup /Path get status + { + pop pop pop pop + /CIDFallBack exch 2 index 3 1 roll put + } + { + pop + }ifelse + } if + + % 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 + dup /Name exch def + /RecordVirtualMethods //RecordVirtualMethods def + currentdict end + //true + } { + //false + } ifelse +} bind def + +currentdict end + +/MappedCategoryRedefiner /ProcSet findresource /Redefine get exec + +.setlanguagelevel |