home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Elysian Archive
/
AmigaElysianArchive.iso
/
wp_dtp
/
ghostscr.lha
/
usr
/
lib
/
ghostscript
/
gs_lev2.ps
< prev
next >
Wrap
Text File
|
1992-06-15
|
8KB
|
261 lines
% 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