summaryrefslogtreecommitdiff
path: root/Master/tlpkg/tlgs/lib/gs_frsd.ps
diff options
context:
space:
mode:
authorReinhard Kotucha <reinhard.kotucha@web.de>2008-02-21 22:07:42 +0000
committerReinhard Kotucha <reinhard.kotucha@web.de>2008-02-21 22:07:42 +0000
commitf90099230db6de68f2285dca3d08174bda872f7a (patch)
tree48fbfd44b5c240a4430dd4a54b286de5f1102583 /Master/tlpkg/tlgs/lib/gs_frsd.ps
parent2deea5f17b0505ffeb480154ace47e0a72863c97 (diff)
tlpkg/tlgs: Subset of Ghostscript added.
git-svn-id: svn://tug.org/texlive/trunk@6709 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/tlpkg/tlgs/lib/gs_frsd.ps')
-rw-r--r--Master/tlpkg/tlgs/lib/gs_frsd.ps87
1 files changed, 87 insertions, 0 deletions
diff --git a/Master/tlpkg/tlgs/lib/gs_frsd.ps b/Master/tlpkg/tlgs/lib/gs_frsd.ps
new file mode 100644
index 00000000000..fea125258f9
--- /dev/null
+++ b/Master/tlpkg/tlgs/lib/gs_frsd.ps
@@ -0,0 +1,87 @@
+% Copyright (C) 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_frsd.ps 7629 2007-01-21 17:53:13Z lpd $
+% 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 } 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
+ % Stack: dict filters parms CloseSource oldglobal file
+ 10 dict exch {
+ % Stack: dict filters parms CloseSource oldglobal contdict file
+ dup 64000 string readstring
+ 3 index dup length 4 -1 roll put not { exit } if
+ } loop pop
+ % Concatenate the contents into one big string.
+ % Stack: dict filters parms CloseSource oldglobal contdict
+ 0 1 index { length exch pop add } forall
+ dup 65400 gt { .bytestring } { string } ifelse
+ 3 -1 roll .setglobal exch {
+ % Stack: dict filters parms CloseSource string index substring
+ exch 64000 mul exch 2 index 3 1 roll putinterval
+ } forall
+ % Now create the stream on the string.
+ 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