340 lines · 10.3 KB · Text
RawDownload
%    Copyright (C) 1997, 2000 Aladdin Enterprises.  All rights reserved.% % This software is provided AS-IS with no warranty, either express or% implied.% % This software is distributed under license and may not be copied,% modified or distributed except as expressly authorized under the terms% of the license contained in the file LICENSE in this distribution.% % For more information about licensing, please refer to% http://www.ghostscript.com/licensing/. For information on% commercial licensing, go to http://www.artifex.com/licensing/ or% contact Artifex Software, Inc., 101 Lucas Valley Road #110,% San Rafael, CA  94903, U.S.A., +1(415)492-9861. % $Id: gs_ll3.ps,v 1.20 2003/10/22 11:22:29 alexcher Exp $% Initialization file for PostScript LanguageLevel 3 functions.% This file must be loaded after gs_lev2.ps and gs_res.ps.% These definitions go into ll3dict or various ProcSets.% NOTE: the interpreter creates ll3dict. ll3dict begin % We need LanguageLevel 2 or higher in order to have setuserparams and% defineresource.languagelevel dup 2 .max .setlanguagelevel % ------ Idiom recognition ------ % /IdiomRecognition false .definepsuserparam % Modify `bind' to apply idiom recognition afterwards./.bindscratch 128 string def% Note that since this definition of `bind' may get bound in,% it has to function properly even at lower language levels,% where IdiomRecognition may not be defined./.bind {		% <proc> .bind <proc'>  //.bind currentuserparams /IdiomRecognition  .knownget not { false } if {    (*) {      /IdiomSet findresource      false exch {		% Stack: proc false dummykey [template substitute]	exch pop dup 1 get exch 0 get		% Stack: proc false substitute template	3 index .eqproc {	  2 index gcheck 1 index gcheck not and {	    pop	  } {	    3 -1 roll pop exch not exit	  } ifelse	} {	  pop	} ifelse      } forall { exit } if    } //.bindscratch /IdiomSet resourceforall  } if} odefcurrentdict /.bindscratch .undef DELAYBIND NOBIND or not {   /bind /.bind load def} if % ------ HalftoneTypes 6, 10, 16 and HalftoneMode ------ % % This code depends on an internal HalftoneType 7 with the following keys:%	Width, Height, Width2, Height2, TransferFunction:%	  as for HalftoneType 16.%	Thresholds: a string or bytestring holding the thresholds,%	  (Width x Height + Width2 x Height2) x BitsPerSample / 8 bytes,%	  as for HalftoneType 16 except that the samples may be either%	  8 or 16 bits wide.%	BitsPerSample: 8 or 16. % Note that this HalftoneType never appears in halftone dictionaries given% to sethalftone, only as a component in those given to .sethalftone5,% so its numeric value can be chosen ad lib as long as it differs from the% other values that are legal in component dictionaries for .sethalftone5% (currently only 1 and 3). /.makehalftone7 {	% <dict> <dict> <source> <Width> <Height>			%   (<Width2> <Height2> | null) <BPS> .makehalftone7			%   <setdict> <dict5> { .sethalftone5 }  8 dict begin  /HalftoneType 7 def  /BitsPerSample exch def  dup null eq {    pop 0  } {    /Height2 1 index def /Width2 2 index def mul  } ifelse 3 1 roll  /Height 1 index def  /Width 2 index def  mul add BitsPerSample 8 idiv mul .bigstring		% Stack: dict dict source str  dup type /stringtype eq { readstring } { .readbytestring } ifelse  not { /sethalftone load /rangecheck signalerror exit } if  readonly /Thresholds exch def  /TransferFunction .knownget { /TransferFunction exch def } if		% If the original Thresholds was a file, replace it with		% a new one.  dup /Thresholds get type /filetype eq {    dup /Thresholds [ Thresholds ] cvx 0 () .subfiledecode put  } if  mark /HalftoneType 5 /Default currentdict end .dicttomark  { .sethalftone5 }} bind def /.bigstring {	% <size> .bigstring <string|bytestring>  dup 65400 gt { .bytestring } { string } ifelse} bind def /.readbytestring {	% <source> <bytestring> .readbytestring			%   <bytestring> <filled>		% Note that since bytestrings don't implement getinterval,		% if filled is false, there is no way to tell how much		% was read.  true exch 0 1 2 index length 1 sub {		% Stack: source true str index    3 index read not { pop exch not exch exit } if    3 copy put pop pop  } for 3 -1 roll pop exch} bind def /.sethalftone6 {	% <dict> <dict> .sethalftone6 <setdict> <dict5>			%   { .sethalftone5 }			% Keys: Width, Height, Thresholds, T'Function  dup /Thresholds get  1 index /Width get 2 index /Height get  null 8 .makehalftone7} bind def /.sethalftone10 {	% <dict> <dict> .sethalftone10 <setdict> <dict5>			%   { .sethalftone5 }			% Keys: Xsquare, Ysquare, Thresholds, T'Function		% Note that this is the only one of these three HalftoneTypes		% that allows either a file or a string for Thresholds.  dup /Thresholds get dup type /stringtype eq { 0 () .subfiledecode } if  1 index /Xsquare get dup 3 index /Ysquare get dup  8 .makehalftone7} bind def /.sethalftone16 {	% <dict> <dict> .sethalftone16 <setdict> <dict5>			%   { .sethalftone5 }			% Keys: Width, Height, Width2, Height2,			%   Thresholds, T'Function  dup /Thresholds get  1 index /Width get 2 index /Height get  3 index /Width2 .knownget {  % 2-rectangle case    4 index /Height2 get  } {			% 1-rectangle case    null  } ifelse 16 .makehalftone7} bind def .halftonetypes begin  6 /.sethalftone6 load def  10 /.sethalftone10 load def  16 /.sethalftone16 load defend % Redefine the halftone-setting operators to honor HalftoneMode./setcolorscreen {  /HalftoneMode getuserparam 0 eq {    //setcolorscreen  } {    12 { pop } repeat .getdefaulthalftone    { //sethalftone }    { .setdefaulthalftone }    ifelse  } ifelse} odef/setscreen {  /HalftoneMode getuserparam 0 eq {    //setscreen  } {    pop pop pop .getdefaulthalftone    { //sethalftone }    { .setdefaulthalftone }    ifelse  } ifelse} odef/sethalftone {  /HalftoneMode getuserparam 0 eq {    //sethalftone  } {    pop .getdefaulthalftone    { //sethalftone }    { .setdefaulthalftone }    ifelse  } ifelse} odef % ------ ImageTypes 3 and 4 (masked images) ------ % .imagetypes  dup 3 /.image3 load put  dup 4 /.image4 load put% We also detect ImageType 103 here: it isn't worth making a separate file% just for this.  /.image3x where { pop dup 103 /.image3x load put } ifpop % ------ Functions ------ % % Define the FunctionType resource category./Generic /Category findresource dup maxlength 3 add dict .copydict begin  /InstanceType /integertype def/FunctionType currentdict end /Category defineresource pop {0 2 3} { dup /FunctionType defineresource pop } forall % ------ Smooth shading ------ % % Define the ShadingType resource category./Generic /Category findresource dup maxlength 3 add dict .copydict begin  /InstanceType /integertype def/ShadingType currentdict end /Category defineresource pop systemdict /.shadingtypes mark		% not ll3dict  1 /.buildshading1 load  2 /.buildshading2 load  3 /.buildshading3 load  4 /.buildshading4 load  5 /.buildshading5 load  6 /.buildshading6 load  7 /.buildshading7 load.dicttomark put systemdict /.reuseparamdict mark  /Intent 2  /AsyncRead false  /CloseSource true.dicttomark readonly put/.buildshading {	% <shadingdict> .buildshading <shading>        % Unfortunately, we always need to make the DataSource reusable,        % because if clipping is involved, even shfill may need to read        % the source data multiple times.  If it weren't for this,        % we would only need to create a reusable stream if the ultimate        % source of the data is a procedure (since the library can't        % suspend shading to do a procedure callout).  dup /DataSource .knownget {    dup type /filetype eq {      //.reuseparamdict /ReusableStreamDecode filter      .currentglobal 1 index gcheck .setglobal		% Stack: shdict rsdfile saveglobal      2 index dup length dict copy exch .setglobal      dup /DataSource 4 -1 roll put exch pop    } {      pop    } ifelse  } if	% The .buildshading operators use the current color space	% for ColorSpace.  dup /ShadingType get //.shadingtypes exch get  1 index /ColorSpace get setcolorspace exec} bind defsystemdict /.reuseparamdict undef /.buildpattern2 {	% <template> <matrix> .buildpattern2			%   <template> <pattern>	% We want to build the pattern without doing gsave/grestore,	% since we want it to load the CIE caches.  1 index /Shading get  mark currentcolor currentcolorspace  counttomark 4 add -3 roll mark 4 1 roll	% Stack: -mark- ..color.. cspace -mark- template matrix shadingdict  { .buildshading } stopped {    cleartomark setcolorspace setcolor pop stop  } if  .buildshadingpattern  3 -1 roll pop counttomark 1 add 2 roll setcolorspace setcolor pop} bind def .patterntypes  2 /.buildpattern2 load put /shfill {		% <shadingdict> shfill -	% Currently, .shfill requires that the color space	% in the pattern be the current color space.	% Disable overprintmode for shfill  dup gsave  0 .setoverprintmode { .buildshading .shfill } stopped  grestore { stop } if  pop} odef % Establish an initial smoothness value that matches Adobe RIPs.0.02 setsmoothness % ------ DeviceN color space ------ % %% Replace 1 (gs_ciecs3.ps)(gs_ciecs3.ps) runlibfile %% Replace 1 (gs_devn.ps)(gs_devn.ps) runlibfile % ------ Miscellaneous ------ % % Make the setoverprintmode and currentoverprintmode operators visible (3015)% Because of the requirements of PDF, the .currentoverprintmode and% .setoverprintmode operators have integer parameters.  Thus wee need to% convert the Postscript bool parameters to integers.%/setoverprintmode 		% bool setoverprint -{  { 1 } { 0 } ifelse		% convert bool to integer  //.setoverprintmode} odef /currentoverprintmode 		% - currentoverprintmode bool{  //.currentoverprintmode  0 ne				% convert integers to bool} odef % Define additional user and system parameters./HalftoneMode 0 .definepsuserparam/MaxSuperScreen 1016 .definepsuserparampssystemparams begin		% read-only, so use .forcedef  /MaxDisplayAndSourceList 160000 .forcedefend % Define the IdiomSet resource category.{ /IdiomSet } {  /Generic /Category findresource dup maxlength 3 add dict .copydict begin    /InstanceType /dicttype def  currentdict end /Category defineresource pop} forall /languagelevel 3 def% When running in LanguageLevel 3 mode, this interpreter is supposed to be% compatible with Adobe version 3010./version (3010) readonly def .setlanguagelevel end			% ll3dict