📄 gs_init.ps
字号:
% Copyright (C) 1989, 1996, 1997, 1998 Aladdin Enterprises. All rights reserved.
%
% This file is part of Aladdin Ghostscript.
%
% Aladdin Ghostscript is distributed with NO WARRANTY OF ANY KIND. No author
% or distributor accepts any responsibility for the consequences of using it,
% or for whether it serves any particular purpose or works at all, unless he
% or she says so in writing. Refer to the Aladdin Ghostscript Free Public
% License (the "License") for full details.
%
% Every copy of Aladdin Ghostscript must include a copy of the License,
% normally in a plain ASCII text file named PUBLIC. The License grants you
% the right to copy, modify and redistribute Aladdin Ghostscript, but only
% under certain conditions described in the License. Among other things, the
% License requires that the copyright notice and this notice be preserved on
% all copies.
% $Id: gs_init.ps $
% Initialization file for the interpreter.
% When this is run, systemdict is still writable.
% Comment lines of the form
% %% Replace <n> <file(s)>
% indicate places where the next <n> lines should be replaced by
% the contents of <file(s)>, when creating a single merged init file.
% The interpreter can call out to PostScript code. All procedures
% called in this way, and no other procedures defined in these
% initialization files, have names that begin with %, e.g.,
% (%Type1BuildChar) cvn.
% Check the interpreter revision. NOTE: the interpreter code requires
% that the first non-comment token in this file be an integer.
550
dup revision ne
{ (gs: Interpreter revision \() print revision 10 string cvs print
(\) does not match gs_init.ps revision \() print 10 string cvs print
(\).\n) print flush null 1 .quit
}
if pop
% Acquire userdict, and set its length if necessary.
/userdict where
{ pop userdict maxlength 0 eq }
{ true }
ifelse
systemdict exch
{ % userdict wasn't already set up by iinit.c.
dup /userdict
currentdict dup 200 .setmaxlength % userdict
.forceput % userdict is local, systemdict is global
}
if begin
% Define dummy local/global operators if needed.
systemdict /.setglobal known
{ true .setglobal
}
{ /.setglobal { pop } .bind def
/.currentglobal { false } .bind def
/.gcheck { pop false } .bind def
}
ifelse
% Define .languagelevel if needed.
systemdict /.languagelevel known not { /.languagelevel 1 def } if
% Optionally choose a default paper size other than U.S. letter.
% (a4) /PAPERSIZE where { pop pop } { /PAPERSIZE exch def } ifelse
% Turn on array packing for the rest of initialization.
true setpacking
% Define the old MS-DOS EOF character as a no-op.
% This is a hack to get around the absurd habit of MS-DOS editors
% of adding an EOF character at the end of the file.
<1a> cvn { } def
% Acquire the debugging flags.
currentdict /DEBUG known /DEBUG exch def
/VMDEBUG
DEBUG {{print mark
systemdict /level2dict known
{ .currentglobal dup false .setglobal vmstatus
true .setglobal vmstatus 3 -1 roll pop
6 -2 roll pop .setglobal
}
{ vmstatus 3 -1 roll pop
}
ifelse usertime 16#fffff and counttomark
{ ( ) print ( ) cvs print }
repeat pop
( ) print systemdict length ( ) cvs print
( ) print countdictstack ( ) cvs print
( <) print count ( ) cvs print (>\n) print flush
}}
{{pop
}}
ifelse
def
currentdict /BATCH known /BATCH exch def
currentdict /DELAYBIND known /DELAYBIND exch def
currentdict /DISKFONTS known /DISKFONTS exch def
currentdict /ESTACKPRINT known /ESTACKPRINT exch def
currentdict /FAKEFONTS known /FAKEFONTS exch def
currentdict /FIXEDMEDIA known /FIXEDMEDIA exch def
currentdict /FIXEDRESOLUTION known /FIXEDRESOLUTION exch def
currentdict /LOCALFONTS known /LOCALFONTS exch def
currentdict /NOBIND known /NOBIND exch def
/.bind /bind load def
NOBIND { /bind { } def } if
currentdict /NOCACHE known /NOCACHE exch def
currentdict /NOCIE known /NOCIE exch def
currentdict /NODISPLAY known not /DISPLAYING exch def
currentdict /NOFONTMAP known /NOFONTMAP exch def
currentdict /NOFONTPATH known /NOFONTPATH exch def
currentdict /NOGC known /NOGC exch def
currentdict /NOINTERPOLATE known /NOINTERPOLATE exch def
currentdict /NOPAGEPROMPT known /NOPAGEPROMPT exch def
currentdict /NOPAUSE known /NOPAUSE exch def
currentdict /NOPLATFONTS known /NOPLATFONTS exch def
currentdict /NOPROMPT known /NOPROMPT exch def
% The default value of ORIENT1 is true, not false.
currentdict /ORIENT1 known not { /ORIENT1 true def } if
currentdict /OSTACKPRINT known /OSTACKPRINT exch def
currentdict /OUTPUTFILE known % obsolete
{ /OutputFile /OUTPUTFILE load def
currentdict /OUTPUTFILE .undef
} if
currentdict /QUIET known /QUIET exch def
currentdict /SAFER known /SAFER exch def
currentdict /SHORTERRORS known /SHORTERRORS exch def
currentdict /STRICT known /STRICT exch def
currentdict /WRITESYSTEMDICT known /WRITESYSTEMDICT exch def
% Acquire environment variables.
currentdict /DEVICE known not
{ (GS_DEVICE) getenv { /DEVICE exch def } if } if
(START) VMDEBUG
% Open the standard files, so they will be open at the outermost save level.
(%stdin) (r) file pop
(%stdout) (w) file pop
(%stderr) (w) file pop
/.currentuserparams where {
pop mark
% The Adobe implementations appear to have very large maximum
% stack sizes. This turns out to actually make a difference,
% since some badly-behaved files include extremely long procedures,
% or construct huge arrays on the operand stack.
% We reset the stack sizes now so that we don't have to worry
% about overflowing the (rather small) built-in stack sizes
% during initialization.
/MaxDictStack 500
/MaxExecStack 5000
/MaxOpStack 50000
.dicttomark .setuserparams
} if
% Define a procedure for skipping over an unneeded section of code.
% This avoids allocating space for the skipped procedures.
% We can't use readline, because that imposes a line length limit.
/.skipeof % <string> .skipeof -
{ currentfile exch 1 exch .subfiledecode flushfile
} .bind def
% Define procedures to assist users who don't read the documentation.
userdict begin
/help
{ (Enter PostScript commands. '(filename) run' runs a file, 'quit' exits.\n)
print flush
} .bind def
/? /help load def
end
% Define =string, which is used by some PostScript programs even though
% it isn't documented anywhere.
% Put it in userdict so that each context can have its own copy.
userdict /=string 256 string put
% Print the greeting.
/printgreeting
{ mark
product (Ghostscript) search
{ pop pop pop
(This software comes with NO WARRANTY: see the file PUBLIC for details.\n)
}
{ pop
}
ifelse
(\n) copyright
(\)\n) revisiondate 100 mod (-)
revisiondate 100 idiv 100 mod (-)
revisiondate 10000 idiv ( \()
revision 10 mod
revision 100 mod dup 0 ne { 10 idiv } { pop } ifelse (.)
revision 100 idiv ( )
product
counttomark
{ (%stdout) (w) file exch false .writecvp
} repeat pop
} .bind def
QUIET not { printgreeting flush } if
% Define a special version of def for making operator procedures.
/obind { % <name> <proc> obind <name> <oper>
1 index exch .makeoperator
} .bind def
/odef { % <name> <proc> odef -
1 index exch .makeoperator def
} .bind def
% Define a special version of def for storing local objects into global
% dictionaries. Like .forceput, this exists only during initialization.
/.forcedef { % <key> <value> .forcedef -
currentdict 3 1 roll .forceput
} .bind odef
% Define procedures for accessing variables in systemdict and userdict
% regardless of the contents of the dictionary stack.
/.systemvar { % <name> .systemvar <value>
//systemdict exch get
} .bind odef
/.userdict { % - .userdict <dict>
/userdict .systemvar
} .bind odef
/.uservar { % <name> .uservar <value>
.userdict exch get
} .bind odef
% If we're delaying binding, remember everything that needs to be bound later.
DELAYBIND NOBIND not and
{ .currentglobal false .setglobal
systemdict /.delaybind 1500 array .forceput
.setglobal
userdict /.delaycount 0 put
% When we've done the delayed bind, we want to stop saving.
% Detect this by the disappearance of .delaybind.
/bind
{ /.delaybind .systemvar dup length 0 ne
{ .delaycount 2 index put
.userdict /.delaycount .delaycount 1 add put
}
{ pop .bind
}
ifelse
} .bind def
} if
%**************** BACKWARD COMPATIBILITY
/hwsizedict mark /HWSize null .dicttomark readonly def
/copyscanlines { % <device> <y> <string> copyscanlines <substr>
0 3 1 roll 3 index //hwsizedict .getdeviceparams
exch pop exch pop aload pop 3 2 roll
0 exch null exch .getbitsrect exch pop
} bind odef
currentdict /hwsizedict .undef
/getdeviceprops
{ null .getdeviceparams
} bind odef
/.putdeviceprops
{ null true counttomark 1 add 3 roll .putdeviceparams
dup type /booleantype ne
{ dup mark eq { /unknown /rangecheck } if
counttomark 4 add 1 roll cleartomark pop pop pop
/.putdeviceprops load exch signalerror
}
if
} bind odef
/max { .max } bind def
/min { .min } bind def
/.currentfilladjust { .currentfilladjust2 pop } bind odef
/.setfilladjust { dup .setfilladjust2 } bind odef
/.writecvs { false .writecvp } bind odef
% Define predefined procedures substituting for operators,
% in alphabetical order.
userdict /#copies 1 put
% Adobe implementations don't accept /[ or /], so we don't either.
([) cvn
/mark load def
(]) cvn
{counttomark array astore exch pop} odef
/abs {dup 0 lt {neg} if} odef
% .beginpage is redefined if setpagedevice is present.
/.beginpage { } odef
% In LanguageLevel 3, copypage erases the page.
/copypage {
.languagelevel 3 ge
1 .endpage {
.currentnumcopies 1 index .outputpage
(>>copypage, press <return> to continue<<\n) .confirm
dup { erasepage } if
} if pop .beginpage
} odef
/currentmatrix {
.currentmatrix 6 index astore pop
} odef
% .currentnumcopies is redefined in Level 2.
/.currentnumcopies { #copies } odef
/setcolorscreen where { pop % not in all Level 1 configurations
/currentcolorscreen
{ .currenthalftone
{ { 60 exch 0 exch 3 copy 6 copy } % halftone - not possible
{ 3 copy 6 copy } % screen
{ } % colorscreen
}
exch get exec
} odef
} if
/currentscreen
{ .currenthalftone
{ { 60 exch 0 exch } % halftone - not possible
{ } % screen
{ 12 3 roll 9 { pop } repeat } % colorscreen
}
exch get exec
} odef
/.echo /echo load def
userdict /.echo.mode true put
/echo {dup /.echo.mode exch store .echo} odef
/eexec
{ 55665 //filterdict /eexecDecode get exec
cvx //systemdict begin exec
% Only pop systemdict if it is still the top element,
% because this is apparently what Adobe interpreters do.
currentdict //systemdict eq { end } if
} odef
% .endpage is redefined if setpagedevice is present.
/.endpage { 2 ne } odef
% erasepage mustn't use gsave/grestore, because we call it before
% the graphics state stack has been fully initialized.
/erasepage
{ /currentcolor where
{ pop currentcolor currentcolorspace { setcolorspace setcolor } }
{ /currentcmykcolor where
{ pop currentcmykcolor { setcmykcolor } }
{ currentrgbcolor { setrgbcolor } }
ifelse
}
ifelse 1 setgray .fillpage exec
} odef
% To satisfy the Genoa FTS, executive must be a procedure, not an operator.
/executive
{ { NOPROMPT not { prompt } if
{ (%statementedit) (r) file } stopped
{ pop pop $error /errorname get /undefinedfilename eq
{ .clearerror exit } if % EOF
handleerror null % ioerror??
}
if
cvx { .runexec } execute
} loop
} bind def
/filter
{ //filterdict 1 index .knownget
{ exch pop exec }
{ /filter load /undefined signalerror }
ifelse
} odef
/handleerror
{ /errordict .systemvar /handleerror get exec } bind def
/identmatrix [1.0 0.0 0.0 1.0 0.0 0.0] readonly def
/identmatrix
{ dup 0 //identmatrix putinterval } odef
/languagelevel 1 def % gs_lev2.ps may change this
/makeimagedevice { false makewordimagedevice } odef
/matrix { 6 array identmatrix } odef
/pathbbox
{ false .pathbbox
} odef
/prompt { flush flushpage
(GS) print
count 0 ne { (<) print count =only } if
(>) print flush
} bind def
/pstack { 0 1 count 3 sub { index == } for } bind def
/putdeviceprops
{ .putdeviceprops { erasepage } if } odef
/quit { /quit load 0 .quit } odef
/run { dup type /filetype ne { (r) file } if
% We must close the file when execution terminates,
% regardless of the state of the stack,
% and then propagate an error, if any.
cvx .runexec
} odef
% Execute a file.
% Level 2 uses 2 .stop to clear the e-stack for a successful startjob:
% we detect that here, since we need to handle this even if we start out
% without job control in effect.
%
% What we push on the e-stack is the following to be executed in this order:
% <lit-file|fileproc> .runexec1 <lit-file|fileproc> .runexec2
/.runexec1 { % <file|fileproc> .runexec1 -
dup type /filetype ne { cvx exec } if
cvx null 2 .stopped
% If we got back here from a startjob, just keep going.
% startjob replaces the null on the o-stack with a procedure
% to be executed when we get back here.
dup null ne { exec true } { pop false } ifelse
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -