home *** CD-ROM | disk | FTP | other *** search
/ PC World 2001 April / PCWorld_2001-04_cd.bin / Software / Vyzkuste / gs / gs650w32.exe / gs6.50 / lib / gs_frsd.ps < prev    next >
Text File  |  2000-12-05  |  3KB  |  85 lines

  1. %    Copyright (C) 2000 Aladdin Enterprises.  All rights reserved.
  2. % This file is part of AFPL Ghostscript.
  3. % AFPL Ghostscript is distributed with NO WARRANTY OF ANY KIND.  No author or
  4. % distributor accepts any responsibility for the consequences of using it, or
  5. % for whether it serves any particular purpose or works at all, unless he or
  6. % she says so in writing.  Refer to the Aladdin Free Public License (the
  7. % "License") for full details.
  8. % Every copy of AFPL Ghostscript must include a copy of the License, normally
  9. % in a plain ASCII text file named PUBLIC.  The License grants you the right
  10. % to copy, modify and redistribute AFPL Ghostscript, but only under certain
  11. % conditions described in the License.  Among other things, the License
  12. % requires that the copyright notice and this notice be preserved on all
  13. % copies.
  14.  
  15. % $Id: gs_frsd.ps,v 1.4 2000/09/19 18:29:11 lpd Exp $
  16. % Implementation of ReusableStreamDecode filter.
  17. % This file must be loaded after gs_lev2.ps and gs_res.ps.
  18.  
  19. level2dict begin
  20.  
  21. % ------ ReusableStreamDecode filter ------ %
  22.  
  23. /.reusablestreamdecode {    % <source> <dict> .reusablestreamdecode <file>
  24.                 % <source> .reusablestreamdecode <file>
  25.         % Collect the filter parameters.
  26.   dup type /dicttype eq { 2 copy } { dup 0 dict } ifelse
  27.   dup .rsdparams
  28.         % Construct the filter pipeline.
  29.         % The very first filter should use the value of CloseSource
  30.         % from the RSD dictionary; all the others should have
  31.         % CloseSource = true.
  32.         % Stack: source dict filters parms
  33.   2 index /CloseSource .knownget not { false } if 5 -1 roll
  34.         % Stack: dict filters parms CloseSource source
  35.   0 1 5 index length 1 sub {
  36.     4 index 1 index get
  37.         % Stack: dict filters parms CloseSource source index filtname
  38.     4 index null eq {
  39.       0 dict
  40.     } {
  41.       4 index 2 index get dup null eq { pop } if
  42.     } ifelse
  43.     3 -1 roll pop exch filter
  44.     exch pop true exch        % set CloseSource for further filters
  45.   } for
  46.         % If AsyncRead is true, try to create the filter directly.
  47.         % Stack: dict filters parms CloseSource source
  48.   4 index /AsyncRead .knownget not { false } if {
  49.     1 index { .reusablestream } .internalstopped
  50.   } {
  51.     null true
  52.   } ifelse {
  53.     pop
  54.         % No luck.  Read the entire contents of the stream now.
  55.     dup type /filetype ne {
  56.         % Make a stream from a procedure or string data source.
  57.       0 () .subfiledecode
  58.     } if
  59.     10 dict exch {
  60.         % Stack: dict filters parms CloseSource contdict file
  61.       dup 1000 string readstring
  62.       3 index dup length 4 -1 roll put not { exit } if
  63.     } loop pop
  64.         % Concatenate the contents into one big string.
  65.         % Stack: dict filters parms CloseSource contdict
  66.     0 1 index { length exch pop add } forall
  67.     .bigstring exch {
  68.         % Stack: dict filters parms CloseSource string index substring
  69.       exch 1000 mul exch 2 index 3 1 roll putinterval
  70.     } forall
  71.         % Now create the stream on the string.
  72.     1 index .reusablestream
  73.   } if
  74.         % We created the stream successfully: clean up.
  75.   4 { exch pop } repeat
  76.   1 index type /dicttype eq { exch pop } if exch pop
  77. } odef
  78.  
  79. filterdict /ReusableStreamDecode /.reusablestreamdecode load put
  80.  
  81. end            % level2dict
  82.