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.
186 lines
5.8 KiB
186 lines
5.8 KiB
% 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 def
|
|
currentdict 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 def
|
|
currentdict end
|
|
|
|
/MappedCategoryRedefiner /ProcSet findresource /Redefine get exec
|
|
|
|
end % the temporary dictionary for local binding.
|
|
|
|
.setlanguagelevel
|