summaryrefslogtreecommitdiff
path: root/Master/tlpkg/tlgs/lib/gs_dps1.ps
blob: 6a0e3a30fbc31939c90201af0a23e7d8f151524e (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
%    Copyright (C) 1997, 1999 Aladdin Enterprises.  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.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.

% $Id: gs_dps1.ps 7648 2007-01-27 13:53:57Z alexcher $
% 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 load def
%****** 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
   /LocalFontDirectory .FontDirectory dup maxlength dict copy
   .forcedef	% LocalFontDirectory is local, systemdict is global
   .setglobal .FontDirectory
 }
 { /LocalFontDirectory .FontDirectory
   .forcedef	% LocalFontDirectory is local, systemdict is global
   50 dict
 }
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 odef		% must bind .forceput and .setglobal
			% even if NOBIND in effect
% 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 }		% 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 { put } //superexec } % 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	% bind even if NOBIND
   /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 } repeat pop		% readonly
    }
   if
   //SharedFontDirectory exch .forcecopynew pop
   .currentglobal .setglobal	% Rebind FontDirectory according to current VM.
   pop
 } .bind odef

end				% level2dict