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