home *** CD-ROM | disk | FTP | other *** search
/ Acorn User 10 / AU_CD10.iso / Updates / GhostScript / !GhostScr / 6_01 / lib / viewmiff.ps < prev    next >
Text File  |  2000-03-09  |  4KB  |  127 lines

  1. %    Copyright (C) 1998 Aladdin Enterprises.  All rights reserved.
  2. % This file is part of Aladdin Ghostscript.
  3. % Aladdin Ghostscript is distributed with NO WARRANTY OF ANY KIND.  No author
  4. % or distributor accepts any responsibility for the consequences of using it,
  5. % or for whether it serves any particular purpose or works at all, unless he
  6. % or she says so in writing.  Refer to the Aladdin Ghostscript Free Public
  7. % License (the "License") for full details.
  8. % Every copy of Aladdin Ghostscript must include a copy of the License,
  9. % normally in a plain ASCII text file named PUBLIC.  The License grants you
  10. % the right to copy, modify and redistribute Aladdin Ghostscript, but only
  11. % under certain conditions described in the License.  Among other things, the
  12. % License requires that the copyright notice and this notice be preserved on
  13. % all copies.
  14.  
  15. % $Id: viewmiff.ps,v 1.1 2000/03/09 08:40:40 lpd Exp $
  16. % viewmiff.ps
  17. % Display a MIFF file.  You would think the 'display' command would do this,
  18. % but many versions of 'display' either core-dump or require unacceptably
  19. % large amounts of memory.
  20.  
  21. % Recognize MIFF keywords.
  22. /miffwords mark
  23.   /class { cvn /class exch def }
  24.   /colors { cvi /colors exch def }
  25.   /columns { cvi /Width exch def }
  26.   /compression { cvn /compression exch def }
  27.   /depth { cvi /depth exch def }
  28.   /packets { cvi /packets exch def }
  29.   /rows { cvi /Height exch def }
  30. .dicttomark readonly def
  31.  
  32. % Recognize MIFF image classes.
  33. /miffclasses mark
  34.   /DirectClass {
  35.     /DeviceRGB setcolorspace
  36.     /BitsPerComponent depth def
  37.     /Decode [ 0 1 0 1 0 1 ] def
  38.   }
  39.   /PseudoClass {
  40.     [ /Indexed
  41.         % The MIFF documentation lies about the size of pixels
  42.         % for this case: the pixel size is determined only by
  43.         % the number of colors, and is not affected by the image
  44.         % depth.  Specifically, if there are 256 or fewer colors
  45.         % but the depth (of color map entries) is 16, each pixel
  46.         % is still only 1 byte, not 2.
  47.       currentdict /colors known {
  48.     /DeviceRGB colors 1 sub
  49.     /BitsPerComponent colors 256 le { 8 } { 16 } ifelse def
  50.     colors 3 mul string depth 8 eq {
  51.       f exch readstring pop
  52.     } {
  53.         % 16-bit color map entries: take only the high-order byte.
  54.       0 1 2 index length 1 sub {
  55.         f read pop 2 index 3 1 roll put f read pop pop
  56.       } for
  57.     } ifelse
  58.       } {
  59.     /colors 256 def
  60.     /DeviceGray 255
  61.     256 string 0 1 255 { 1 index exch dup put } for
  62.       } ifelse
  63.     ] setcolorspace
  64.     /Decode [ 0 1 BitsPerComponent bitshift 1 sub ] def
  65.   }
  66. .dicttomark readonly def
  67.  
  68. % Recognize MIFF compression methods.
  69. /rlstring 768 string def
  70. /rlread {
  71.         % packets is not reliable -- disregard it.
  72.   dup rlstring 0 3 getinterval readstring {
  73.     pop read pop 3 mul 3 3 2 index {
  74.       rlstring exch rlstring 0 3 getinterval putinterval
  75.     } for
  76.     rlstring 0 3 -1 roll 3 add getinterval
  77.   } {
  78.     pop pop ()
  79.   } ifelse
  80. } bind def
  81. /miffcompress mark
  82.   /Uncompressed { f }
  83.   /RunLengthEncoded { { f rlread } }
  84.   /Zip { [ f /FlateDecode filter cvlit /rlread cvx ] cvx }
  85. .dicttomark readonly def
  86.  
  87. % Read a MIFF file and display the image.
  88. /viewmiff {        % <filename> viewmiff -
  89.   50 dict begin
  90.   /fname 1 index def
  91.   /f exch (r) file def
  92.         % Set defaults.
  93.   /ImageType 1 def
  94.   /class /DirectClass def
  95.   /compression /Uncompressed def
  96.   /depth 8 def
  97.   /packets 16#7fffffff def
  98.         % Read and parse the header.
  99.   { f token pop
  100.     dup (:) eq { pop exit } if
  101.     dup type /nametype eq {
  102.       .namestring (=) search {
  103.     exch pop miffwords exch .knownget { exec } { pop } ifelse
  104.       } {
  105.     pop    % who knows?
  106.       } ifelse
  107.     } {
  108.       pop    % probably a comment in braces
  109.     } ifelse
  110.   } loop
  111.         % Read and display the image.
  112.   miffclasses class get exec
  113.   /DataSource miffcompress compression get exec def
  114.   /ImageMatrix [Width 0 0 Height neg 0 Height] def
  115.   currentpagedevice /PageSize get
  116.     dup 0 get exch 1 get scale
  117.   gsave 0.8 setgray 0 0 1 1 rectfill grestore    % provide background
  118.   currentdict image
  119.   showpage
  120.         % Clean up.
  121.   f closefile
  122.   end
  123. } bind def
  124.