summaryrefslogtreecommitdiff
blob: e045cfddc61b50c95eca6e76337777d09d3ca100 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
% Copyright (C) 2001-2020 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 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
} bind def

/GenerateIdentityCIDMap   % <font> GenerateCIDMap <font>
{ begin
    /CIDMap [ 44000 string 44000 string 44000 string] def
    CIDMap .fillIdentityCIDMap
  currentdict end
} bind 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
} bind 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
} bind 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
} bind 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
} bind def

currentdict /ValidFileTypes undef

/IsActive       % <record> IsActive <bool>
{ pop //true
} bind 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
  } bind def
currentdict end def

% Redefine the /CIDFont category :
4 dict begin
  /CategoryName /CIDFont def
  /IsMapFileOptional //true def
  /VerifyMap  { pop } bind def
  /PreprocessRecord  % <map> <Name> <raw_record> PreprocessRecord <map> <Name> <record> <bool>
  { //IsMyRecord exec dup {
      pop dup /RecordVirtualMethods //CIDFontRecordVirtualMethods put
      //true
    } if
  } bind def
currentdict end

/MappedCategoryRedefiner /ProcSet findresource /Redefine get exec

end  % the temporary dictionary for local binding.

.setlanguagelevel