Metropoli BBS
VIEWER: gs_lev2.ps MODE: TEXT (ASCII)
%    Copyright (C) 1990, 1991 Aladdin Enterprises.  All rights reserved.
%    Distributed by Free Software Foundation, Inc.
%
% 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 Ghostscript Level 2 functions.
% When this is run, systemdict is still writable.

% ------ Miscellaneous ------ %

% We aren't fully Level 2 compatible yet!
%/languagelevel 2 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

% Recognize the dictionary form of image and imagemask.

/image
 { dup type /dicttype eq { .dictimage } { image } ifelse
 } bind odef	% bind now to incorporate old image

/imagemask
 { dup type /dicttype eq { .dictimagemask } { imagemask } ifelse
 } bind odef	% bind now to incorporate old imagemask

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

/currentglobal /currentshared load def
/gcheck /scheck load def
/globaldict /shareddict load def

% ------ Resources ------ %

% Currently, we don't implement resource unloading or global/local
% instance sets, and resourceforall only enumerates loaded instances.
% The standard implementation of resource categories is
% simply to have another entry in the resource dictionary, called Instances,
% that keeps track of all the instances.

% 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.

% 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
	   { /DefineResource /FindResource /ResourceForAll /ResourceStatus
	     /UndefineResource }
	   { 2 index exch known and }
	  forall exch pop } bind def
/DefineResource
	{ dup CheckResource
	   { dup /Category 3 index put   Instances 3 1 roll put }
	   { /typecheck signalerror }
	  ifelse } bind def
/FindResource		% temporary
	{ Instances exch get } bind def
/Instances 25 dict def
/InstanceType /dicttype def

Instances /Category currentdict put
Instances end begin	% so we can name the Category definition

% Define the resource operators.

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 end
	}
/findresource
	{ dup /Category eq
	   { pop //Category } { /Category findresource } ifelse
	  begin FindResource end }
/resourceforall
	{ /Category findresource begin ResourceForAll end }
/resourcestatus
	{ /Category findresource begin ResourceStatus end }
/undefineresource
	{ /Category findresource begin UndefineResource end }
end		% Instances
counttomark 2 idiv { bind def } repeat pop

% Define the Generic category.

12 dict dup begin
/Instances 0 dict def
/CheckResource		% not a standard entry
	{ pop true } def
/DefineResource
	{ dup CheckResource
	   { Instances 3 1 roll put }
	   { /typecheck signalerror }
	  ifelse
	} bind def
/FindResource
	{ dup ResourceStatus
	   { pop 1 gt { dup ResourceFile run } if
	     Instances exch get }
	   { /undefinedresource signalerror }
	  ifelse } bind def
/ResourceFile		% not a standard entry
	{ currentdict /ResourceFileName get 100 string exch exec
	  (r) file } bind def
/ResourceForAll
	{ % We construct a new procedure so we don't have to use
	  % static resources to hold the iteration state.
	  3 1 roll   cvlit 3 1 roll   cvlit 3 1 roll
	  { % Stack contains: key, instance, template, proc, scratch
	    4 index 3 index stringmatch
	     { 4 index type dup /stringtype eq exch /nametype eq or
	        { 4 index exch cvs exch 5 2 roll pop pop pop }
		{ pop exch pop exch pop }
	       ifelse exec }
	     { 5 { pop } repeat }
	    ifelse
	  } /exec cvx 5 packedarray cvx
	  Instances exch forall } bind def
/ResourceStatus
	{ dup Instances exch known
	   { pop 1 0 true }
	   { mark exch { ResourceFile } stopped
	      { cleartomark false } { closefile cleartomark 0 true }
	     ifelse
	   } ifelse
	} bind def
/UndefineResource
	{ Instances exch undef } bind def
end
/Generic exch /Category defineresource

% 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.

7 dict begin		% 5 procedures, Category, Instances
/DefineResource
	{ /invalidaccess signalerror } bind def
/FindResource
	{ Instances exch get } bind def
/ResourceForAll
	/Generic /Category findresource /ResourceForAll get def
/ResourceStatus
	{ Instances exch known { 0 0 true } { false } ifelse } bind def
/UndefineResource
	{ /invalidaccess signalerror } bind def

mark
	% Things other than types
 /ColorSpaceFamily {/DeviceRGB /DeviceGray}
 /Emulator {}
 /Filter
   [ .filterdict { pop } forall ]
 /IODevice {(%os%)}
	% Types
 /ColorRenderingType {}
 /FMapType {2 3 4 5 6 7 8}
 /FontType {1 3}
 /FormType {1}
 /HalftoneType {}
 /ImageType {1}
 /PatternType {}
counttomark 2 idiv
 { currentdict dup maxlength dict copy begin
   dup length dict dup begin exch { dup def } forall end readonly
   /Instances exch def
   currentdict /Category defineresource
   currentdict end readonly pop
 } repeat pop end

% Define the other built-in categories.

mark
  /ColorRendering /dicttype /ColorSpace /arraytype /Encoding /arraytype
  /Font /dicttype /Form /dicttype /Halftone /dicttype /Pattern /dicttype
  /ProcSet /dicttype
counttomark 2 idiv
 { /Generic /Category findresource dup maxlength dict copy begin
   /InstanceType exch def
   /Instances 10 dict def
   currentdict end /Category defineresource
 } repeat pop

% Complete the Encoding category.

/findencoding
	{ /Encoding findresource } bind def
/ISOLatin1Encoding ISOLatin1Encoding /Encoding defineresource
/StandardEncoding StandardEncoding /Encoding defineresource
/SymbolEncoding SymbolEncoding /Encoding defineresource

% Complete the Font category.
% INCOMPLETE.

/Font /Category findresource begin
/..definefont /definefont load def
/..findfont /findfont load def
/DefineResource
	{ 2 copy ..definefont exch pop 2 copy
	  Instances 3 1 roll put exch pop
	} bind def
/FindResource
	{ ..findfont
	} bind def
end

/definefont
	{ /Font defineresource } bind def
/findfont
	{ /Font findresource } bind def
/undefinefont
	{ /Font undefineresource } bind def
[ RETURN TO DIRECTORY ]