% 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
