/usr/share/ghostscript/9.10/lib/viewpbm.ps is in libgs9-common 9.10~dfsg-0ubuntu10.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 | % Copyright (C) 2001-2012 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., 7 Mt. Lassen Drive - Suite A-134, San Rafael,
% CA 94903, U.S.A., +1(415)492-9861, for further information.
%
% viewpbm.ps
% Display a PBM/PGM/PPM file.
% Requires the Level 2 `image' operator (to handle variable pixel widths).
% If SCALE is defined, maps input pixels to output pixels with that scale;
% if SCALE is undefined, scales the image to fit the page.
% If FITPAGE true, it fits the output page size to the image, honouring SCALE
/s 100 string def
/readmaxv { % <file> readmaxv -
10 string readline pop cvx exec /maxv exch def
} bind def
/readrow { % <file> <row> readrow <row>
0 1 2 index length 1 sub {
1 index exch 3 index token pop put
} for exch pop
} bind def
/read01 { % <file> <count> read01 <byte>
0 exch {
1 index read pop 48 xor dup 1 le { exch dup add add } { pop } ifelse
} repeat
} bind def
/readrow01 { % <file> <row> readrow01 <row>
0 1 w 8 idiv {
1 index exch 3 index 8 read01 put
} for
wrem 0 ne {
dup rsize 1 sub wrem read01 8 wrem sub bitshift put
} if
exch pop
} bind def
/readwh { % <file> readwh <w> <h>
dup s readline pop % check for comment
(#) anchorsearch {
pop pop dup s readline pop
} if
cvx exec
} bind def
/pbmtypes mark
% The procedures in this dictionary are called as
% <file> Pn <w> <h> <readproc>
/P1 { % ASCII 1-bit white/black
/bpc 1 def /maxv 1 def /rsize w 7 add 8 idiv def
/wrem w 8 mod def
/ncomp 1 def /invert true def /DeviceGray setcolorspace
readwh
{ readrow01 }
} bind
/P2 { % ASCII 8-bit gray
readwh
/bpc 8 def 2 index readmaxv /rsize 2 index def
/ncomp 1 def /invert false def /DeviceGray setcolorspace
{ readrow }
} bind
/P3 { % ASCII 8-bit RGB
readwh
/bpc 8 def 2 index readmaxv /rsize 2 index 3 mul def
/ncomp 3 def /invert false def /DeviceRGB setcolorspace
{ readrow }
} bind
/P4 { % Binary 1-bit white/black
readwh
/bpc 1 def /maxv 1 def /rsize 2 index 7 add 8 idiv def
/ncomp 1 def /invert true def /DeviceGray setcolorspace
{ readstring pop }
} bind
/P5 { % Binary 8-bit gray
readwh
/bpc 8 def 2 index readmaxv /rsize 2 index def
/ncomp 1 def /invert false def /DeviceGray setcolorspace
{ readstring pop }
} bind
/P6 { % Binary 8-bit RGB
readwh
/bpc 8 def 2 index readmaxv /rsize 2 index 3 mul def
/ncomp 3 def /invert false def /DeviceRGB setcolorspace
{ readstring pop }
} bind
.dicttomark readonly def
/pbmsetup { % <file> <w> <h> <readproc> runpbm -
/readproc exch def
/h exch def
/w exch def
/f exch def
20 dict begin % image dictionary
/ImageType 1 def
/Width w def
/Height h def
/ImageMatrix [w 0 0 h neg 0 h] def
/BitsPerComponent bpc def
/Decode [ 0 255 maxv div invert { exch } if ncomp 1 sub { 2 copy } repeat ] def
/DataSource [ f rsize string /readproc load /exec load ] cvx def
currentdict end
} def
/imagescale { % <imagedict> imagescale -
begin
/SCALE where {
pop
/FITPAGE where {/FITPAGE get}{false} ifelse
{
Width 72 mul SCALE mul Height 72 mul SCALE mul
}
{
% Map pixels SCALE-for-1. Assume orthogonal transformation.
Width 1 0 dtransform add abs div SCALE mul
Height 0 1 dtransform add abs div SCALE mul
} ifelse
} {
/FITPAGE where {/FITPAGE get}{false} ifelse
{
Width 72 mul Height 72 mul
}
{
% Scale the image (uniformly) to fit the page.
clippath pathbbox pop pop translate
pathbbox .min exch pop exch pop ceiling
dup Height Width gt {
Width mul Height div exch
} {
Height mul Width div
} ifelse
} ifelse
}
ifelse scale
end
} def
% Image a PBM file page by page.
/viewpbm { % <filename> viewpbm -
20 dict begin
(r) file /pf exch def {
pf token not { exit } if
pbmtypes exch get pf exch exec pbmsetup
/FITPAGE where
{
/FITPAGE get
{
/SCALE where
{
pop
<</PageSize [w 72 mul SCALE mul h 72 mul SCALE mul] >>
}
{
<</PageSize [w 72 mul h 72 mul] >>
} ifelse
setpagedevice
} if
} if
dup imagescale image showpage
} loop
end
} def
% Reassemble a composite PBM file from the CMYK separations.
/viewpsm {
20 dict begin
/fname exch def
/sources [ 0 1 3 {
/plane exch def
/pf fname (r) file def
pf pbmtypes pf token pop get exec
% Stack: pf w h readproc
plane {
/readproc exch def /h exch def /w exch def pop
/row rsize string def
h { pf row readproc pop } repeat
pf pbmtypes pf token pop get exec
} repeat
pbmsetup
} for ] def
/datas [ sources { /DataSource get 0 get } forall ] def
/decode sources 0 get /Decode get
dup 0 get exch 1 get add cvi 0 exch
2 copy 4 copy 8 array astore def
sources 0 get
dup /MultipleDataSources true put
dup /DataSource datas put
dup /Decode decode put
/DeviceCMYK setcolorspace
/FITPAGE where
{
/FITPAGE get
{
/SCALE where
{
<</PageSize [w SCALE mul h SCALE mul]>>
}
{
<</PageSize [w h]>>
}ifelse
setpagedevice
} if
} if
dup imagescale image showpage
end
} def
% If the program was invoked from the command line, run it now.
[ shellarguments
{ counttomark 1 ge
{ ] { viewpbm } forall
}
{ cleartomark
(Usage: gs [--] viewpbm.ps filename.p*m ...\n) print
( e.g.: gs [--] viewpbm.ps my.ppm another.ppm\n) print flush
}
ifelse
}
{ pop
}
ifelse
|