summaryrefslogtreecommitdiff
path: root/Master/tlpkg/tlgs/lib/viewmiff.ps
blob: 90db80b0922b4c12fbf69a991dcb2e0bcbf470d6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
% Copyright (C) 2001-2021 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.,  1305 Grant Avenue - Suite 200, Novato,
% CA 94945, U.S.A., +1(415)492-9861, for further information.
%

% viewmiff.ps
% Display a MIFF file.  You would think the 'display' command would do this,
% but many versions of 'display' either core-dump or require unacceptably
% large amounts of memory.
% FITPAGE is true, it fits the output page size to the image

% Recognize MIFF keywords.
/miffwords mark
  /class { cvn /class exch def }
  /colors { cvi /colors exch def }
  /columns { cvi /Width exch def }
  /compression { cvn /compression exch def }
  /depth { cvi /depth exch def }
  /packets { cvi /packets exch def }
  /rows { cvi /Height exch def }
.dicttomark readonly def

% Recognize MIFF image classes.
/miffclasses mark
  /DirectClass {
    /DeviceRGB setcolorspace
    /BitsPerComponent depth def
    /Decode [ 0 1 0 1 0 1 ] def
  }
  /PseudoClass {
    [ /Indexed
                % The MIFF documentation lies about the size of pixels
                % for this case: the pixel size is determined only by
                % the number of colors, and is not affected by the image
                % depth.  Specifically, if there are 256 or fewer colors
                % but the depth (of color map entries) is 16, each pixel
                % is still only 1 byte, not 2.
      currentdict /colors known {
        /DeviceRGB colors 1 sub
        /BitsPerComponent colors 256 le { 8 } { 16 } ifelse def
        colors 3 mul string depth 8 eq {
          f exch readstring pop
        } {
                % 16-bit color map entries: take only the high-order byte.
          0 1 2 index length 1 sub {
            f read pop 2 index 3 1 roll put f read pop pop
          } for
        } ifelse
      } {
        /colors 256 def
        /DeviceGray 255
        256 string 0 1 255 { 1 index exch dup put } for
      } ifelse
    ] setcolorspace
    /Decode [ 0 1 BitsPerComponent bitshift 1 sub ] def
  }
.dicttomark readonly def

% Recognize MIFF compression methods.
/rlstring 768 string def
/rlread {
                % packets is not reliable -- disregard it.
  dup rlstring 0 3 getinterval readstring {
    pop read pop 3 mul 3 3 2 index {
      rlstring exch rlstring 0 3 getinterval putinterval
    } for
    rlstring 0 3 -1 roll 3 add getinterval
  } {
    pop pop ()
  } ifelse
} bind def
/miffcompress mark
  /Uncompressed { f }
  /RunLengthEncoded { { f rlread } }
  /Zip { [ f /FlateDecode filter cvlit /rlread cvx ] cvx }
.dicttomark readonly def

% Read a MIFF file and display the image.
/viewmiff {		% <filename> viewmiff -
  50 dict begin
  /fname 1 index def
  /f exch (r) file def
                % Set defaults.
  /ImageType 1 def
  /class /DirectClass def
  /compression /Uncompressed def
  /depth 8 def
  /packets 16#7fffffff def
                % Read and parse the header.
  { f token pop
    dup (:) eq { pop exit } if
    dup type /nametype eq {
      1024 string cvs (=) search {
        exch pop miffwords exch .knownget { exec } { pop } ifelse
      } {
        pop	% who knows?
      } ifelse
    } {
      pop	% probably a comment in braces
    } ifelse
  } loop
                % Read and display the image.
  miffclasses class get exec
  /DataSource miffcompress compression get exec def
  /FITPAGE where
  {
    /FITPAGE get
    {
      % we've already set the image color space, so
      % push it on the stack, and set it again after
      % setting the page size
      currentcolorspace
      <</PageSize [Width Height] >> setpagedevice
      setcolorspace
    } if
  } if

  /ImageMatrix [Width 0 0 Height neg 0 Height] def
  currentpagedevice /PageSize get
    dup 0 get exch 1 get scale
  gsave 0.8 setgray 0 0 1 1 rectfill grestore	% provide background
  currentdict image
  showpage
                % Clean up.
  f closefile
  end
} bind def