261 lines
7.8 KiB
PostScript
261 lines
7.8 KiB
PostScript
% 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
|