summaryrefslogtreecommitdiff
blob: 7cf29b46b819aece503aa2d430884161489055ca (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
% Copyright (C) 2001-2019 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.
%

% Initialization file for most of the Display PostScript functions
% that are also included in Level 2.

level2dict begin

% ------ Virtual memory ------ %

/currentshared /.currentglobal load def
/scheck {.gcheck} bind odef
%****** FOLLOWING IS WRONG ******
/shareddict currentdict /globaldict .knownget not { 20 dict } if def

% Global and LocalFontDirectory must remain in systemdict
% even if we temporarily exit Level 2 mode.

end				% level2dict
systemdict begin

/SharedFontDirectory .FontDirectory .gcheck
 { .currentglobal //false .setglobal
   currentdict
   /LocalFontDirectory .FontDirectory dup maxlength dict copy
   .forceput	% LocalFontDirectory is local, systemdict is global
   .setglobal .FontDirectory
 } executeonly
 {
   currentdict
   /LocalFontDirectory .FontDirectory
   .forceput	% LocalFontDirectory is local, systemdict is global
   50 dict
 }executeonly
ifelse def

end				% systemdict
level2dict begin

% setshared must rebind FontDirectory to the appropriate one of
% Local or SharedFontDirectory.

/.setglobal		% <bool> .setglobal -
 { dup .setglobal
   //systemdict /FontDirectory .currentglobal
    { //SharedFontDirectory }
    { /LocalFontDirectory .systemvar }	% can't embed ref to local VM
   ifelse .forceput pop	% LocalFontDirectory is local, systemdict is global
 } .bind executeonly odef
% Don't just copy (load) the definition of .setglobal:
% it gets redefined for LL3.
/setshared { /.setglobal .systemvar exec } odef
.currentglobal setshared

% See below for changes in save and restore.

% ------ Fonts ------ %

/selectfont		% <fontname> <size> selectfont -
 {
   {
     1 .argindex findfont
     1 index dup type /arraytype eq { makefont } { scalefont } ifelse
     setfont pop pop
   } stopped { /selectfont .systemvar $error /errorname get signalerror } if
 } odef
% undefinefont has to take local/global VM into account.
/undefinefont		% <fontname> undefinefont -
 { //.FontDirectory 1 .argindex .forceundef	% FontDirectory is readonly
   .currentglobal
    {		% Current mode is global; delete from local directory too.
      //systemdict /LocalFontDirectory .knownget
       { 1 index .forceundef } executeonly		% LocalFontDirectory is readonly
      if
    }
    {		% Current mode is local; if there was a shadowed global
                % definition, copy it into the local directory.
      //systemdict /SharedFontDirectory .knownget
       { 1 index .knownget
          { //.FontDirectory 2 index 3 -1 roll .forceput } % readonly
         if
       }
      if
    }
   ifelse pop
 } odef

% If we load a font into global VM within an inner save, the restore
% will delete it from FontDirectory but not from SharedFontDirectory.
% We have to handle this by making restore copy missing entries from
% SharedFontDirectory to FontDirectory.  Since this could slow down restore
% considerably, we define a new operator .forcecopynew for this purpose.
% Furthermore, if FAKEFONTS is in effect, we want global real fonts to
% override fake local ones.  We handle this by brute force.
/restore		% <save> restore -
 { dup //restore
   /LocalFontDirectory .systemvar
   FAKEFONTS
    { mark
                % We want to delete a fake font from the local directory
                % iff the global directory now has no definition for it,
                % or a non-fake definition.
      1 index dup
       {		% Stack: lfd mark lfd key ... lfd key value
         length 1 gt
          {		% This is a real local definition; don't do anything.
            pop
          }
          {		% This is a fake local definition, check for global.
            //SharedFontDirectory 1 index .knownget
             {		% A global definition exists, check for fake.
               length 1 eq { pop } { 1 index } ifelse
             }
             {		% No global definition, delete the local one.
               1 index
             }
            ifelse
          }
         ifelse
       } forall
      pop counttomark 2 idiv { .forceundef } executeonly repeat pop		% readonly
    }
   if
   //SharedFontDirectory exch .forcecopynew pop
   .currentglobal .setglobal	% Rebind FontDirectory according to current VM.
   pop
 } .bind odef

end				% level2dict