diff options
Diffstat (limited to 'Master/tlpkg/tlgs/Resource/Init/gs_frsd.ps')
-rw-r--r-- | Master/tlpkg/tlgs/Resource/Init/gs_frsd.ps | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_frsd.ps b/Master/tlpkg/tlgs/Resource/Init/gs_frsd.ps new file mode 100644 index 00000000000..e815169c6a0 --- /dev/null +++ b/Master/tlpkg/tlgs/Resource/Init/gs_frsd.ps @@ -0,0 +1,80 @@ +% Copyright (C) 2001-2012 Artifex Software, Inc. +% 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. +% +% Refer to licensing information at http://www.artifex.com or contact +% Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, San Rafael, +% CA 94903, U.S.A., +1(415)492-9861, for further information. +% + +% Implementation of ReusableStreamDecode filter. +% This file must be loaded after gs_lev2.ps and gs_res.ps. + +level2dict begin + +% ------ ReusableStreamDecode filter ------ % + +/.reusablestreamdecode { % <source> <dict> .reusablestreamdecode <file> + % <source> .reusablestreamdecode <file> + % Collect the filter parameters. + dup type /dicttype eq { 2 copy } { dup 0 dict } ifelse + dup .rsdparams + % Construct the filter pipeline. + % The very first filter should use the value of CloseSource + % from the RSD dictionary; all the others should have + % CloseSource = true. + % Stack: source dict filters parms + 2 index /CloseSource .knownget not { //false } if 5 -1 roll + % Stack: dict filters parms CloseSource source + 0 1 5 index length 1 sub { + 4 index 1 index get + % Stack: dict filters parms CloseSource source index filtname + 4 index //null eq { + 0 dict + } { + 4 index 2 index get dup //null eq { pop 0 dict} if + } ifelse + 3 -1 roll pop exch filter + exch pop //true exch % set CloseSource for further filters + } for + % If AsyncRead is true, try to create the filter directly. + % Stack: dict filters parms CloseSource source + 4 index /AsyncRead .knownget not { //false } if { + 1 index { .reusablestream } .internalstopped + } { + //null //true + } ifelse { + pop + % No luck. Read the entire contents of the stream now. + dup type /filetype ne { + % Make a stream from a procedure or string data source. + 0 () .subfiledecode + } if + % We must allocate the string in the same VM space as its + % source, since the reusable stream must be allocated there. + + .currentglobal 1 index gcheck .setglobal exch + currentpacking //false setpacking exch + % Stack: dict filters parms CloseSource oldglobal oldpacking file + [ exch { dup 40000 string readstring not { exit } if exch } loop + exch pop + ] + % Stack: dict filters parms CloseSource oldglobal oldpacking [()...] + 3 1 roll setpacking setglobal + % Stack: dict filters parms CloseSource [()...] + 1 index .reusablestream + } if + % We created the stream successfully: clean up. + 4 { exch pop } repeat + 1 index type /dicttype eq { exch pop } if exch pop +} odef + +filterdict /ReusableStreamDecode /.reusablestreamdecode load put + +end % level2dict |