diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 16:53:33 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 16:53:33 +0300 |
commit | e463eb40363ff4c68b1d903f4e0cdd0ac1c5977f (patch) | |
tree | d5e9f57c28f026cb21de3bd77cc10cd7f64aaa85 /sys/lib/ghostscript/gs_ll3.ps | |
parent | b41b9034225ab3e49980d9de55c141011b6383b0 (diff) |
Import sources from 2011-03-30 iso image - sys/lib
Diffstat (limited to 'sys/lib/ghostscript/gs_ll3.ps')
-rwxr-xr-x | sys/lib/ghostscript/gs_ll3.ps | 340 |
1 files changed, 340 insertions, 0 deletions
diff --git a/sys/lib/ghostscript/gs_ll3.ps b/sys/lib/ghostscript/gs_ll3.ps new file mode 100755 index 000000000..145d2fafd --- /dev/null +++ b/sys/lib/ghostscript/gs_ll3.ps @@ -0,0 +1,340 @@ +% 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 +} odef +currentdict /.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 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. + % 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 .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 |