home *** CD-ROM | disk | FTP | other *** search
- % 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
- /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
- dup length dict dup begin exch { dup def } forall end readonly
- /Instances exch def
- currentdict end /Category defineresource pop
- } repeat pop
-
- % 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 1 add dict copy begin
- /InstanceType exch def
- /Instances 10 dict def
- currentdict end /Category defineresource pop
- } repeat pop
-
- % Complete the Encoding category.
-
- /findencoding
- { /Encoding findresource } odef
-
- /Encoding /Category findresource begin
- % Handle lazily loaded encodings specially.
- Instances /SymbolEncoding [null 2 -1] put
- Instances /DingbatsEncoding [null 2 -1] put
- /.ResourceFileDict
- mark
- /SymbolEncoding (gs_sym_e.ps)
- /DingbatsEncoding (gs_dbt_e.ps)
- .dicttomark def
- end
-
- /ISOLatin1Encoding ISOLatin1Encoding /Encoding defineresource pop
- /StandardEncoding StandardEncoding /Encoding defineresource pop
- /SymbolEncoding { /SymbolEncoding findencoding } bind def
- /DingbatsEncoding { /DingbatsEncoding findencoding } bind def
-
- (%END of level2dict) .skipeof %****************
-
- % Complete the Font category.
-
- /Font /Category findresource begin
- currentdict /..definefont /definefont load .growput
- currentdict /..findfont /findfont load .growput
- /DefineResource
- { 2 copy ..definefont exch pop
- dup [exch 0 -1] exch
- Instances 4 2 roll .growput
- } bind def
- /.LoadResource
- { ..findfont pop
- } bind def
- end
- % Make entries for all known fonts.
- /.resourceFromFontmap
- { /Font /Category findresource begin
- Fontmap
- { pop dup Instances exch known
- { pop }
- { [null 2 -1] Instances 3 1 roll .growput }
- ifelse
- }
- forall
- end
- } bind def
- .resourceFromFontmap
- /Font /Category findresource begin
- FontDirectory
- { Instances 3 1 roll [exch 0 -1] .growput
- }
- forall end
- /..loadFontmap /.loadFontmap load def
- /.loadFontmap { ..loadFontmap .resourceFromFontmap } def
-
- /definefont
- { /Font defineresource } bind def
- /findfont
- { /Font findresource } bind def
- /undefinefont
- { /Font undefineresource } bind def
-
- %END of level2dict
-
- end
-