summaryrefslogtreecommitdiff
path: root/Master/tlpkg/tlgs/Resource/Init/gs_cidfm.ps
diff options
context:
space:
mode:
Diffstat (limited to 'Master/tlpkg/tlgs/Resource/Init/gs_cidfm.ps')
-rw-r--r--Master/tlpkg/tlgs/Resource/Init/gs_cidfm.ps254
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