You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
% Copyright (C) 2001-2023 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., 39 Mesa Street, Suite 108A, San Francisco,
% CA 94129, USA, for further information.
%
% Redefine CIDFont category with an emulation with True Type fonts.
languagelevel 2 .setlanguagelevel
15 dict begin % a temporary dictionary for local binding.
%------------------Copy the FontEmulationProcs here : -------------------
/FontEmulationProcs /ProcSet findresource { def} forall
currentdict /super.complete_instance currentdict /complete_instance get put
%-------Auxiliary procedures for building CIDFontType 2 from TT file -----------
/GenerateCIDMap % <font> GenerateCIDMap <font>
{ begin % Obtain the maximal CID :
% This implementation doesn't check whether glyphs really present.
Decoding /CIDCount get /CIDCount exch def % Prepare the CIDMap structure :
/CIDMap [ CIDCount 22000 le { CIDCount 2 mul string } { 44000 string CIDCount 44000 gt { % need three strings
44000 string % 22000 2 mul string
CIDCount 44000 sub 2 mul string } { CIDCount 22000 sub 2 mul string } ifelse } ifelse ] def % Now fill it :
Decoding TT_cmap SubstNWP GDBytes CIDMap .fillCIDMap currentdict end} .internalbind def
/GenerateIdentityCIDMap % <font> GenerateCIDMap <font>
{ begin /CIDMap [ 44000 string 44000 string 44000 string] def CIDMap .fillIdentityCIDMap currentdict end} .internalbind def
/load_sfnts % <FontDict> load_sfnts <FontDict>
{ % Read the True Type file from the path /Path, and buld /sfnts,
% skipping glyf and loca.
dup /Path get % <font> (path)
QUIET not { (Loading a TT font from ) print dup print ( to emulate a CID font ) print 1 index /CIDFontName get =only ( ... ) print } if (r) file dup % <font> file file
3 1 roll % file <font> file
1 index /SubfontID .knownget not { 0 } if % file <font> file SubfontID
2 index /FileType .knownget {/WOFF eq} {//false} ifelse % It's not (currently) viable to load WOFF fonts "stripped", so we don't try
{.load_woff_for_cid exch copy exch pop} { .load_tt_font_stripped exch copy % file <font>
QUIET not { (Done.) = } if dup 3 1 roll % <font> file <font>
exch /File exch put % <font>
} ifelse dup dup /CIDSystemInfo get /Ordering get (.) % <font> () ()
2 index /Decoding get =string cvs % <font> () () ()
concatstrings concatstrings cvn /Decoding exch put % <font>
dup dup /CIDSystemInfo get /Ordering get (-WMode) % <font> <font> () ()
concatstrings cvn /SubstCID 2 copy resourcestatus { pop pop findresource /subst_CID_on_WMode exch put % <font>
} { pop pop pop } ifelse dup /Decoding get /Identity.Unicode eq { //ChooseDecoding exec % <font>
//GenerateIdentityCIDMap exec % <font>
} { //ChooseDecoding exec % <font>
//GenerateCIDMap exec % <font>
} ifelse} .internalbind def
%-----------TrueType-specific methods for category redefinition : -----------
/RefinePath % <FontDict> RefinePath <FontDict>
{ dup begin Path .libfile { dup .filename { currentdict exch /Path exch put } if closefile } { (r) { file } //.internalstopped exec { (Can't find the font file ) print = /findfont cvx /undefinedfilename signalerror } { dup .filename { currentdict exch /Path exch put } if closefile } ifelse } ifelse end} .internalbind def
/complete_instance % <font_name> <FontDict> <Options> complete_FAPI_Font <font_name> <FontDict>
{ 1 index /CIDFontType 2 put % Other types are not emulated yet.
//super.complete_instance exec //RefinePath exec //load_sfnts exec} .internalbind def
/ValidFileTypes<< /TrueType 0 /WOFF 0>> def
/IsMyRecord % <raw_record> -> <raw_record> bool
{ dup type /dicttype eq { dup /FileType .knownget { //ValidFileTypes exch known } { //false } ifelse } { //false } ifelse} .internalbind def
currentdict /ValidFileTypes undef
/IsActive % <record> IsActive <bool>
{ pop //true} .internalbind def
/CIDFontRecordVirtualMethods //RecordVirtualMethodsStub dup length 3 add dict copy begin /GetCSI //TranslateCSI def /IsActive //IsActive def /MakeInstance % <Name> <record> MakeInstance <Name> <Instance> <size>
{ currentglobal 3 1 roll //true setglobal //CIDFontOptions //complete_instance exec 2 copy //GetSize exec 4 3 roll setglobal } .internalbind defcurrentdict end def
% Redefine the /CIDFont category :
4 dict begin /CategoryName /CIDFont def /IsMapFileOptional //true def /VerifyMap { pop } .internalbind def /PreprocessRecord % <map> <Name> <raw_record> PreprocessRecord <map> <Name> <record> <bool>
{ //IsMyRecord exec dup { pop dup /RecordVirtualMethods //CIDFontRecordVirtualMethods put //true } if } .internalbind defcurrentdict end
/MappedCategoryRedefiner /ProcSet findresource /Redefine get exec
end % the temporary dictionary for local binding.
.setlanguagelevel
|