blob: 128b415665100341c5221702e5931c325567ea1d [file] [log] [blame]
% Copyright (C) 1989, 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.
% When this is run, systemdict is still writable.
% Acquire the debugging flags.
currentdict /DEBUG known /DEBUG exch def
/VMDEBUG
DEBUG {{vmstatus pop ( ) cvs print pop ( ) print
systemdict length ( ) cvs print (\n) print flush}}
{{}} ifelse
def
currentdict /NODISPLAY known not /DISPLAYING exch def
currentdict /NOBIND known { /bind { } def } if
currentdict /NOCACHE known /NOCACHE exch def
currentdict /QUIET known /QUIET exch def
%************************** Disable save and restore
/save {gsave null} bind def
/restore {pop grestore} bind def
% Acquire systemdict and userdict.
% Note that the dictionary stack only has 1 element at this point!
/systemdict currentdict def
/userdict 200 dict def
userdict begin % 2 elements now
systemdict begin
VMDEBUG
% Define true and false.
/true 0 0 eq def
/false 0 1 eq def
% Define predefined procedures substituting for operators,
% in alphabetical order.
/[ /mark load def
/] {counttomark array astore exch pop} bind def
/abs {dup 0 lt {neg} if} bind def
/cleardictstack
{countdictstack 2 sub {end} repeat} bind def
/.copypage /copypage load def
/copypage
{.copypage
(>>copypage, press <return> to continue<<\n) .confirm} bind def
/defaultmatrix
{currentdevice exch deviceparams pop pop
counttomark 1 add 1 roll cleartomark} bind def
/.echo /echo load def
/.echo.mode true def
/echo {dup /.echo.mode exch def .echo} bind def
/eexec {55665 exch type1decryptfile
% eexec sections have 4 garbage characters at the beginning.
% We should detect binary vs. hex encoding here.
4 {dup read pop pop} repeat
cvx systemdict begin stopped end
$error /newerror get and {handleerror} if} bind def
/executive
{{prompt (%statementedit) (r) file
dup bytesavailable 0 lt
{(%stdin) (r) file bytesavailable 0 lt {closefile exit} if}
if cvx execute} loop} bind def
/framedevice % dummy definition
{(Warning: framedevice is not implemented.\n) print flush
pop pop pop setmatrix initclip} bind def
/handleerror
{errordict /handleerror get exec} bind def
/identmatrix
{{1.0 0.0 0.0 1.0 0.0 0.0} cvlit exch copy} bind def
/initgraphics
{initmatrix newpath initclip 1 setlinewidth 0 setlinecap 0 setlinejoin
{} 0 setdash 0 setgray 10 setmiterlimit} bind def
/initmatrix
{.tempmatrix defaultmatrix setmatrix} bind def
%.nulldevice does all of nulldevice except initclip and initmatrix.
/nulldevice
{.nulldevice initclip initmatrix} bind def
/matrix {6 array identmatrix} bind def
/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
/run {dup type /filetype eq { true } { findlibfile } ifelse
{cvx execute}
{(r) file} % let the error happen
ifelse} bind def
%.setgray is the same as setgray without the transfer function.
/setgray
{currenttransfer exec .setgray} bind def
/showpage
{.copypage (>>showpage, press <return> to continue<<\n) .confirm
erasepage initgraphics} bind def
/stack {0 1 count 3 sub {index =} for} bind def
/start { QUIET not
{(Ghostscript ) print version print
( Copyright (C) 1990 Aladdin Enterprises,\n) print
( Menlo Park, CA. All rights reserved.\n) print
(Distributed by Free Software Foundation, Inc.\n) print
(Ghostscript comes with NO WARRANTY: see the file COPYING for details.\n) print
flush
} if
executive
} def
%.typenumber is a non-standard operator.
/type {.typenumber
{arraytype booleantype dicttype filetype fonttype
integertype marktype nametype nulltype operatortype
packedarraytype realtype savetype stringtype
colortype devicetype}
exch get} def
/version
(2.1.1) def
% Provide semi-fake but usable definitions for
% the color PostScript extensions (except for colorimage,
% which is actually implemented as an operator).
/setcmykcolor {
1 exch sub dup dup % C, M, Y, S, S, S
6 -1 roll 1 exch sub mul % M, Y, S, S, red
exch 5 -1 roll 1 exch sub mul % Y, S, red, green
4 -2 roll exch 1 exch sub mul % red, green, blue
setrgbcolor
} bind def
/currentcmykcolor {
currentrgbcolor 0
} bind def
/setcolortransfer {
settransfer pop pop pop
} bind def
/currentcolortransfer {
{} dup dup currenttransfer
} bind def
/setblackgeneration {
pop
} bind def
/currentblackgeneration {
{}
} bind def
/setundercolorremoval {
pop
} bind def
/currentundercolorremoval {
{}
} bind def
/setcolorscreen {
setscreen 9 {pop} repeat
} bind def
/currentcolorscreen {
currentscreen 3 copy 6 copy
} bind def
% Define some additional built-in procedures (beyond the ones defined by
% the PostScript Language Reference Manual).
/concatprocs
{ exch cvlit exch cvlit % proc1 proc2
dup length 2 index length add array % proc1 proc2 newproc
dup 0 4 index putinterval
dup 3 index length 3 index putinterval
exch pop exch pop cvx
} bind def
/concatstrings
{ 1 index length 1 index length add string
2 index 1 index copy pop
dup 3 index length 3 index length getinterval
2 index exch copy pop
exch pop exch pop
} bind def
/copystring
{ dup length string copy } bind def
/defaultdevice
{ 0 getdevice } bind def
/finddevice
{ systemdict /devicedict get exch get } bind def
/rgbcolor
{ gsave setrgbcolor currentgscolor grestore } bind def
%.setdevice does all of setdevice except initclip and initmatrix.
/setdevice
{ .setdevice initclip initmatrix } bind def
% Define auxiliary procedures needed for the above.
/.confirm
{DISPLAYING
{% Print a message and wait for the user to type something.
% If the user just types a newline, flush it.
print flush
.echo.mode false echo
(%stdin) (r) file dup read
{dup (\n) 0 get eq {pop pop} {unread} ifelse} {pop} ifelse
echo}
{pop} ifelse} bind def
/.identmatrix % a read-only identity matrix
matrix readonly def
/.tempmatrix % a temporary matrix
matrix def
% If the interpreter includes the Level 2 functions,
% load the initialization file for them.
systemdict /uappend known % pick any one
{ (ghost2.ps) run }
if
% Define the procedure used by the C executive for executing user input,
% and also by the run operator.
% This is called with a procedure or file on the operand stack.
/execute
{stopped $error /newerror get and {handleerror} if} bind def
% Create the error handling machinery.
% The interpreter knows the name ErrorNames.
{/unknown /dictfull /dictstackoverflow /dictstackunderflow
/execstackoverflow /interrupt /invalidaccess /invalidexit
/invalidfileaccess /invalidfont /invalidrestore /ioerror
/limitcheck /nocurrentpoint /rangecheck /stackoverflow
/stackunderflow /syntaxerror /timeout /typecheck
/undefined /undefinedfilename /undefinedresult /unmatchedmark
/VMerror
} cvlit readonly
dup length 2 add dict % ErrorNames, handleerror
/errordict exch def
errordict begin
/ErrorNames exch def
{ $error /.inerror get { = flush quit } if % detect error recursion
$error /.inerror true put
countdictstack array dictstack
$error begin
/newerror true def
/dstack exch def
/errorname exch def
/command exch def
countexecstack array execstack /estack exch def
count array astore /ostack exch def
ostack aload pop
end
$error /.inerror false put
stop
} bind
ErrorNames
{ [ 1 index 3 index /exec load ] cvx def
} forall
pop
/handleerror
{ (Error: ) print
$error begin
errorname ==only
( in ) print
/command load ==
( ostack:) print
ostack {( ) print =only} forall
(\n estack: ) print
estack {( ) print =only} forall
(\n dstack:) print
dstack {dup ( ) print length =only (/) print maxlength =only} forall
(\n) print
/newerror false def
flush
end
} bind def
end
/$error 7 dict def % newerror, .inerror, errorname, command,
% 3 stacks
$error begin
/newerror false def
/.inerror false def
end
% Define the =[only] procedures. Also define =print, which is used
% by LaserPrep even though it isn't documented anywhere.
/= {=only (\n) print} bind def
/=print {=} bind def
/.dict 16 dict dup
begin def
/.buf 128 string def
/.cvp {.buf cvs .p} bind def
/.print
{dup type .dict exch known
{dup type exec} {.buf cvs print} ifelse
} bind def
/stringtype
{dup rcheck not {pop (--nostringval--)} if print} bind def
/nametype
{dup length .buf length gt
{dup length string}
{.buf}
ifelse cvs print} bind def
{0 begin .print end} bind dup 0 .dict put
end
/=only exch def
% Define the [write]==[only] procedures.
/== {==only (\n) print} bind def
/==only {(%stdout) (w) file exch write==only} bind def
/write==
{2 copy write==only pop (\n) writestring} bind def
/.dict 17 dict dup
begin def
/.buf 128 string def
/.cvp {.buf cvs .p} bind def
% /.f {the_output_file} def
/.nop {(-) .p type .cvp (-) .p} bind def
/.p {.f exch writestring} bind def
/.p1 {.f exch write} bind def
/.print
{dup type .dict exch known
{dup type exec} {.nop} ifelse
} bind def
/integertype /.cvp load def
/realtype /.cvp load def
/booleantype /.cvp load def
/nametype
{dup xcheck not {(/) .p} if
dup length .buf length gt
{dup length string}
{.buf}
ifelse cvs .p} bind def
/arraytype
{dup rcheck
{dup xcheck {(})({)} {(])([)} ifelse .p
exch () exch
{exch .p .print ( )} forall pop .p}
{.nop}
ifelse} bind def
/operatortype
{(--) .p .cvp (--) .p} bind def
/packedarraytype /arraytype load def
/stringtype
{dup rcheck
{(\() .p
{/.ch exch def
.ch 32 lt .ch 127 ge or
{(\\) .p .ch 8#1000 add 8 .buf cvrs 1 3 getinterval .p}
{.ch 40 eq .ch 41 eq or .ch 92 eq or
{(\\) .p} if
.ch .p1}
ifelse}
forall (\)) .p}
{.nop}
ifelse} bind def
{0 begin exch /.f exch def .print end} bind dup 0 .dict put
end
/write==only exch def
VMDEBUG
% Define the font directory.
% Make it big to leave room for transformed fonts.
/FontDirectory 100 dict def
% Define the standard encoding vector.
/StandardEncoding {
% \00x
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
% \04x
/space /exclam /quotedbl /numbersign
/dollar /percent /ampersand /quoteright
/parenleft /parenright /asterisk /plus
/comma /hyphen /period /slash
/zero /one /two /three
/four /five /six /seven
/eight /nine /colon /semicolon
/less /equal /greater /question
% \10x
/at /A /B /C /D /E /F /G
/H /I /J /K /L /M /N /O
/P /Q /R /S /T /U /V /W
/X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore
% \14x
/quoteleft /a /b /c /d /e /f /g
/h /i /j /k /l /m /n /o
/p /q /r /s /t /u /v /w
/x /y /z /braceleft /bar /braceright /asciitilde /.notdef
% \20x
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
% \24x
/.notdef /exclamdown /cent /sterling
/fraction /yen /florin /section
/currency /quotesingle /quotedblleft /guillemotleft
/guilsinglleft /guilsinglright /fi /fl
/.notdef /endash /dagger /daggerdbl
/periodcentered /.notdef /paragraph /bullet
/quotesinglbase /quotedblbase /quotedblright /guillemotright
/ellipsis /perthousand /.notdef /questiondown
% \30x
/.notdef /grave /acute /circumflex /tilde /macron /breve /dotaccent
/dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron
/emdash /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
% \34x
/.notdef /AE /.notdef /ordfeminine /.notdef /.notdef /.notdef /.notdef
/Lslash /Oslash /OE /ordmasculine /.notdef /.notdef /.notdef /.notdef
/.notdef /ae /.notdef /.notdef /.notdef /dotlessi /.notdef /.notdef
/lslash /oslash /oe /germandbls /.notdef /.notdef /.notdef /.notdef
} cvlit readonly def
% Define the ISO Latin-1 encoding vector.
% The first half is the same as the standard encoding.
/ISOLatin1Encoding
StandardEncoding 256 array copy
dup 128 128 getinterval
%****** NOTE: the following are missing in the Adobe documentation,
%****** but appear in the displayed table:
%****** macron at 225, dieresis at 230, cedilla at 233, space at 240.
% \20x
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent
/dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron
% \24x
/space /exclamdown /cent /sterling
/currency /yen /brokenbar /section
/dieresis /copyright /ordfeminine /guillemotleft
/logicalnot /hyphen /registered /macron
/degree /plusminus /twosuperior /threesuperior
/acute /mu /paragraph /periodcentered
/cedilla /onesuperior /ordmasculine /guillemotright
/onequarter /onehalf /threequarters /questiondown
% \30x
/Agrave /Aacute /Acircumflex /Atilde
/Adieresis /Aring /AE /Ccedilla
/Egrave /Eacute /Ecircumflex /Edieresis
/Igrave /Iacute /Icircumflex /Idieresis
/Eth /Ntilde /Ograve /Oacute
/Ocircumflex /Otilde /Odieresis /multiply
/Oslash /Ugrave /Uacute /Ucircumflex
/Udieresis /Yacute /Thorn /germandbls
% \34x
/agrave /aacute /acircumflex /atilde
/adieresis /aring /ae /ccedilla
/egrave /eacute /ecircumflex /edieresis
/igrave /iacute /icircumflex /idieresis
/eth /ntilde /ograve /oacute
/ocircumflex /otilde /odieresis /divide
/oslash /ugrave /uacute /ucircumflex
/udieresis /yacute /thorn /ydieresis
129 -1 roll astore pop readonly def
% Define the Symbol encoding vector.
/SymbolEncoding {
% \000
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
% \040
/space /exclam /universal /numbersign
/existential /percent /ampersand /suchthat
/parenleft /parenright /asteriskmath /plus
/comma /minus /period /slash
/zero /one /two /three
/four /five /six /seven
/eight /nine /colon /semicolon
/less /equal /greater /question
% \100
/congruent /Alpha /Beta /Chi
/Delta /Epsilon /Phi /Gamma
/Eta /Iota /theta1 /Kappa
/Lambda /Mu /Nu /Omicron
/Pi /Theta /Rho /Sigma
/Tau /Upsilon /sigma1 /Omega
/Xi /Psi /Zeta /bracketleft
/therefore /bracketright /perpendicular /underscore
% \140
/radicalex /alpha /beta /chi
/delta /epsilon /phi /gamma
/eta /iota /phi1 /kappa
/lambda /mu /nu /omicron
/pi /theta /rho /sigma
/tau /upsilon /omega1 /omega
/xi /psi /zeta /braceleft
/bar /braceright /similar /.notdef
% \200
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
% \240
/.notdef /Upsilon1 /minute /lessequal
/fraction /infinity /florin /club
/diamond /heart /spade /arrowboth
/arrowleft /arrowup /arrowright /arrowdown
/degree /plusminus /second /greaterequal
/multiply /proportional /partialdiff /bullet
/divide /notequal /equivalence /approxequal
/ellipsis /arrowvertex /arrowhorizex /carriagereturn
% \300
/aleph /Ifraktur /Rfraktur /weierstrass
/circlemultiply /circleplus /emptyset /intersection
/union /propersuperset /reflexsuperset /notsubset
/propersubset /reflexsubset /element /notelement
/angle /gradient /registerserif /copyrightserif
/trademarkserif /product /radical /dotmath
/logicalnot /logicaland /logicalor /arrowdblboth
/arrowdblleft /arrowdblup /arrowdblright /arrowdbldown
% \340
/lozenge /angleleft /registersans /copyrightsans
/trademarksans /summation /parenlefttp /parenleftex
/parenleftbt /bracketlefttp /bracketleftex /bracketleftbt
/bracelefttp /braceleftmid /braceleftbt /braceex
/.notdef /angleright /integral /integraltp
/integralex /integralbt /parenrighttp /parenrightex
/parenrightbt /bracketrighttp /bracketrightex /bracketrightbt
/bracerighttp /bracerightmid /bracerightbt /.notdef
} cvlit readonly def
% Construct a dictionary of all available devices.
mark
% Loop until the getdevice gets a rangecheck.
0 { {dup getdevice exch 1 add} loop} stopped pop
pop 1 add dict /devicedict exch def
devicedict begin
counttomark {dup devicename cvn exch def} repeat
end
pop % pop the mark
$error /newerror false put % remove error indication
% Define statusdict, for the benefit of programs
% that think they are running on a LaserWriter or similar printer.
(statusd.ps) run
% Establish a default upper limit in the character cache,
% namely, 10 times the average expected character size.
mark
cachestatus 5 index 10 mul 2 index 1 max idiv % bmax, cmax
mark exch dup 10 idiv exch setcacheparams
cleartomark
% Conditionally disable the character cache.
NOCACHE { 1 setcachelimit } if
VMDEBUG
% Create a null font. This is the initial font.
8 dict dup begin
/FontMatrix [ 1 0 0 1 0 0 ] def
/PaintType 0 def
/FontType 3 def
/FontName () def
/Encoding StandardEncoding def
/FontBBox { 0 0 0 0 } def
/BuildChar { pop pop 0 0 setcharwidth } bind def
end
/NullFont exch definefont setfont
% Load the standard font environment.
(gfonts.ps) run
% Close up systemdict.
end
% We should make systemdict readonly; however, statusd.ps adds new entries
% to systemdict. Maybe dictionaries should have an "add-only" mode....
%%%%%% systemdict readonly pop
% Establish a default environment.
DISPLAYING
{ defaultdevice
systemdict /DEVICEWIDTH known systemdict /DEVICEHEIGHT known or
{ matrix deviceparams
exch /DEVICEWIDTH where
{ pop pop DEVICEWIDTH }
if
exch /DEVICEHEIGHT where
{ pop pop DEVICEHEIGHT
% Replace the Y translation if the Y axis is inverted
2 index 5 get 0 gt
{ 2 index 5 2 index put
}
if
}
if
defaultdevice 4 1 roll makedevice
counttomark 1 add 1 roll cleartomark
}
if setdevice
}
{ nulldevice
}
ifelse
1 setflat % initgraphics doesn't set this
{ } settransfer % ditto
% The following 'ordered dither' spot function was contributed by
% Gregg Townsend. Thanks, Gregg!
72 72 dtransform abs exch abs min % min(|dpi x|,|dpi y|)
16.001 div 0 % not 16: avoids rounding problems
{ 1 add 7.9999 mul cvi exch 1 add 7.9999 mul cvi 16 mul add <
0E 8E 2E AE 06 86 26 A6 0C 8C 2C AC 04 84 24 A4
CE 4E EE 6E C6 46 E6 66 CC 4C EC 6C C4 44 E4 64
3E BE 1E 9E 36 B6 16 96 3C BC 1C 9C 34 B4 14 94
FE 7E DE 5E F6 76 D6 56 FC 7C DC 5C F4 74 D4 54
01 81 21 A1 09 89 29 A9 03 83 23 A3 0B 8B 2B AB
C1 41 E1 61 C9 49 E9 69 C3 43 E3 63 CB 4B EB 6B
31 B1 11 91 39 B9 19 99 33 B3 13 93 3B BB 1B 9B
F1 71 D1 51 F9 79 D9 59 F3 73 D3 53 FB 7B DB 5B
0D 8D 2D AD 05 85 25 A5 0F 8F 2F AF 07 87 27 A7
CD 4D ED 6D C5 45 E5 65 CF 4F EF 6F C7 47 E7 67
3D BD 1D 9D 35 B5 15 95 3F BF 1F 9F 37 B7 17 97
FD 7D DD 5D F5 75 D5 55 FF 7F DF 5F F7 77 D7 57
02 82 22 A2 0A 8A 2A AA 00 80 20 A0 08 88 28 A8
C2 42 E2 62 CA 4A EA 6A C0 40 E0 60 C8 48 E8 68
32 B2 12 92 3A BA 1A 9A 30 B0 10 90 38 B8 18 98
F2 72 D2 52 FA 7A DA 5A F0 70 D0 50 F8 78 D8 58
> exch get 256 div } bind setscreen
initgraphics
DISPLAYING
{ erasepage
} if
VMDEBUG
% The interpreter will run the initial procedure (start).