%PDF- %PDF-
Direktori : /www/varak.cloud/img.varak.cloud/img/foto-old/KOKOS04/Další/gs/gs6.50/lib/ |
Current File : /www/varak.cloud/img.varak.cloud/img/foto-old/KOKOS04/Další/gs/gs6.50/lib/gs_ll3.ps |
% Copyright (C) 1997, 2000 Aladdin Enterprises. All rights reserved. % % This file is part of AFPL Ghostscript. % % AFPL 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 Free Public License (the % "License") for full details. % % Every copy of AFPL 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 AFPL 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_ll3.ps,v 1.6.2.1 2000/11/16 00:37:03 raph 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 % Do the right thing if NOBIND or DELAYBIND is in effect. % Note also 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 load /.bind load ne /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 } odef { /.bind /bind load def /bind { } def } if currentdict /.bindscratch .undef % ------ 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 def end % 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 } if pop % ------ 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 def systemdict /.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. dup gsave { .buildshading .shfill } stopped grestore { stop } if pop } odef % Establish an initial smoothness value that matches Adobe RIPs. 0.02 setsmoothness % ------ UseCIEColor ------ % % The library maintains and detects the UseCIEColor device parameter, % but it doesn't have access to the resource dictionaries. We also % want color space substitution to work in systems without a PostScript % interpreter. Therefore, we eagerly inform the library of changes in % the (effective) ColorSpace category that might affect the operation of % UseCIEColor. We must notice the following events: % 1) defineresource and undefineresource of the Default ColorSpaces. % 2) restore. % 3) Changes in current VM, which cause a different set of resources % to become visible. % #1 is rare. #2 is handled in C code. If checking the ColorSpace % category on #3 turns out to be expensive, we can cache more information % about whether these operations actually affect UseCIEColor. % This operator implements color space substitution in the library: % <index> <bool> .setsubstitutecolorspace - % <bool> = true means substitute the current color space for the one given % by <index>; <bool> = false means stop substituting. Substitution is not % affected by grestore/setgstate, but it is affected by restore. % ColorSpace defineresource and undefineresource for the Default keys % call .definedefaultcs and .undefinedefaultcs. See gs_res.ps. /.useciecolorkeydict mark /UseCIEColor null .dicttomark readonly def /.definedefaultcs { % <index> <value> .definedefaultcs - currentcolorspace % Temporarily disable color substitution, in case the substitute % color space is or mentions a color space that is currently % being substituted. currentdevice //.useciecolorkeydict .getdeviceparams exch pop exch pop mark 5 -2 roll % Stack: cspace UseCIEColor mark index value { setcolorspace true .setsubstitutecolorspace } stopped counttomark 1 add 1 roll cleartomark % Stack: cspace UseCIEColor stopped? 3 1 roll currentdevice null true mark /UseCIEColor 6 -1 roll .putdeviceparams pop pop setcolorspace { stop } if } bind def currentdict /.useciecolorkeydict undef /.undefinedefaultcs { % <index> .undefinedefaultcs - false .setsubstitutecolorspace } bind def /.setdefaultcs { % <index> <value|null> .setdefaultcs - dup null eq { pop .undefinedefaultcs } { .definedefaultcs } ifelse } bind def /.getdefaultcs { % <key> .getdefaultcs <value|null> .GetInstance { 0 get } { null } ifelse } bind def /.setglobal { % <bool> .setglobal - dup .currentglobal ne { % If there are no local definitions of the Default keys, % changing VM can't affect the definition of any resource. /.localcsdefaults .uservar { % We only want to change substitutions for color spaces % whose definitions are actually changing. /ColorSpace /Category findresource begin /DefaultGray .getdefaultcs /DefaultRGB .getdefaultcs /DefaultCMYK .getdefaultcs end 3 index .setglobal /ColorSpace /Category findresource begin /DefaultGray .getdefaultcs /DefaultRGB .getdefaultcs /DefaultCMYK .getdefaultcs end % Stack: bool oldgray oldrgb oldcmyk % newgray newrgb newcmyk dup 4 index ne { 2 exch .setdefaultcs } { pop } ifelse dup 4 index ne { 1 exch .setdefaultcs } { pop } ifelse dup 4 index ne { 0 exch .setdefaultcs } { pop } ifelse pop pop pop pop } { .setglobal } ifelse } { .setglobal } ifelse } .bind odef % bind in .setglobal % ------ DeviceN color space ------ % % This isn't quite right, because the ColorSpaceFamily resource will exist % even with languagelevel < 3, but it's close enough. /.setdevicenspace where { pop colorspacedict /DeviceN { dup 2 get setcolorspace dup dup 1 get length % # of components .converttinttransform .setdevicenspace } bind put } if % ------ Miscellaneous ------ % % Define additional user and system parameters. /HalftoneMode 0 .definepsuserparam /MaxSuperScreen 1016 .definepsuserparam pssystemparams begin % read-only, so use .forcedef /MaxDisplayAndSourceList 160000 .forcedef end % 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