⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gs_init.ps

📁 GhostScript的源代码
💻 PS
📖 第 1 页 / 共 4 页
字号:
%    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 + -