% Copyright (C) 2001-2021 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., 1305 Grant Avenue - Suite 200, Novato,
% CA 94945, 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 % -> 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 % MakeInstance
{ % We know that currentdict is the category.
/Substitute get dup type /stringtype eq
{
(r) file dup cvx exec closefile
dup
} if
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 dup type /stringtype eq not
{
exch ResourceFileName
} if
} bind def
/GetSize % GetSize
{ % 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 % GetCSI null
% 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 % IsActive
{ 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
% If CIDFSubstFont looks like a path/file (rather than just file)
% use it without the CIDFSubstPath string
dup .file_name_directory_separator rsearch
{pop pop pop exch pop}
{pop concatstrings}
ifelse
% 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
% .basename
/.splitdirname {
(/) rsearch { //true } { (\\) rsearch } ifelse
{exch concatstrings exch pop //true}{//false} ifelse
} bind def
% .addcidfmappath -
/.addcidfmpermitpath
{
.filename
{
//.splitdirname exec
{dup def} if
} if
} bind def
/VerifyMap % VerifyMap -
{
% 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
% Remove any mappings for which we cannot find the font file
dup length dict begin
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
{
dup //.addcidfmpermitpath exec closefile pop}
{
{(r) file} //.internalstopped exec
{pop pop 2 index exch .undef}
{dup //.addcidfmpermitpath exec closefile pop} ifelse
} ifelse
}
{2 index exch .undef}
ifelse
exit
} if
} ifelse
} loop
} forall
currentdict end
{exch pop /PermitFileReading exch .addcontrolpath} forall
% Checks for vicious substitution cycles.
dup length dict copy % <