1 /***********************************************************
2 * K O U L E S *
3 *----------------------------------------------------------*
4 * C1995 JAHUSOFT *
5 * Jan Hubicka *
6 * Dukelskych Bojovniku 1944 *
7 * 390 03 Tabor *
8 * Czech Republic *
9 * Phone: 0041-361-32613 *
10 * eMail: hubicka@paru.cas.cz *
11 *----------------------------------------------------------*
12 *Copyright(c)1995,1996 by Jan Hubicka.See README forlicense*
13 * details. *
14 *----------------------------------------------------------*
15 * cmap-x11.c colormap routines for x11 *
16 * unclean....I know *
17 ***********************************************************/
18
19 #include "koules.h"
20 #define col(i,y) (i>63?63:i)
21 #define NKEEP 28 /*how many collow keep in provate colormap */
22 int fadedout = 0;
23 void
setmonopalette()24 setmonopalette ()
25 {
26 int i;
27 notusedc = 3;
28 for (i = 0; i < 256; i++)
29 pixels[i] = BlackPixel (dp, screen),
30 spixels[i] = 0;
31 for (i = 0; i < 16; i++)
32 {
33 pixels[i] = WhitePixel (dp, screen);
34 spixels[i] = 64;
35 pixels[i + 16] = WhitePixel (dp, screen);
36 spixels[i + 16] = 64;
37 pixels[i + 32 + 16] = WhitePixel (dp, screen);
38 spixels[i + 32 + 16] = 64;
39 pixels[i + 192 + 16] = WhitePixel (dp, screen);
40 spixels[i + 192 + 16] = 64;
41 pixels[i + 64] = WhitePixel (dp, screen);
42 spixels[i + 64] = 64;
43 pixels[i + 96] = WhitePixel (dp, screen);
44 spixels[i + 96] = 64;
45 pixels[i + 128] = WhitePixel (dp, screen);
46 spixels[i + 128] = 64;
47 pixels[i + 160] = WhitePixel (dp, screen);
48 spixels[i + 160] = 64;
49 }
50 pixels[0] = BlackPixel (dp, screen),
51 pixels[255] = WhitePixel (dp, screen),
52 spixels[0] = 0;
53 }
54 static int
setcustompalette1(CONST int ncolors)55 setcustompalette1 (CONST int ncolors)
56 {
57 /* 0-31 black to yellow for starwars scroller */
58 /* 32-63 black to red */
59 /* 64-96 for red koules */
60 /* 96-128 for yellow rockets */
61 /* 128-160 for green rockets */
62 /* 160-192 for blue rockets */
63 /* 192-256 gray cmap for stars */
64 unsigned long pixels1[256];
65 int npixels1;
66 unsigned char pal[256][3];
67 int i;
68 int y;
69 const int p = 0;
70 int lr = -1, lg = -1, lb = -1, lpixel = -1;
71 XColor c[256];
72 int nallocated = 0;
73 if (useprivate)
74 {
75 nallocated = NKEEP;
76 for (i = 0; i < NKEEP; i++)
77 c[i].pixel = i;
78 XQueryColors (dp, DefaultColormap (dp, screen), c, NKEEP);
79 for (i = 0; i < NKEEP; i++)
80 XStoreColors (dp, colormap, c, NKEEP);
81 }
82 for (i = 0; i < 64; i++)
83 {
84 int r, g, b;
85 r = g = b = 0;
86 y = (i * ncolors / 32) * 32 / ncolors;
87 if ((y & 32) > 0)
88 b = (y & 31) << 1;
89 if (y < 32)
90 {
91 r = (y & 3) << 4; /* 2 bits */
92 g = (y & 4) << 3; /* 1 bit */
93 b = (y & 24) << 1; /* 2 bits */
94 }
95 pal[i][0] = col (r + p, p1);
96 pal[i][1] = col (g + p, p1);
97 pal[i][2] = col (b + p, p1);
98 }
99 for (i = 64; i < 64 + 32; i++)
100 {
101 int r, g, b;
102 y = (i * ncolors / 32) * 32 / ncolors;
103 if (y < 64)
104 y = 64;
105 r = g = b = 0;
106 r = (32 - (y - 63)) << 1;
107 if (i < 64 + 8)
108 {
109 b = g = (((8 - (y - 63))) << 5) / 5;
110 }
111 pal[i][0] = col (r + p, p1);
112 pal[i][1] = col (g + p, p1);
113 pal[i][2] = col (b + p, p1);
114 }
115 for (i = 96; i < 96 + 32; i++)
116 {
117 int r, g, b;
118 y = (i * ncolors / 32) * 32 / ncolors;
119 if (y < 96)
120 y = 96;
121 r = g = b = 0;
122 r = g = (32 - (y - 95)) << 1;
123 if (i < 96 + 8)
124 {
125 b = ((8 - (y - 95))) << 3;
126 }
127 pal[i][0] = col (r + p, p1);
128 pal[i][1] = col (g + p, p1);
129 pal[i][2] = col (b + p, p1);
130 }
131 for (i = 128; i < 128 + 32; i++)
132 {
133 int r, g, b;
134 y = (i * ncolors / 32) * 32 / ncolors;
135 if (y < 128)
136 y = 128;
137 r = g = b = 0;
138 g = (32 - (y - 127)) << 1;
139 if (i < 128 + 8)
140 {
141 r = b = ((8 - (i - 127))) << 3;
142 }
143 pal[i][0] = col (r + p, p1);
144 pal[i][1] = col (g + p, p1);
145 pal[i][2] = col (b + p, p1);
146 }
147 for (i = 160; i < 160 + 32; i++)
148 {
149 int r, g, b;
150 y = (i * ncolors / 32) * 32 / ncolors;
151 if (y < 160)
152 y = 160;
153 r = g = b = 0;
154 b = (32 - (y - 159)) << 1;
155 if (i < 160 + 8)
156 {
157 r = g = (((8 - (y - 159))) << 3) / 2;
158 }
159 pal[i][0] = col (r + p, p1);
160 pal[i][1] = col (g + p, p1);
161 pal[i][2] = col (b + p, p1);
162 }
163 for (i = 0; i < 32; i++)
164 {
165 y = (i * ncolors / 32) * 32 / ncolors;
166 if (ncolors < 8)
167 {
168 pal[i][0] = 64;
169 pal[i][1] = 64;
170 pal[i][2] = 0;
171 }
172 else
173 {
174 pal[i][0] = col (y * 2 + p, p1);
175 pal[i][1] = col (y * 2 + p, p1);
176 pal[i][2] = col (p, p1);
177 }
178 }
179
180 for (i = 0; i < 32; i++)
181 {
182 y = (i * ncolors / 32) * 32 / ncolors;
183 if (ncolors < 8)
184 {
185 pal[192 + i][0] = 64;
186 pal[192 + i][1] = 64;
187 pal[192 + i][2] = 64;
188 }
189 else
190 {
191 pal[192 + i][0] = col (y * 2 + p, p1);
192 pal[192 + i][1] = col (y * 2 + p, p1);
193 pal[192 + i][2] = col (y * 2 + p, p1);
194 }
195 }
196 pal[0][0] = 0;
197 pal[0][1] = 0;
198 pal[0][2] = 0;
199 pal[255][0] = col (63 + p, p1);
200 pal[255][1] = col (63 + p, p1);
201 pal[255][2] = col (63 + p, p1);
202 npixels1 = 0;
203 for (i = 0; i < 256; i++)
204 {
205 float sat;
206 sat = pal[i][0] * 0.3 + pal[i][1] * 0.5 + pal[i][2] * 0.2;
207 if (monochrome)
208 sat = pow (sat / 64, 0.6) * 64;
209 spixels[i] = sat;
210 if (ncolors == 32)
211 {
212 opixels[i] = sat;
213 }
214 }
215 for (i = 0; i < 256 && !blackwhite; i++)
216 {
217 if (lr == pal[i][0] && lg == pal[i][1] && lb == pal[i][2])
218 pixels[i] = lpixel;
219 else
220 {
221 XColor color;
222 if (!monochrome)
223 {
224 color.flags = DoRed | DoGreen | DoBlue;
225 color.red = (unsigned short) (pal[i][0]) * 256 * 4;
226 color.green = (unsigned short) (pal[i][1]) * 256 * 4;
227 color.blue = (unsigned short) (pal[i][2]) * 256 * 4;
228 color.pixel = npixels1;
229 }
230 else
231 {
232 color.flags = DoRed | DoGreen | DoBlue;
233 color.red = (unsigned short) (spixels[i]) * 256 * 4;
234 color.green = (unsigned short) (spixels[i]) * 256 * 4;
235 color.blue = (unsigned short) (spixels[i]) * 256 * 4;
236 color.pixel = npixels1;
237 }
238 if (!useprivate && !XAllocColor (dp, colormap, &color))
239 {
240 XFreeColors (dp, colormap, pixels1, npixels1, 0L);
241 return (0);
242 }
243 if (useprivate)
244 {
245 int i;
246 for (i = 0; i < nallocated; i++)
247 {
248 if ((c[i].red & 0xfc00) == (color.red && 0xfc00) && (c[i].blue & 0xfc00) == (color.blue & 0xfc00) &&
249 (c[i].green & 0xfc00) == (color.green & 0xfc00))
250 {
251 color.pixel = i;
252 break;
253 }
254 }
255 if (i == nallocated)
256 color.pixel = i, nallocated++;
257 if (nallocated >= 256)
258 printf ("Cmap owerflow!");
259 XStoreColor (dp, colormap, &color);
260 c[i].red = color.red;
261 c[i].green = color.green;
262 c[i].blue = color.blue;
263 }
264 pixels1[npixels1] = color.pixel;
265 lpixel = color.pixel;
266 lr = pal[i][0];
267 lg = pal[i][1];
268 lb = pal[i][2];
269 npixels1++;
270
271 }
272 pixels[i] = lpixel;
273 }
274 return (1);
275 }
276 void
setcustompalette(CONST int p,CONST float p1)277 setcustompalette (CONST int p, CONST float p1)
278 {
279 int ncolor, i;
280 if (blackwhite)
281 {
282 nofade = 1;
283 monochrome = 1;
284 setcustompalette1 (32);
285 setmonopalette ();
286 return;
287 }
288 printf ("Allocating pallette\n");
289 for (ncolor = 32; ncolor > 8; ncolor -= 4)
290 {
291 printf ("%i-", ncolor);
292 if (setcustompalette1 (ncolor))
293 {
294 notusedc = 0;
295 for (i = 0; i < 256; i++)
296 if (notusedc == pixels[i])
297 notusedc++, i = 0;
298 printf ("ok\n");
299 return;
300 }
301 }
302 printf ("failed...using slow algoritmus and private colormap\n");
303 colormap = XCreateColormap (dp, wi,
304 DefaultVisual (dp, XDefaultScreen (dp)),
305 AllocAll);
306 XSetWindowColormap (dp, wi, colormap);
307 useprivate = 1;
308
309 for (ncolor = 32; ncolor > 0; ncolor -= 1)
310 {
311 printf ("%i-", ncolor);
312 if (setcustompalette1 (ncolor))
313 {
314 notusedc = 0;
315 for (i = 0; i < 256; i++)
316 if (notusedc == pixels[i])
317 notusedc++, i = 0;
318 printf ("ok\n");
319 return;
320 }
321 }
322 printf ("Could not allocate colormap try -m option\n");
323 exit (-1);
324 }
325 /* adapted from 'xscreensaver',
326 */
327 #define XFADE_IN 1
328 #define XFADE_OUT 0
329 #define NUM_COLORS 256
330 void
Fade(CONST int steps)331 Fade (CONST int steps)
332 {
333 static int state = XFADE_IN;
334 static XColor orig_colors[NUM_COLORS];
335 XColor curr_colors[NUM_COLORS];
336 int i, j;
337 static Colormap *fade_cmap, new_cmap;
338 if (!fadeenable || nofade)
339 return;
340 nopause = 1;
341 /* Set the requested pixels */
342 for (i = 0; i < NUM_COLORS; ++i)
343 orig_colors[i].pixel = i;
344
345 state = ((state == XFADE_IN) ? XFADE_OUT : XFADE_IN);
346 /* Make a copy of the default colormap and use that in fade */
347 if (useprivate)
348 {
349 if (state == XFADE_OUT)
350 {
351 XQueryColors (dp, colormap, orig_colors,
352 NUM_COLORS);
353 fade_cmap = &colormap;
354 }
355 }
356 else
357 {
358 XQueryColors (dp, colormap, orig_colors, NUM_COLORS);
359 if (state == XFADE_OUT)
360 {
361 new_cmap = XCreateColormap (dp,
362 DefaultRootWindow (dp),
363 DefaultVisual (dp, XDefaultScreen (dp)),
364 AllocAll);
365 XStoreColors (dp, new_cmap, orig_colors, NUM_COLORS);
366 XGrabServer (dp);
367 XInstallColormap (dp, new_cmap);
368 fade_cmap = &new_cmap;
369 }
370 }
371 XSync (dp, False);
372
373 memcpy (curr_colors, orig_colors, NUM_COLORS * sizeof (XColor));
374 if (state == XFADE_OUT)
375 {
376 for (i = steps; i > 0; i--)
377 {
378 for (j = 0; j < NUM_COLORS; j++)
379 {
380 curr_colors[j].red =
381 orig_colors[j].red * i / steps;
382 curr_colors[j].green =
383 orig_colors[j].green * i / steps;
384 curr_colors[j].blue =
385 orig_colors[j].blue * i / steps;
386 }
387 XStoreColors (dp, *fade_cmap,
388 curr_colors, NUM_COLORS);
389 usleep (10);
390 XSync (dp, False);
391 }
392 }
393 else
394 {
395 for (i = 0; i < steps; i++)
396 {
397 for (j = 0; j < NUM_COLORS; j++)
398 {
399 curr_colors[j].red =
400 orig_colors[j].red * i / steps;
401 curr_colors[j].green =
402 orig_colors[j].green * i / steps;
403 curr_colors[j].blue =
404 orig_colors[j].blue * i / steps;
405 }
406 XStoreColors (dp, *fade_cmap,
407 curr_colors, NUM_COLORS);
408 usleep (10);
409 XSync (dp, False);
410 }
411 }
412
413 if (state == XFADE_IN)
414 {
415 /* Restore the original colormap */
416 if (useprivate)
417 {
418 XStoreColors (dp, colormap,
419 orig_colors, NUM_COLORS);
420 }
421 else
422 {
423 XInstallColormap (dp, colormap);
424 XUngrabServer (dp);
425 XFreeColormap (dp, *fade_cmap);
426 }
427 XSync (dp, False);
428 }
429 nopause = 0;
430 }
431 void
fadeout()432 fadeout ()
433 {
434 if (!fadedout)
435 {
436 Fade (30);
437 fadedout = 1;
438 tbreak = 1;
439 }
440 }
441 void
fadein()442 fadein ()
443 {
444 if (fadedout)
445 {
446 Fade (30);
447 fadedout = 0;
448 tbreak = 1;
449 }
450 }
451 void
fadein1()452 fadein1 () /*better for star background */
453 {
454 if (fadedout)
455 {
456 Fade (30);
457 fadedout = 0;
458 tbreak = 1;
459 }
460 }
461