home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fresh Fish 4
/
FreshFish_May-June1994.bin
/
gnu
/
lib
/
ghostscript
/
gs_lev2.ps
< prev
next >
Wrap
Text File
|
1994-02-22
|
11KB
|
391 lines
% Copyright (C) 1990, 1991, 1992 Aladdin Enterprises. All rights reserved.
%
% This file is part of Ghostscript.
%
% Ghostscript is distributed in the hope that it will be useful, but
% WITHOUT ANY WARRANTY. No author or distributor accepts responsibility
% to anyone for the consequences of using it or for whether it serves any
% particular purpose or works at all, unless he says so in writing. Refer
% to the Ghostscript General Public License for full details.
%
% Everyone is granted permission to copy, modify and redistribute
% Ghostscript, but only under the conditions described in the Ghostscript
% General Public License. A copy of this license is supposed to have been
% given to you along with Ghostscript so you can know your rights and
% responsibilities. It should be in a file named COPYING. Among other
% things, the copyright notice and this notice must be preserved on all
% copies.
% Initialization file for Level 2 functions.
% When this is run, systemdict is still writable,
% but everything defined here goes into level2dict.
level2dict begin
% ------ Miscellaneous ------ %
(<<) cvn /mark load def
(>>) cvn /.dicttomark load odef
/currentsystemparams { mark .currentsystemparams .dicttomark } odef
/currentuserparams { mark .currentuserparams .dicttomark } odef
/deviceinfo { currentdevice getdeviceprops .dicttomark } odef
/globaldict currentdict /shareddict .knownget not { 20 dict } if def
/realtime /usertime load def
% ------ Painting ------ %
% A straightforward definition of execform that doesn't actually
% do any caching.
/execform
{ dup /Implementation known not
{ dup /FormType get 1 ne { /rangecheck signalerror } if
dup /Implementation null put readonly
} if
gsave dup /Matrix get concat
dup /BBox get aload pop
exch 3 index sub exch 2 index sub rectclip
dup /PaintProc get exec
grestore
} odef
/setpattern
{ currentcolorspace 0 get /Pattern ne
{ [ /Pattern currentcolorspace ] setcolorspace
} if
setcolor
} odef
% ------ Virtual memory ------ %
/currentglobal /currentshared load def
/gcheck /scheck load def
/globaldict /shareddict load def
/setglobal /setshared load def
% ------ Resources ------ %
% Currently, we don't implement resource unloading (there wouldn't be
% much value to it without garbage collection) or global/local
% instance sets (since we don't have a global/local memory distinction.)
% Note that the dictionary that defines a resource category is stored
% in global memory. The PostScript manual says that each category must
% manage global and local instances separately. However, objects in
% global memory can't reference objects in local memory. This means
% that the resource category dictionary, which would otherwise be the
% obvious place to keep track of the instances, can't be used to keep
% track of local instances. Instead, there must be a parallel
% structure in local memory for each resource category. Needless to
% say, we haven't implemented this yet.
% We keep track of instances in another entry in the resource dictionary,
% called Instances. For categories with implicit instances,
% the values in Instances are the same as the keys; for other categories,
% the values are [instance status size].
% Define the Category category, except for most of the procedures.
% The dictionary we're about to create will become the Category
% category definition dictionary.
10 dict begin
/Category /Category def
/.CheckResource
{ true % dup gcheck currentglobal and
{ /DefineResource /FindResource /ResourceForAll /ResourceStatus
/UndefineResource }
{ 2 index exch known and }
forall exch pop
} bind def
/DefineResource
{ dup .CheckResource
{ dup /Category 3 index put
dup [ exch 0 -1 ] exch
Instances 4 2 roll put
}
{ /typecheck signalerror
}
ifelse
} bind def
/FindResource % (redefined below)
{ Instances exch get 0 get
} bind def
/Instances 25 dict def
/InstanceType /dicttype def
Instances /Category [currentdict 0 -1] put
Instances end begin % so we can name the Category definition
% Define the resource operators. I don't see how we can possibly restore
% the stacks after an error, since the procedure may have popped and
% pushed elements arbitrarily....
mark
/defineresource
{ /Category findresource dup begin
/InstanceType known
{ dup type InstanceType ne
{ dup type /packedarraytype eq InstanceType /arraytype eq and
not { /typecheck signalerror } if } if } if
/DefineResource load stopped end { stop } if
}
/findresource
{ dup /Category eq
{ pop //Category 0 get } { /Category findresource } ifelse
begin
/FindResource load stopped end { stop } if
}
/resourceforall
{ /Category findresource begin
/ResourceForAll load stopped end { stop } if
}
/resourcestatus
{ /Category findresource begin
/ResourceStatus load stopped end { stop } if
}
/undefineresource
{ /Category findresource begin
/UndefineResource load stopped end { stop } if
}
end % Instances
counttomark 2 idiv { bind odef } repeat pop
% Define the Generic category.
/Generic mark
/Instances 0 dict
/.CheckResource % not a standard entry
{ pop true
} bind
/DefineResource
{ dup .CheckResource
{ { readonly } stopped pop
dup [ exch 0 -1 ] exch
Instances 4 2 roll .growput
}
{ /typecheck signalerror
}
ifelse
} bind
/FindResource
{ dup ResourceStatus
{ pop 1 gt % not in VM
{ dup vmstatus pop exch pop exch
.LoadResource
vmstatus pop exch pop exch sub
Instances 2 index get
dup 1 1 put
2 3 -1 roll put
}
if
Instances exch get 0 get
}
{ /undefinedresource signalerror
}
ifelse
} bind
/.LoadResource % not a standard entry; may fail
{ .ResourceFile run
} bind
/.ResourceFile % not a standard entry; may fail
{ currentdict /ResourceFileName get 100 string exch exec
findlibfile { exch pop } { (r) file } ifelse % let the error happen
} bind
/.ResourceFileDict % not a standard entry
0 dict
/ResourceFileName % leave a slot
{ exch dup .ResourceFileDict exch .knownget
{ exch pop exch copy }
{ exch pop /undefinedresource signalerror }
ifelse
} bind
/ResourceForAll
{ % We construct a new procedure so we don't have to use
% static resources to hold the iteration state.
3 packedarray % template, proc, scratch
{ exch pop % stack contains: key, {template, proc, scratch}
2 copy 0 get .stringmatch
{ 1 index type dup /stringtype eq exch /nametype eq or
{ 2 copy 2 get cvs
exch 1 get 3 -1 roll pop
}
{ 1 get
}
ifelse exec
}
{ pop pop
}
ifelse
} /exec cvx 3 packedarray cvx
Instances exch forall
} bind
/ResourceStatus
{ dup Instances exch .knownget
{ exch pop dup 1 get exch 2 get true }
{ mark exch { .ResourceFile } stopped
{ cleartomark false } { closefile cleartomark 2 -1 true }
ifelse
}
ifelse
} bind
/UndefineResource
{ dup Instances exch .knownget
{ dup 1 get 1 ge
{ dup 0 null put 1 2 put pop }
{ pop Instances exch undef }
ifelse
}
{ pop
}
ifelse
} bind
% We're still running in Level 1 mode, so dictionaries won't expand.
% Leave room for the /Category entry.
/Category null
.dicttomark
/Category defineresource pop
% Fill in the rest of the Category category.
/Category /Category findresource dup
/Generic /Category findresource begin
{ /FindResource /ResourceStatus /ResourceForAll }
{ dup load put dup } forall
pop pop end
% Define the fixed categories.
mark
% Things other than types
/ColorSpaceFamily
{/CIEBaseA /CIEBasedABC /DeviceCMYK /DeviceGray /DeviceRGB
/Indexed /Separation % no Pattern yet
}
/Emulator
{}
/Filter
[ systemdict
{ pop =string cvs (.filter_) anchorsearch
{ pop cvn }
{ pop }
ifelse
}
forall
]
/IODevice
{(%os%)}
% Types
/ColorRenderingType
{1}
/FMapType
{2 3 4 5 6 7 8}
/FontType
[/.buildfont0 where {pop 0} if 1 3]
/FormType
{1}
/HalftoneType
{}
/ImageType
{1}
/PatternType
{}
counttomark 2 idiv
{ 7 dict begin % 5 procedures, Category, Instances
/DefineResour