annotate 3rdparty/utils/viewgif/viewgif.c @ 3129:ce9f4ff0a380

l1 rel.asm: Do the module padding in a more portable way Add comments to describe what's happening and why.
author Neal Crook <foofoobedoo@gmail.com>
date Wed, 30 Nov 2016 22:10:56 +0000
parents aaae5eac20e1
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1188
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1 /* OS-9 ViewGIF 2.0 Copyright (C) 1989 by Vaughn Cato */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
2
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
3 /*
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
4 * This program was specifically written for OS-9 on the Tandy Color
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
5 * Computer 3 as its graphics routines will only work on that system.
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
6 * The GIF decoding routines were originally taken from the Apollo
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
7 * workstation version of viewgif by Ben Samit. As noted in the source
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
8 * code provided by Ben, most of his code was taken from a GIF to
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
9 * PostScript converter by Scott Hemphill. Because of their consideration
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
10 * in providing the source code with their respective programs I am doing
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
11 * the same.
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
12 *
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
13 * I encourage you to send any enhancements in the Color Computer version
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
14 * you wish to be publicly distributed to me so that I may update the
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
15 * program and re-release it. In this way, a standard version of the
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
16 * program can be maintained.
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
17 *
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
18 * My address is:
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
19 * Vaughn Cato
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
20 * 1244 E. Piedmont Rd. NE
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
21 * Marietta, Ga. 30062
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
22 */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
23
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
24 /*
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
25 * Any portion of this program may be freely used in any software provided
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
26 * the source for that program is made freely available to the public and
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
27 * credit is given to me, Ben Samit, and Scott Hemphill.
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
28 */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
29
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
30 #define EXTERN /* force a defining instance of global variables */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
31
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
32 #include <string.h>
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
33 #include "viewgif.h"
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
34
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
35 void showdata();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
36 char *mapgpb();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
37 extern int errno;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
38
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
39 DIRECT int pauselen = -1;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
40 DIRECT bool global;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
41
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
42 main(argc, argv)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
43 int argc;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
44 char *argv[];
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
45 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
46 register char *p;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
47 register bool *cscan;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
48 char opt;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
49 bool quit;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
50 int x, argnum;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
51
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
52 dfactor = D_DITHER;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
53 magfact = D_MAG;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
54 britefac = D_BRITE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
55 infomode = D_INFO;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
56 graytype = D_GRAY;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
57 myheight = D_HEIGHT;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
58
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
59 zapmap = aligned = realrand = vefon = FALSE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
60 flicker = newscrn = dispon = TRUE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
61
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
62 for (cscan = &coloruse[MGCLUT]; cscan > coloruse; )
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
63 *--cscan = TRUE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
64
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
65 screen[0].winpath = screen[1].winpath = -1;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
66
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
67 for (argnum = 1; argnum < argc; ++argnum) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
68 if (argv[argnum][0] == '-') {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
69 p = &argv[argnum][1];
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
70 while (opt = *p++) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
71 if (*p == '=')
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
72 ++p;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
73 switch (opt) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
74 case 'd':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
75 if (*p == '\0')
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
76 dfactor = 0;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
77 else {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
78 dfactor = atoi(p);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
79 if (dfactor < -MAXTOL1 || dfactor > MAXDITH1)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
80 error("Invalid dithering factor", 1);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
81 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
82 break;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
83 case 'u':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
84 usefname = p;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
85 break;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
86 case 'm':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
87 magfact = atoi(p);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
88 if (magfact < MINMAG || magfact > MAXMAG)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
89 error("Invalid magnification", 1);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
90 break;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
91 case 'x':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
92 startx = atoi(p);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
93 if (startx < MINCOORD || startx > MAXCOORD)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
94 error("Invalid start x coordinate", 1);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
95 break;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
96 case 'y':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
97 starty = atoi(p);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
98 if (starty < MINCOORD || starty > MAXCOORD)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
99 error("Invalid start y coordinate", 1);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
100 break;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
101 case 'g':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
102 switch (*p) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
103 case '2':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
104 graytype = MAX_GRAY;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
105 break;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
106 case '3':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
107 graytype = NTSC_GRAY;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
108 break;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
109 default:
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
110 graytype = AVG_GRAY;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
111 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
112 break;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
113 case 'a':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
114 aligned = TRUE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
115 continue;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
116 case 'z':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
117 dispon = zapmap = TRUE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
118 continue;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
119 case 'v':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
120 dispon = vefon = TRUE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
121 if (*p != '\0')
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
122 vefname = p;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
123 break;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
124 case 'r':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
125 realrand = TRUE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
126 continue;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
127 case 's':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
128 infomode = NO_INFO;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
129 continue;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
130 case 'i':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
131 if (newscrn)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
132 infomode = MUCH_INFO;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
133 continue;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
134 case 'n':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
135 if (vefname == NULL)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
136 dispon = FALSE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
137 continue;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
138 case 'p':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
139 pauselen = atoi(p);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
140 break;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
141 case 'c':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
142 newscrn = FALSE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
143 infomode = NO_INFO;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
144 continue;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
145 case 'f':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
146 flicker = FALSE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
147 continue;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
148 case 'b':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
149 britefac = atoi(p);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
150 if (britefac < MINBRITE || britefac > MAXBRITE)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
151 error("Invalid brightness factor", 1);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
152 break;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
153 case '?':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
154 usage();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
155 default:
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
156 fatal("Unknown option");
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
157 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
158 break;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
159 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
160 for (x = argnum + 1; x < argc; ++x)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
161 argv[x - 1] = argv[x];
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
162 --argc;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
163 --argnum;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
164 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
165 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
166
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
167 if (argc < 2)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
168 usage();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
169
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
170 if ((infile = fopen(argv[1], "r")) == NULL)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
171 error("Cannot open input file", errno);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
172
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
173 if (flicker) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
174 maxdith = MAXDITH2;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
175 minmod = SCALE2;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
176 approx = approx2;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
177 } else {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
178 maxdith = MAXDITH1;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
179 minmod = SCALE1;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
180 approx = approx1;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
181 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
182 if (dfactor > maxdith)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
183 dfactor = maxdith;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
184 low0 = minmod / 2;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
185 up0 = low0 + 1;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
186
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
187 checksig();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
188 readscrn();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
189 if (!realrand)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
190 makerand();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
191
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
192
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
193 quit = FALSE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
194 framenum = 0;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
195 do {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
196 switch (getc(infile)) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
197 case '\0':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
198 break;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
199 case ',':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
200 ++framenum;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
201 readimag();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
202 waituser();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
203 break;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
204 case ';':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
205 quit = TRUE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
206 break;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
207 case '!':
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
208 readext();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
209 break;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
210 default:
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
211 quit = TRUE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
212 break;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
213 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
214 if (!dispon && vefname == NULL && (usefname == NULL || !newuse))
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
215 break;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
216 } while (!quit);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
217
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
218 if (dispon) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
219 if (zapmap) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
220 if ((infile = freopen(argv[1], "r+", infile)) == NULL)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
221 error("Cannot rewrite global map", errno);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
222 else
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
223 zapglobmap();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
224 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
225 killwind();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
226 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
227
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
228 actwin = 1;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
229 select();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
230 flushwin();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
231 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
232
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
233 makerand()
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
234 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
235 register char *rscan1, *rscan2;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
236 int x, f2;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
237 char temp;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
238 bool oddrow, oddrc;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
239
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
240 f2 = maxdith / 2;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
241
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
242 /* initialize */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
243 x = 256;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
244 for (rscan2 = &randtab[16][0]; (rscan2 -= 16) >= &randtab[0][0]; )
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
245 for (rscan1 = rscan2 + 16; rscan1 > rscan2; )
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
246 *--rscan1 = (--x * f2) >> 8;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
247
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
248 /*
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
249 * permute randomly (I don't think the original made all
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
250 * permutations equally likely, alas)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
251 */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
252 rscan1 = &randtab[0][0];
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
253 for (x = 256; x > 0; x--) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
254 rscan2 = rscan1 + (rand() % x);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
255 temp = *rscan1;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
256 *rscan1++ = *rscan2;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
257 *rscan2 = temp;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
258 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
259
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
260 oddrow = FALSE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
261 for (rscan2 = &randtab[16][0]; (rscan2 -= 16) >= &randtab[0][0]; ) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
262 oddrc = oddrow = !oddrow;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
263 for (rscan1 = rscan2 + 16; --rscan1 >= rscan2; ) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
264 if (oddrc = !oddrc)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
265 *rscan1 += maxdith;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
266 if (oddrow)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
267 *rscan1 += f2;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
268 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
269 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
270 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
271
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
272 readuse()
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
273 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
274 char newname[64];
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
275 register char *ep;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
276 int usefile;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
277
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
278 getusename(newname);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
279 if ((usefile = open(newname, 1)) == -1) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
280 for (ep = &coloruse[MGCLUT]; --ep >= coloruse; )
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
281 *ep = TRUE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
282 newuse = TRUE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
283 } else {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
284 read(usefile, coloruse, MGCLUT * sizeof(bool));
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
285 close(usefile);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
286 if (infomode != NO_INFO)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
287 printf("Using usage file\n");
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
288 newuse = FALSE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
289 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
290 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
291
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
292 getusename(buffer)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
293 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
294 if (framenum > 1)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
295 sprintf(buffer, "%s%d", usefname, framenum);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
296 else
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
297 strcpy(buffer, usefname);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
298 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
299
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
300 writeuse()
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
301 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
302 register char *cp, *gp;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
303 int usecount, usefile;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
304 char newname[64];
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
305
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
306 usecount = 0;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
307 for (gp = &globuse[globcolors], cp = &coloruse[globcolors];
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
308 --gp, --cp >= coloruse; )
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
309 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
310 if (*cp) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
311 *gp = TRUE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
312 ++usecount;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
313 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
314 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
315 if (infomode != NO_INFO)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
316 printf("%d out of %d colors used.\n", usecount, globcolors);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
317 if (usefname != NULL) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
318 getusename(newname);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
319 if (newuse) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
320 if ((usefile = creat(newname, 3)) == -1)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
321 error("Cannot create usage file", errno);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
322 else
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
323 write(usefile, coloruse, globcolors);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
324 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
325 close(usefile);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
326 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
327 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
328
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
329 zapglobmap()
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
330 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
331 register rgbcolor *gp, *used;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
332 register int i;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
333
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
334 for (i = 0; i < globcolors; i++) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
335 if (globuse[i]) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
336 used = &globclut[i];
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
337 for (gp = &globclut[i = globcolors]; --i, --gp >= globclut; )
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
338 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
339 if (!globuse[i]) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
340 gp->red = used->red;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
341 gp->green = used->green;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
342 gp->blue = used->blue;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
343 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
344 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
345 fseek(infile, clutpos, 0);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
346 fwrite(globclut, sizeof(rgbcolor), globcolors, infile);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
347 return;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
348 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
349 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
350 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
351
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
352 saveimag()
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
353 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
354 register cocoscreen *sscan;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
355 char newname[64];
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
356 int file, x, scrnum, scrntype = 0;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
357
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
358 for (scrnum = 0; scrnum <= flicker; ++scrnum) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
359 sscan = &screen[scrnum];
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
360 strcpy(newname, vefname);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
361 if (framenum > 1)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
362 sprintf(newname + strlen(newname), "%d", framenum);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
363 if (scrnum == 1)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
364 strcat(newname, ".2");
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
365 actwin = sscan->winpath;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
366 select();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
367 flushwin();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
368 if ((file = creat(newname, 3)) == -1)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
369 error("Cannot create vef file", errno);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
370 else {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
371 write(file, &scrntype, sizeof(scrntype));
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
372 write(file, sscan->pal, MCCLUT * sizeof(colorcode));
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
373 for (x = 0; x < 8; ++x)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
374 write(file, gpbufptr, 160);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
375 for (x = 0; x < MROWS; ++x) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
376 getblk(groupnum, bufnum, 0, x, MCOLS - 1, 1);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
377 flushwin();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
378 write(file, gpbufptr, 160);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
379 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
380 close(file);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
381 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
382 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
383 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
384
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
385 readext()
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
386 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
387 char buf[255];
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
388 int count;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
389
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
390 (void) getc(infile);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
391 while (count = getc(infile))
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
392 fread(buf, 1, count, infile);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
393 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
394
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
395 DIRECT int real_x, real_y;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
396 DIRECT int x_coord, y_coord;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
397
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
398 typedef struct {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
399 int ilv_r0; /* starting row */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
400 int ilv_dr; /* step size */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
401 } ilvspec;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
402
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
403 static ilvspec ilvdat[] = {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
404 {1, 2}, /* .|.|.|.|.|.|.|.|. */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
405 {2, 4}, /* ..|...|...|...|.. */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
406 {4, 8}, /* ....|.......|.... */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
407 {0, 8}, /* |.......|.......| */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
408 };
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
409
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
410 readimag()
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
411 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
412 BYTE buf[9];
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
413 unsigned left, top, width, height;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
414 bool local, intrlevd;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
415 int lclbits;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
416 int row, rowoffset;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
417 register int n;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
418 int lineread, hold, xpos, x;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
419 register ilvspec *ilvscan;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
420
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
421 readuse();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
422 newwind();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
423
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
424 /* read header info */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
425 fread(buf, sizeof(BYTE), sizeof(buf) / sizeof(BYTE), infile);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
426 left = arith(buf[0]) | (buf[1] << 8);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
427 top = arith(buf[2]) | (buf[3] << 8);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
428 imagwid = width = arith(buf[4]) | (buf[5] << 8);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
429 imaghigh = height = arith(buf[6]) | (buf[7] << 8);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
430
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
431 if (infomode != NO_INFO)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
432 printf("gif dimensions: %d x %d pixels\n", imagwid, imaghigh);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
433
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
434 local = buf[8] & 0x80;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
435 intrlevd = buf[8] & 0x40;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
436
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
437 if (local) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
438 char tempbuf[3];
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
439
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
440 lclbits = (buf[8] & 0x7) + 1;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
441 for (x = 1 << lclbits; --x >= 0; )
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
442 fread(tempbuf, 3, 1, infile);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
443 } else if (!global)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
444 fatal("no CLUT present for image");
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
445
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
446 ilevtab[MROWS] = ILEVEND;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
447 for (x = MROWS; --x >= 0; )
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
448 ilevtab[x] = ILEVMISS;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
449
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
450 if (!aligned)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
451 n = myheight;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
452 else {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
453 for (n = imaghigh; n > 200; n /= 2)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
454 ;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
455 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
456 n *= magfact;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
457
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
458 rowoffset = 3 * starty * magfact;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
459 lineread = 0;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
460 if (intrlevd) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
461 for (ilvscan = &ilvdat[elements(ilvdat)]; --ilvscan >= ilvdat; ) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
462 for (x = ilvscan->ilv_r0; x < imaghigh; x += ilvscan->ilv_dr) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
463 row = (long) x * n / imaghigh - rowoffset;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
464 if (row >= 0 && row < MROWS)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
465 ilevtab[row] = lineread;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
466 ++lineread;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
467 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
468 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
469 } else {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
470 for (x = 0; x < imaghigh; ++x) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
471 row = (long) x * n / imaghigh - rowoffset;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
472 if (row >= 0 && row < MROWS)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
473 ilevtab[row] = lineread;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
474 ++lineread;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
475 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
476 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
477
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
478 x = startx * (imagwid / 64);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
479 hold = xpos = 0;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
480 while (xpos < mywidth) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
481 for (hold += mywidth * magfact; hold >= imagwid; hold -= imagwid)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
482 xtab[xpos++] = x;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
483 x++;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
484 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
485
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
486 real_x = real_y = 0;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
487 x_coord = y_coord = 0;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
488
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
489 if (dispon || (usefname != NULL && newuse)) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
490 readrast(width, height);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
491 writeuse();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
492 if (vefname != NULL)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
493 saveimag();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
494 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
495 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
496
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
497 DIRECT int datum;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
498 DIRECT int bits;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
499 char buf[255];
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
500
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
501 readrast(width, height)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
502 unsigned width, height;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
503 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
504 register char *ch;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
505 register codetype *cscan;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
506 int count, code;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
507
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
508 datasize = getc(infile);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
509 codesize = datasize + 1;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
510 codemask = (1 << codesize) - 1;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
511 clear = 1 << datasize;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
512 eoi = clear + 1;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
513 bits = 16;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
514
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
515 /* initialize code table */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
516 for (cscan = &codetab[code = clear]; --cscan, --code >= 0; ) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
517 cscan->prefix = (codetype *) NULL;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
518 cscan->first = cscan->suffix = code;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
519 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
520
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
521 while ((count = getc(infile)) > 0) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
522 fread(buf, sizeof(*buf), count, infile);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
523 for (ch = buf; --count >= 0; )
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
524 addbyte(*ch++);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
525 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
526
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
527 datum >>= bits;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
528 for (bits = 16 - bits; x_coord != 0 && bits >= codesize; bits -= codesize) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
529 process(datum & codemask);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
530 datum >>= codesize;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
531 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
532 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
533
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
534 addbyte(c)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
535 char c;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
536 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
537 /*
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
538 * datum += (long)(*ch & 0xff) << bits;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
539 * bits += 8;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
540 * while (bits >= codesize) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
541 * code = datum & codemask;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
542 * datum >>= codesize;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
543 * bits -= codesize;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
544 * if (code == eoi)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
545 * goto exitloop;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
546 * process(code);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
547 * }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
548 */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
549 #asm
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
550 ldb 5,s
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
551 lda <bits+1
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
552 suba #7
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
553 bls _addb3
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
554 sta <bits+1
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
555 lda <datum
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
556 sta <datum+1
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
557 stb <datum
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
558 lda #1
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
559 bra _addb4
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
560 _addb3
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
561 lda #8
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
562 _addb1
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
563 lsrb
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
564 ror <datum
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
565 ror <datum+1
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
566 _addb4
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
567 dec <bits+1
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
568 bne _addb2
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
569 * pshs d
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
570 tfr d,u
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
571 ldd <codesize
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
572 std <bits
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
573 ldd <datum
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
574 anda <codemask
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
575 andb <codemask+1
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
576 pshs d
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
577 lbsr process
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
578 leas 2,s
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
579 * puls d
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
580 tfr u,d
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
581 _addb2
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
582 deca
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
583 bne _addb1
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
584 #endasm
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
585 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
586
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
587 process(code)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
588 int code;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
589 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
590 register codetype *p, *cp;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
591 static DIRECT int avail;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
592 static DIRECT codetype *oldcp;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
593
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
594 if (code == clear) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
595 /* clear table */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
596 codesize = datasize + 1;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
597 codemask = (1 << codesize) - 1;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
598 avail = clear + 2;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
599 oldcp = NULL;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
600 } else if (code < avail) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
601 outcode(cp = &codetab[code]); /* output the code */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
602 if (oldcp != NULL) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
603 /* add new entry */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
604 p = &codetab[avail++];
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
605 /* prefix is previous code, first is prefix's first */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
606 p->first = (p->prefix = oldcp)->first;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
607 p->suffix = cp->first; /* suffix is first of current */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
608 if ((avail & codemask) == 0 && avail < MCODE) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
609 /* increase code size */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
610 codesize++;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
611 codemask += avail;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
612 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
613 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
614 oldcp = cp;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
615 } else if (code == avail && oldcp != NULL) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
616 /* repeat of last code */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
617 p = &codetab[avail++];
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
618 /* prefix is previous code, first is prefix's first */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
619 p->first = (p->prefix = oldcp)->first;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
620 p->suffix = p->first; /* Suffix is first of last */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
621 outcode(p);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
622 if ((avail & codemask) == 0 && avail < MCODE) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
623 /* increase code size */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
624 codesize++;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
625 codemask += avail;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
626 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
627 oldcp = &codetab[code];
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
628 } else
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
629 fatal("illegal code in raster data");
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
630 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
631
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
632 /*
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
633 * outcode() -- we finally get the data out of the LZ decompression, and
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
634 * fill a buffer until we get a line's worth of data. The loop with x0
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
635 * and x is intended to take advantage of the mostly increasing nature
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
636 * of ilevtab[], replacing an O(n**2) loop that was there before. Timing,
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
637 * however, shows that the change doesn't affect display time, so the
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
638 * performance bottleneck must be elsewhere. Rats.
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
639 */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
640 outcode(p)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
641 codetype *p;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
642 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
643 register BYTE *sp = &codestk[0];
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
644 register int x;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
645 static DIRECT int x0 = 0;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
646
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
647 for (; p; p = p->prefix)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
648 *sp++ = p->suffix;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
649
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
650 while (--sp >= &codestk[0]) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
651 coloruse[arith(*sp)] = TRUE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
652 if (real_x == 0) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
653 y_coord = -1;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
654 x = x0;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
655 do {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
656 if (++x >= myheight)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
657 x = 0;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
658 if (ilevtab[x] == real_y) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
659 x0 = y_coord = x;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
660 break;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
661 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
662 } while (x != x0);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
663 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
664 if (y_coord >= 0) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
665 while (xtab[x_coord] == real_x)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
666 linestor[x_coord++] = arith(*sp);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
667 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
668 if (++real_x >= imagwid) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
669 if (y_coord >= 0 && dispon) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
670 do {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
671 doline();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
672 } while (ilevtab[++y_coord] == ILEVMISS);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
673 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
674 real_x = x_coord = 0;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
675 ++real_y;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
676 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
677 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
678 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
679
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
680 DIRECT int bitcount, pixperbyte;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
681 DIRECT char *byteptr;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
682
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
683 doline()
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
684 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
685 register xlate *p;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
686 register char *rrow;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
687 register int x, addval, scrnum;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
688 cocoscreen *sscan;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
689
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
690 rrow = &randtab[y_coord & 15][0];
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
691
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
692 for (sscan = &screen[scrnum = (flicker ? 2 : 1)]; --sscan, --scrnum >= 0;)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
693 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
694 actwin = sscan->winpath;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
695 bitcount = pixperbyte;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
696 byteptr = gpbufptr;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
697 if (dfactor > 0) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
698 for (x = 0; x < mywidth; ++x) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
699 addval = (realrand) ? rand85(y_coord + x)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
700 : rrow[x & 15];
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
701 for (p = &transtab[linestor[x]][1]; p->addval <= addval; )
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
702 p++;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
703 --p;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
704 addpixel(p->clutval[scrnum]);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
705 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
706 } else {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
707 for (x = 0; x < mywidth; ++x)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
708 addpixel(transtab[linestor[x]][0].clutval[scrnum]);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
709 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
710 if (flicker)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
711 select();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
712 putblk(groupnum, bufnum, 0, y_coord);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
713 flushwin();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
714 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
715 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
716
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
717 addpixel(c)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
718 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
719 /*
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
720 * *byteptr = (*byteptr << (gmode ? 2 : 4)) | c;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
721 * if (--bitcount == 0) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
722 * byteptr++;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
723 * bitcount = pixperbyte;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
724 * }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
725 *
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
726 * (The spelling discrepancy here is due to the 6809's chopping off
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
727 * identifier lengths at a different point than the assembler appears to!)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
728 */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
729 #asm
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
730 ldx <byteptr
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
731 ldb ,x
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
732 lda <gmode+1
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
733 bne _addpix1
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
734 lslb
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
735 lslb
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
736 _addpix1
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
737 lslb
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
738 lslb
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
739 orb 5,s
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
740 stb ,x
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
741 dec <bitcount+1
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
742 bne _addpix2
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
743 leax 1,x
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
744 stx <byteptr
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
745 lda <pixperby+1
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
746 sta <bitcount+1
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
747 _addpix2
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
748 #endasm
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
749 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
750
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
751 rand85(n)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
752 int n;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
753 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
754 register unsigned result;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
755
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
756 result = rand() % maxdith;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
757 if (n & 1)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
758 result += maxdith + 1;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
759 return result;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
760 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
761
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
762 readscrn()
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
763 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
764 char buf[7];
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
765 int x;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
766 register rgbcolor *rp;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
767
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
768 fread(buf, sizeof(*buf), 7, infile);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
769 imagwid = arith(buf[0]) | (buf[1] << 8);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
770 imaghigh = arith(buf[2]) | (buf[3] << 8);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
771 if (infomode != NO_INFO)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
772 printf("%d x %d screen\n", imagwid, imaghigh);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
773 global = (buf[4] & 0x80) != 0;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
774 if (global) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
775 globbits = (buf[4] & 0x07) + 1;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
776 globcolors = 1 << globbits;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
777 if (infomode != NO_INFO)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
778 printf("global bitmap: %d colors\n", globcolors);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
779 clutpos = ftell(infile);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
780 fread(globclut, 3, globcolors, infile);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
781 if (infomode == MUCH_INFO) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
782 for (rp = globclut, x = 0; x < globcolors; rp++, x++) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
783 printf("color %d = %3d,%3d,%3d\n", x,
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
784 arith(rp->red), arith(rp->green), arith(rp->blue));
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
785 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
786 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
787 } else
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
788 fatal("cannot handle non-global bitmaps");
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
789 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
790
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
791 /*
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
792 * newwind() -- the big banana; determine the CoCo CLUT(s) that will
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
793 * best display the GIF image given the GIF CLUT.
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
794 */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
795
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
796 newwind()
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
797 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
798 register cocoscreen *sscan;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
799 register bool *bscan;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
800 register colorcode *cscan;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
801 rgbcolor *rgbp;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
802 bool first;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
803 char blip;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
804 int x, hival, loval, midval;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
805
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
806 fixgmap();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
807
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
808 if (infomode != NO_INFO) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
809 printf("Analyzing..");
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
810 fflush(stdout);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
811 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
812
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
813 loval = -MAXTOL1;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
814 midval = hival = dfactor;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
815
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
816 while (loval <= hival) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
817 dfactor = midval;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
818 if (setmap()) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
819 loval = midval + 1;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
820 blip = '+';
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
821 } else {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
822 hival = midval - 1;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
823 blip = '-';
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
824 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
825 if (infomode != NO_INFO) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
826 putchar(blip);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
827 fflush(stdout);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
828 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
829 midval = (loval + hival) / 2;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
830 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
831
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
832 if (dfactor != hival) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
833 dfactor = hival;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
834 setmap();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
835 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
836
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
837 if (infomode != NO_INFO) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
838 putchar('\n');
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
839 showdata();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
840 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
841
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
842 if (screen[0].clutsize <= 4 && !vefon) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
843 gmode = TRUE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
844 mywidth = 640;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
845 pixperbyte = 4;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
846 } else {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
847 gmode = FALSE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
848 mywidth = 320;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
849 pixperbyte = 2;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
850 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
851
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
852 first = TRUE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
853 for (sscan = &screen[(flicker ? 2 : 1)]; --sscan >= screen; ) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
854 if (dispon)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
855 sscan->winpath = initwin(first, sscan->winpath);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
856 for (cscan = &sscan->pal[x = sscan->clutsize]; --cscan, --x >= 0; ) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
857 *cscan = colorval(&sscan->clut[x]);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
858 if (dispon)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
859 palette(x, *cscan);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
860 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
861 if (dispon) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
862 border(0);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
863 flushwin();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
864 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
865 first = FALSE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
866 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
867 for (bscan = &coloruse[globcolors]; --bscan >= coloruse; )
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
868 *bscan = FALSE;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
869 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
870
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
871 /* colorval() -- encode an RGB222 value the way the GIME likes it */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
872
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
873 colorval(color)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
874 register rgbcolor *color;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
875 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
876 static char cocode[] = {'\000', '\001', '\010', '\011'};
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
877
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
878 return (((cocode[color->red & 3] << 1) |
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
879 cocode[color->green & 3]) << 1) | cocode[color->blue & 3];
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
880 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
881
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
882 /*
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
883 * showdata() -- display a bunch of information on the CLUTs used
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
884 * if it's been asked for
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
885 */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
886 void
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
887 showdata()
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
888 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
889 register rgbcolor *rscan;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
890 register cocoscreen *sscan;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
891 int x, y;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
892
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
893 if (dfactor > 0)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
894 printf("Dithering factor = %d\n", dfactor);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
895 else
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
896 printf("Color tolerance = %d\n", -dfactor);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
897 fputs("Resulting coco CLUT: ", stdout);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
898 printf("%d colors", screen[0].clutsize);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
899 if (flicker)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
900 printf(" + %d colors\n", screen[1].clutsize);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
901 else
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
902 putchar('\n');
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
903 if (infomode == MUCH_INFO) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
904 for (x = 0; x < (flicker ? 1 : 2); x++) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
905 sscan = &screen[x];
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
906 for (rscan = sscan->clut, y = 0; y < sscan->clutsize; y++) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
907 printf("%2d:%d,%d,%d=%d\n", y,
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
908 rscan->red, rscan->green, rscan->blue, colorval(rscan));
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
909 rscan++;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
910 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
911 putchar('\n');
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
912 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
913 fputs("Translation table:\n", stdout);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
914 for (x = 0; x < globcolors; ++x) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
915 if (coloruse[x]) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
916 printf("%3d:", x);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
917 for (y = 0; y < 4 && transtab[x][y].addval != BOGUSDITH; ++y) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
918 printf(" %3d=%3d",
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
919 transtab[x][y].addval, transtab[x][y].clutval[0]);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
920 if (flicker)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
921 printf(",%3d", transtab[x][y].clutval[1]);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
922 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
923 putchar('\n');
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
924 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
925 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
926 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
927 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
928
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
929 /*
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
930 * fixgmap() -- scale colors in the GIF image global CLUT in accordance
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
931 * with the brightness specification, and in passing, convert to gray
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
932 * if requested (either using the average of the components or their
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
933 * maximum).
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
934 */
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
935 fixgmap()
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
936 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
937 register rgbcolor *rscan;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
938 int x, r, g, b;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
939
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
940 for (rscan = &globclut[x = globcolors]; --rscan, --x >= 0; ) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
941 if (coloruse[x]) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
942 r = arith(rscan->red);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
943 g = arith(rscan->green);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
944 b = arith(rscan->blue);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
945 switch (graytype) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
946 case AVG_GRAY:
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
947 r = g = b = (r + g + b) / 3;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
948 break;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
949 case NTSC_GRAY:
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
950 r = g = b = (30 * r + 59 * g + 11 * b) / 100;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
951 break;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
952 case MAX_GRAY:
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
953 if (g > r)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
954 r = g;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
955 if (b > r)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
956 r = b;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
957 g = b = r;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
958 break;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
959 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
960 rscan->red = (britefac * r) >> 4;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
961 rscan->green = (britefac * g) >> 4;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
962 rscan->blue = (britefac * b) >> 4;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
963 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
964 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
965 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
966
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
967 killwind()
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
968 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
969 mapgpb(screen[flicker].winpath, groupnum, bufnum, 0);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
970 killbuf(groupnum, bufnum);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
971 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
972
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
973 waituser()
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
974 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
975 char c;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
976 int x;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
977 register cocoscreen *sscan;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
978
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
979 if (dispon) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
980 if (pauselen < 0) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
981 for (x = 5; --x >= 0; )
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
982 bell();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
983 flushwin();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
984 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
985 if (flicker) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
986 pauselen *= 30;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
987 do {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
988 for (sscan = &screen[2]; --sscan >= screen; ) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
989 actwin = sscan->winpath;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
990 select();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
991 flushwin();
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
992 sleep(2);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
993 if (ready(actwin)) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
994 read(actwin, &c, 1);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
995 if (c == '\n')
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
996 return;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
997 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
998 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
999 } while (pauselen < 0 || --pauselen >= 0);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1000 } else if (pauselen > 0) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1001 sleep(60 * pauselen);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1002 } else if (pauselen < 0) {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1003 do {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1004 read(screen[0].winpath, &c, 1);
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1005 } while (c != '\n');
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1006 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1007 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1008 }
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1009
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1010 ready(path)
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1011 int path;
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1012 {
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1013 #asm
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1014 lda 5,s
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1015 ldb #SS.Ready
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1016 os9 I$GetStt
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1017 bcc _ready1
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1018 ldd #0
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1019 bra _ready2
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1020 _ready1
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1021 ldd #1
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1022 _ready2
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1023 #endasm
aaae5eac20e1 Provded by James Jones
boisy
parents:
diff changeset
1024 }