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

  1. %    Copyright (C) 1989, 1992, 1993, 1998 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: viewgif.ps,v 1.2 2000/09/19 18:29:11 lpd Exp $
  16. % viewgif.ps
  17. % Display a GIF file.
  18.  
  19. /read1            % <file> read1 <int>
  20.  { read pop
  21.  } bind def
  22. /read2            % <file> read2 <int>
  23.  { dup read1 exch read1 8 bitshift add
  24.  } bind def
  25.  
  26. /readGIFheader        % <file> readGIFheader <dict>
  27.  { 20 dict begin
  28.    dup 6 string readstring pop
  29.    dup (GIF87a) eq exch (GIF89a) eq or not
  30.     { (Not a GIF file.\n) print cleartomark stop
  31.     } if
  32.    dup read2 /Width exch def
  33.    dup read2 /Height exch def
  34.    dup read1
  35.    dup 128 ge /GlobalColor exch def
  36.    dup -4 bitshift 7 and 1 add /BitsPerPixel exch def    %***BOGUS?***
  37.    dup 8 and 0 ne /PaletteSorted exch def
  38.    7 and 1 add dup /BitsPerPixel exch def
  39.      1 exch bitshift /PaletteSize exch def
  40.    dup read1 /BackgroundIndex exch def
  41.    dup read1 15 add 64 div /AspectRatio exch def
  42.    GlobalColor
  43.     { PaletteSize 3 mul string readstring pop
  44.       /GlobalPalette exch def
  45.     } if
  46.    currentdict end
  47.  } bind def
  48.  
  49. /readGIFimageHeader    % <file> readGIFimageHeader <dict>
  50.             % Note: GIF header must be on dict stack
  51.  { 10 dict begin
  52.     { dup read1
  53.       dup (!) 0 get ne { exit } if pop        % extension
  54.       dup read1 pop
  55.        { dup read1 dup 0 eq { pop exit } if { dup read1 pop } repeat
  56.        } loop
  57.     } loop
  58.    (,) 0 get ne
  59.     { (Not a GIF image.\n) print stop
  60.     } if
  61.    dup read2 /Left exch def
  62.    dup read2 /Top exch def
  63.    dup read2 /Width exch def
  64.    dup read2 /Height exch def
  65.    dup read1
  66.    dup 128 ge /LocalColor exch def
  67.    dup 64 and 0 ne /Interlaced exch def
  68.    LocalColor
  69.     { 7 and 1 add /BitsPerPixel exch def
  70.       1 BitsPerPixel bitshift 3 mul string readstring pop
  71.       /Palette exch def
  72.     }
  73.     { pop pop /Palette GlobalPalette def
  74.     }
  75.    ifelse
  76.    currentdict end
  77.  } bind def
  78.  
  79. /imageGIF        % <imagedict> imageGIF
  80.  { /ImageOut where
  81.     { pop
  82.         % We know BitsPerComponent = 8, Decode = [0 255].
  83.         % and there is only a single data source which is
  84.         % either a filter or a string whose size is exactly
  85.         % the width of the row.
  86.       dup /DataSource get dup type /stringtype eq
  87.        { ImageOut exch writestring
  88.        }
  89.        { pop dup /Width get string
  90.      1 index /Height get
  91.       { 1 index /DataSource get 1 index readstring pop
  92.         ImageOut exch writestring
  93.       }
  94.      repeat pop pop
  95.        }
  96.       ifelse 
  97.     }
  98.     { image
  99.     }
  100.    ifelse
  101.  } bind def
  102.  
  103. /viewGIF        % <file|string> viewGIF -
  104.  { save 20 dict begin
  105.    /saved exch def
  106.    dup type /stringtype eq { (r) file } if
  107.    /F exch def
  108.    /ImageOutFile where { /ImageOut ImageOutFile (w) file def } if
  109.    F readGIFheader /Header exch def
  110.      currentdict Header end begin begin
  111.    DEBUG { Header { exch == == } forall (----------------\n) print flush } if
  112.    F readGIFimageHeader /ImageHeader exch def
  113.      currentdict ImageHeader end begin begin
  114.    DEBUG { ImageHeader { exch == == } forall (----------------\n) print flush } if
  115.    /D F
  116.    <<    /InitialCodeLength F read1
  117.     /FirstBitLowOrder true
  118.     /BlockData true
  119.     /EarlyChange 0
  120.    >> /LZWDecode filter def
  121.  
  122.    [/Indexed /DeviceRGB 1 BitsPerPixel bitshift 1 sub Palette] setcolorspace
  123.    matrix currentmatrix
  124.    0 1 3 { 2 copy get dup 0 ne { dup abs div } if 3 copy put pop pop } for
  125.    setmatrix
  126.    <<    /ImageType 1
  127.     /ImageMatrix [1 0 0 -1 0 Height]
  128.     /BitsPerComponent 8
  129.     /Decode [0 255]
  130.    Interlaced
  131.     {    /Width Width   /Height 1
  132.     /row Width string def
  133.     /DataSource row
  134.       >> /I exch def
  135.       /inter        % <num> <denom> inter -
  136.        { /denom exch def   /num exch def
  137.          gsave
  138.      /lines Height denom 1 sub add num sub denom idiv def
  139.      0 1 lines 1 sub {
  140.        Height exch denom mul num add sub
  141.        I /ImageMatrix get 5 3 -1 roll put
  142.        D row readstring pop pop
  143.        I imageGIF
  144.      } for
  145.      grestore
  146.        }
  147.       bind def
  148.       0 8 inter
  149.       4 8 inter
  150.       2 4 inter
  151.       1 2 inter
  152.     }
  153.     {    /Width Width   /Height Height
  154.     /DataSource D
  155.       >> imageGIF
  156.     }
  157.    ifelse
  158.    saved end end end restore
  159.  } bind def   
  160.