386BSD 0.1 development
[unix-history] / usr / othersrc / public / ghostscript-2.4.1 / pstoppm.ps
CommitLineData
394572bb
WJ
1%! PS-Adobe-2.0
2%% Program for reading a .ps file and writing out a PPM file.
3%% For Ghostscript 2.4.
4%%
5%% Modified by L. Peter Deutsch 4/6/92:
6%% Ghostscript 2.4 requires all 8 primary colors to be in the palette.
7%% Modified by L. Peter Deutsch 1/17/92:
8%% the palette for makeimagedevice is now a string, not an array.
9%% Modified by L. Peter Deutsch 9/24/91:
10%% allow starting page number to be specified.
11%% Modified by L. Peter Deutsch 7/7/91 to keep track of page count
12%% in a way that gets around save and restore.
13%% Modified by L. Peter Deutsch 11/07/90
14%% to use filename.ppm for the first page, renamed to filename.1ppm
15%% with subsequent pages .2ppm, etc. if more than one page.
16%% Modified by Henry Minsky 11/03/90
17%% for each showpage, it writes out a ppm file with name filename.ppm.N
18%% where N increments each showpage, starting at 1
19%% Modified by L. Peter Deutsch -- Aladdin Enterprises -- 08/25/90 --
20%% converted from a one-shot program to a utility package,
21%% designed to be used from an interactive terminal.
22%% Modified by L. Peter Deutsch -- Aladdin Enterprises -- 08/02/90
23%% Modified on 08/02/90 for using the CORRECT color map.
24%% Modified 06/26/90 for a color file
25%% Original version by Phillip Conrad - Perfect Byte, Inc.
26%%
27%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
28
29%%%%%% Define the directory for holding the PPM information
30
31/ppmdict 30 dict def
32ppmdict begin
33
34 /Horz_dpi 72 def % defaults to screen density
35 /Vert_dpi 72 def
36
37 /OutFilePrefix () def % default to null (current directory)
38
39 /FirstPageNumber 1 def % any non-negative integer is OK
40
41 /Palette1 <ff 00> def
42 /Palette8
43%========== Here we define all 256 color entries. ======
44%========== Colors were taken from the X Windows default colors, ======
45%========== hacked up a little so we get all 8 primaries. ======
46<
47000000 ffffff a8a8a8 ebebeb 5c5c5c 373737 5f929e 85ccdd
48345057 1f3034 729efe a0ddff 3f578c 263454 6186d8 2f2f64
49ffff00 b0e2ff ff0000 808080 efdf84 55fe55 fe0000 66fe57
50fe987a feca71 fefefe fe8d7c fea977 fec472 feb875 fe937b
51fe957a feb575 98fe5d fe8b7d fea677 feb276 feaf76 febe74
52fe837e fefc6a fe0c9a fe0350 fe08b5 6715fe fefb3f fe544b
5300c000 20c000 40c000 60c000 80c000 a0c000 c0c000 e0c000
5400ff00 20e000 40e000 60e000 80e000 a0e000 c0e000 e0e000
55000040 200040 400040 600040 800040 a00040 c00040 e00040
56002040 202040 402040 602040 802040 a02040 c02040 e02040
57004040 204040 404040 604040 804040 a04040 c04040 e04040
58006040 206040 406040 606040 806040 a06040 c06040 e06040
59008040 208040 408040 608040 808040 a08040 c08040 e08040
6000a040 20a040 40a040 60a040 80a040 a0a040 c0a040 e0a040
6100c040 20c040 40c040 60c040 80c040 a0c040 c0c040 e0c040
6200e040 20e040 40e040 60e040 80e040 a0e040 c0e040 e0e040
63000080 200080 400080 600080 800080 a00080 c00080 e00080
64002080 202080 402080 602080 802080 a02080 c02080 e02080
65004080 204080 404080 604080 804080 a04080 c04080 e04080
66006080 206080 406080 606080 806080 a06080 c06080 e06080
67008080 208080 408080 608080 808080 a08080 c08080 e08080
6800a080 20a080 40a080 60a080 80a080 a0a080 c0a080 e0a080
6900c080 20c080 40c080 60c080 80c080 a0c080 c0c080 e0c080
7000e080 20e080 40e080 60e080 80e080 a0e080 c0e080 e0e080
710000ff 2000c0 4000c0 6000c0 8000c0 a000c0 c000c0 ff00ff
720020c0 2020c0 4020c0 6020c0 8020c0 a020c0 c020c0 e020c0
730040c0 2040c0 4040c0 6040c0 8040c0 a040c0 c040c0 e040c0
740060c0 2060c0 4060c0 6060c0 8060c0 a060c0 c060c0 e060c0
750080c0 2080c0 4080c0 6080c0 8080c0 a080c0 c080c0 e080c0
7600a0c0 20a0c0 40a0c0 60a0c0 80a0c0 a0a0c0 c0a0c0 e0a0c0
7700c0c0 20c0c0 40c0c0 60c0c0 80c0c0 a0c0c0 c0c0c0 e0c0c0
7800ffff 20e0c0 40e0c0 60e0c0 80e0c0 a0e0c0 c0e0c0 e0e0c0
79> def
80
81 % Define a procedure for computing the output file name for a given page.
82 /pagefilename % <int|null> pagefilename -> <string
83 { OutFilePrefix FileName concatstrings (.) concatstrings
84 exch dup null ne
85 { 1 sub FirstPageNumber add (xxxxxx) cvs concatstrings }
86 { pop }
87 ifelse (ppm) concatstrings
88 } def
89
90 % Redefine copypage and showpage appropriately.
91 /copypage
92 { ppmdict begin
93
94 /PageCount PageCountString cvi 100000 sub def
95 /PageCount PageCount 1 add def
96
97 PageCount 1 eq
98 { null pagefilename % first page
99 }
100 { PageCount 2 eq
101 { % second page, rename first
102 null pagefilename 1 pagefilename
103 (Renaming ) print 1 index print ( to ) print
104 dup print (\n) print
105 flush
106 renamefile
107 } if
108 PageCount pagefilename
109 } ifelse
110 /FileNameOut exch def
111
112 FileNameOut (w) file
113 /FileDescOut exch def
114
115 (Writing ) print FileNameOut print (\n) print
116 flush
117 FileDescOut Device writeppmfile
118 FileDescOut closefile
119
120 WrotePage 0 1 put % /WrotePage true def
121 PageCount 100000 add PageCountString cvs pop
122
123 end
124 } userdict begin def end
125 /showpage
126 { copypage erasepage initgraphics
127 } userdict begin def end
128
129 /Convert % the main procedure
130 % <filename> <palette> Convert -
131 { /Palette exch def
132 /FileName exch def
133
134 % Save and restore don't save and restore the contents of strings.
135 % Therefore, we use strings to hold the two variables whose values
136 % must persist across page boundaries (PageCount and WrotePage).
137
138 /PageCountString 6 string def
139 100000 PageCountString cvs pop
140 /WrotePage 1 string def
141
142 /ScaleX Horz_dpi 72 div def
143 /ScaleY Vert_dpi 72 div def
144
145 /Width 85 Horz_dpi mul 5 add 10 div cvi def % add 5 to round up!
146 /Height 11 Vert_dpi mul def
147
148 FileName (.ps) concatstrings
149 /FileNameIn exch def % file name with extension
150
151 [ScaleX 0.0 0.0 ScaleY neg 0.0 Height]
152 Width Height Palette makeimagedevice
153 /Device exch def
154 Device setdevice
155
156 % For running the file, remove ppmdict from the dict stack
157 FileNameIn end run % ppmdict
158 ppmdict begin
159 WrotePage 0 get 0 eq { showpage } if % make sure the page got written
160 end % ppmdict
161
162 } def
163
164end % ppmdict
165
166%%%%%% Define the user-callable procedures
167
168/ppmsetdensity
169 { ppmdict begin
170 /Vert_dpi exch def
171 /Horz_dpi exch def
172 end
173 } def
174
175/ppmsetprefix
176 { ppmdict begin
177 /OutFilePrefix exch def
178 end
179 } def
180
181/ppmsetfirstpagenumber
182 { cvi
183 ppmdict begin
184 /FirstPageNumber exch def
185 } def
186
187/ppm1run
188 { ppmdict begin Palette1 Convert
189 } def
190
191/ppm8run
192 { ppmdict begin Palette8 Convert
193 } def
194
195/ppm24run
196 { ppmdict begin null Convert
197 } def
198
199%%%%%% Display instructions for the user.
200
201(Usage: (file) ppmNrun\n) print
202( converts file.ps to file.ppm (single page),\n) print
203( or file.1ppm, file.2ppm, ... (multi page).\n) print
204( N is # of bits per pixel (1, 8, or 24).\n) print
205(Examples: (golfer) ppm1run ..or.. (escher) ppm8run\n) print
206(Optional commands you can give first:\n) print
207( horiz_DPI vert_DPI ppmsetdensity\n) print
208( (dirname/) ppmsetprefix\n) print
209( page_num ppmsetfirstpagenumber\n) print
210flush