Commit | Line | Data |
---|---|---|
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 | |
32 | ppmdict 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 | < | |
47 | 000000 ffffff a8a8a8 ebebeb 5c5c5c 373737 5f929e 85ccdd | |
48 | 345057 1f3034 729efe a0ddff 3f578c 263454 6186d8 2f2f64 | |
49 | ffff00 b0e2ff ff0000 808080 efdf84 55fe55 fe0000 66fe57 | |
50 | fe987a feca71 fefefe fe8d7c fea977 fec472 feb875 fe937b | |
51 | fe957a feb575 98fe5d fe8b7d fea677 feb276 feaf76 febe74 | |
52 | fe837e fefc6a fe0c9a fe0350 fe08b5 6715fe fefb3f fe544b | |
53 | 00c000 20c000 40c000 60c000 80c000 a0c000 c0c000 e0c000 | |
54 | 00ff00 20e000 40e000 60e000 80e000 a0e000 c0e000 e0e000 | |
55 | 000040 200040 400040 600040 800040 a00040 c00040 e00040 | |
56 | 002040 202040 402040 602040 802040 a02040 c02040 e02040 | |
57 | 004040 204040 404040 604040 804040 a04040 c04040 e04040 | |
58 | 006040 206040 406040 606040 806040 a06040 c06040 e06040 | |
59 | 008040 208040 408040 608040 808040 a08040 c08040 e08040 | |
60 | 00a040 20a040 40a040 60a040 80a040 a0a040 c0a040 e0a040 | |
61 | 00c040 20c040 40c040 60c040 80c040 a0c040 c0c040 e0c040 | |
62 | 00e040 20e040 40e040 60e040 80e040 a0e040 c0e040 e0e040 | |
63 | 000080 200080 400080 600080 800080 a00080 c00080 e00080 | |
64 | 002080 202080 402080 602080 802080 a02080 c02080 e02080 | |
65 | 004080 204080 404080 604080 804080 a04080 c04080 e04080 | |
66 | 006080 206080 406080 606080 806080 a06080 c06080 e06080 | |
67 | 008080 208080 408080 608080 808080 a08080 c08080 e08080 | |
68 | 00a080 20a080 40a080 60a080 80a080 a0a080 c0a080 e0a080 | |
69 | 00c080 20c080 40c080 60c080 80c080 a0c080 c0c080 e0c080 | |
70 | 00e080 20e080 40e080 60e080 80e080 a0e080 c0e080 e0e080 | |
71 | 0000ff 2000c0 4000c0 6000c0 8000c0 a000c0 c000c0 ff00ff | |
72 | 0020c0 2020c0 4020c0 6020c0 8020c0 a020c0 c020c0 e020c0 | |
73 | 0040c0 2040c0 4040c0 6040c0 8040c0 a040c0 c040c0 e040c0 | |
74 | 0060c0 2060c0 4060c0 6060c0 8060c0 a060c0 c060c0 e060c0 | |
75 | 0080c0 2080c0 4080c0 6080c0 8080c0 a080c0 c080c0 e080c0 | |
76 | 00a0c0 20a0c0 40a0c0 60a0c0 80a0c0 a0a0c0 c0a0c0 e0a0c0 | |
77 | 00c0c0 20c0c0 40c0c0 60c0c0 80c0c0 a0c0c0 c0c0c0 e0c0c0 | |
78 | 00ffff 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 | ||
164 | end % 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 | |
210 | flush |