source: libcaca/trunk/src/aafire.c @ 2821

Last change on this file since 2821 was 2821, checked in by Sam Hocevar, 11 years ago

Starting refactoring to get rid of libcucul. The initial reason for the
split is rendered moot by the plugin system: when enabled, binaries do
not link directly with libX11 or libGL. I hope this is a step towards
more consisteny and clarity.

  • Property svn:keywords set to Id
File size: 9.0 KB
Line 
1/*
2 *  cacafire      fire demo for libcaca
3 *  Copyright (c) 2003 Sam Hocevar <sam@zoy.org>
4 *                1998, 1999, 2001 Jan Hubicka <hubicka@freesoft.cz>
5 *                All Rights Reserved
6 *
7 *  $Id: aafire.c 2821 2008-09-27 13:12:46Z sam $
8 *
9 *  This program is free software; you can redistribute it and/or
10 *  modify it under the terms of the GNU Lesser General Public
11 *  License as published by the Free Software Foundation; either
12 *  version 2 of the License, or (at your option) any later version.
13 *
14 *  This program is distributed in the hope that it will be useful,
15 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17 *  Lesser General Public License for more details.
18 *
19 *  You should have received a copy of the GNU Lesser General Public
20 *  License along with this program; if not, write to the Free Software
21 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
22 *  02111-1307  USA
23 */
24
25#ifdef LIBCACA
26#include "config.h"
27#if !defined(__KERNEL__)
28#   include <stdio.h>
29#   include <stdlib.h>
30#   include <string.h>
31#endif
32#include "caca.h"
33#else
34#include <stdio.h>
35#include "aalib.h"
36
37#define XSIZ aa_imgwidth(context)
38#define YSIZ (aa_imgheight(context)-4)
39#endif
40#define MAXTABLE (256*5)
41#ifdef LIBCACA
42static caca_canvas_t *cv;
43static caca_display_t *dp;
44static int XSIZ, YSIZ;
45static caca_dither_t *caca_dither;
46static char *bitmap;
47static int paused = 0;
48#else
49static aa_context *context;
50static aa_renderparams *params;
51static aa_palette palette;
52#endif
53static unsigned int table[MAXTABLE];
54#ifdef LIBCACA
55static int const pal[] =
56#else
57__AA_CONST static int pal[] =
58#endif
59{
60  0, 0, 0, 0, 0, 6, 0, 0, 6, 0, 0, 7, 0, 0, 8, 0, 0, 8, 0, 0, 9, 0, 0, 10,
612, 0, 10, 4, 0, 9, 6, 0, 9, 8, 0, 8, 10, 0, 7, 12, 0, 7, 14, 0, 6, 16, 0, 5,
62  18, 0, 5, 20, 0, 4, 22, 0, 4, 24, 0, 3, 26, 0, 2, 28, 0, 2, 30, 0, 1, 32, 0, 0,
63  32, 0, 0, 33, 0, 0, 34, 0, 0, 35, 0, 0, 36, 0, 0, 36, 0, 0, 37, 0, 0, 38, 0, 0,
64  39, 0, 0, 40, 0, 0, 40, 0, 0, 41, 0, 0, 42, 0, 0, 43, 0, 0, 44, 0, 0, 45, 0, 0,
65  46, 1, 0, 47, 1, 0, 48, 2, 0, 49, 2, 0, 50, 3, 0, 51, 3, 0, 52, 4, 0, 53, 4, 0,
66  54, 5, 0, 55, 5, 0, 56, 6, 0, 57, 6, 0, 58, 7, 0, 59, 7, 0, 60, 8, 0, 61, 8, 0,
67  63, 9, 0, 63, 9, 0, 63, 10, 0, 63, 10, 0, 63, 11, 0, 63, 11, 0, 63, 12, 0, 63, 12, 0,
68  63, 13, 0, 63, 13, 0, 63, 14, 0, 63, 14, 0, 63, 15, 0, 63, 15, 0, 63, 16, 0, 63, 16, 0,
69  63, 17, 0, 63, 17, 0, 63, 18, 0, 63, 18, 0, 63, 19, 0, 63, 19, 0, 63, 20, 0, 63, 20, 0,
70  63, 21, 0, 63, 21, 0, 63, 22, 0, 63, 22, 0, 63, 23, 0, 63, 24, 0, 63, 24, 0, 63, 25, 0,
71  63, 25, 0, 63, 26, 0, 63, 26, 0, 63, 27, 0, 63, 27, 0, 63, 28, 0, 63, 28, 0, 63, 29, 0,
72  63, 29, 0, 63, 30, 0, 63, 30, 0, 63, 31, 0, 63, 31, 0, 63, 32, 0, 63, 32, 0, 63, 33, 0,
73  63, 33, 0, 63, 34, 0, 63, 34, 0, 63, 35, 0, 63, 35, 0, 63, 36, 0, 63, 36, 0, 63, 37, 0,
74  63, 38, 0, 63, 38, 0, 63, 39, 0, 63, 39, 0, 63, 40, 0, 63, 40, 0, 63, 41, 0, 63, 41, 0,
75  63, 42, 0, 63, 42, 0, 63, 43, 0, 63, 43, 0, 63, 44, 0, 63, 44, 0, 63, 45, 0, 63, 45, 0,
76  63, 46, 0, 63, 46, 0, 63, 47, 0, 63, 47, 0, 63, 48, 0, 63, 48, 0, 63, 49, 0, 63, 49, 0,
77  63, 50, 0, 63, 50, 0, 63, 51, 0, 63, 52, 0, 63, 52, 0, 63, 52, 0, 63, 52, 0, 63, 52, 0,
78  63, 53, 0, 63, 53, 0, 63, 53, 0, 63, 53, 0, 63, 54, 0, 63, 54, 0, 63, 54, 0, 63, 54, 0,
79  63, 54, 0, 63, 55, 0, 63, 55, 0, 63, 55, 0, 63, 55, 0, 63, 56, 0, 63, 56, 0, 63, 56, 0,
80  63, 56, 0, 63, 57, 0, 63, 57, 0, 63, 57, 0, 63, 57, 0, 63, 57, 0, 63, 58, 0, 63, 58, 0,
81  63, 58, 0, 63, 58, 0, 63, 59, 0, 63, 59, 0, 63, 59, 0, 63, 59, 0, 63, 60, 0, 63, 60, 0,
82  63, 60, 0, 63, 60, 0, 63, 60, 0, 63, 61, 0, 63, 61, 0, 63, 61, 0, 63, 61, 0, 63, 62, 0,
83  63, 62, 0, 63, 62, 0, 63, 62, 0, 63, 63, 0, 63, 63, 1, 63, 63, 2, 63, 63, 3, 63, 63, 4,
84  63, 63, 5, 63, 63, 6, 63, 63, 7, 63, 63, 8, 63, 63, 9, 63, 63, 10, 63, 63, 10, 63, 63, 11,
85  63, 63, 12, 63, 63, 13, 63, 63, 14, 63, 63, 15, 63, 63, 16, 63, 63, 17, 63, 63, 18, 63, 63, 19,
86  63, 63, 20, 63, 63, 21, 63, 63, 21, 63, 63, 22, 63, 63, 23, 63, 63, 24, 63, 63, 25, 63, 63, 26,
87  63, 63, 27, 63, 63, 28, 63, 63, 29, 63, 63, 30, 63, 63, 31, 63, 63, 31, 63, 63, 32, 63, 63, 33,
88  63, 63, 34, 63, 63, 35, 63, 63, 36, 63, 63, 37, 63, 63, 38, 63, 63, 39, 63, 63, 40, 63, 63, 41,
89  63, 63, 42, 63, 63, 42, 63, 63, 43, 63, 63, 44, 63, 63, 45, 63, 63, 46, 63, 63, 47, 63, 63, 48,
90  63, 63, 49, 63, 63, 50, 63, 63, 51, 63, 63, 52, 63, 63, 52, 63, 63, 53, 63, 63, 54, 63, 63, 55,
91  63, 63, 56, 63, 63, 57, 63, 63, 58, 63, 63, 59, 63, 63, 60, 63, 63, 61, 63, 63, 62, 63, 63, 63};
92
93
94static void
95initialize (void)
96{
97  int i;
98#ifdef LIBCACA
99  unsigned int r[256], g[256], b[256], a[256];
100#endif
101
102#ifdef LIBCACA
103  cv = caca_create_canvas(80, 32);
104  if (!cv)
105    {
106      printf ("Failed to initialize libcaca\n");
107      exit (1);
108    }
109  dp = caca_create_display(cv);
110  if (!dp)
111    {
112      printf ("Failed to initialize libcaca\n");
113      exit (1);
114    }
115  caca_set_display_time(dp, 10000);
116  XSIZ = caca_get_canvas_width(cv) * 2;
117  YSIZ = caca_get_canvas_height(cv) * 2 - 4;
118#else
119  context = aa_autoinit (&aa_defparams);
120  if (context == NULL)
121    {
122      printf ("Failed to initialize aalib\n");
123      exit (1);
124    }
125  aa_autoinitkbd (context, 0);
126  params = aa_getrenderparams ();
127#endif
128
129  for (i = 0; i < 256; i++)
130#ifdef LIBCACA
131  {
132    r[i] = pal[i * 3] * 64;
133    g[i] = pal[i * 3 + 1] * 64;
134    b[i] = pal[i * 3 + 2] * 64;
135    a[i] = 0xfff;
136  }
137#else
138    aa_setpalette (palette, i, pal[i * 3] * 4,
139                   pal[i * 3 + 1] * 4, pal[i * 3 + 2] * 4);
140#endif
141
142#ifdef LIBCACA
143  caca_dither = caca_create_dither(8, XSIZ, YSIZ - 2, XSIZ, 0, 0, 0, 0);
144  caca_set_dither_palette(caca_dither, r, g, b, a);
145  bitmap = malloc(4 * caca_get_canvas_width(cv)
146                    * caca_get_canvas_height(cv));
147  memset(bitmap, 0, 4 * caca_get_canvas_width(cv)
148                      * caca_get_canvas_height(cv));
149#else
150  aa_hidecursor (context);
151#endif
152}
153static void
154uninitialize (void)
155{
156#ifdef LIBCACA
157  caca_free_display(dp);
158  caca_free_canvas(cv);
159#else
160  aa_close (context);
161#endif
162  exit (0);
163}
164static void
165gentable (void)
166{
167  unsigned int i, p2;
168  unsigned int minus = 800 / YSIZ;
169  if (minus == 0)
170    minus = 1;
171  for (i = 0; i < MAXTABLE; i++)
172    {
173      if (i > minus)
174        {
175          p2 = (i - minus) / 5;
176          table[i] = p2;
177        }
178      else
179        table[i] = 0;
180    }
181}
182
183#define MA 5
184static void
185firemain (void)
186{
187  register unsigned int i;
188  unsigned char *p;
189#ifndef LIBCACA
190  char *bitmap = aa_image (context);
191#endif
192  i = 0;
193#define END (bitmap + XSIZ * YSIZ)
194  for (p = (unsigned char*)bitmap;
195       (char*)p <= (( char *) (END));
196       p += 1)
197    {
198      *p = table[(*(p + XSIZ - 1) + *(p + XSIZ + 1) + *(p + XSIZ)) +
199                 (*(p + 2 * XSIZ - 1) + *(p + 2 * XSIZ + 1))];
200    }
201}
202
203#define min(x,y) ((x)<(y)?(x):(y))
204static void
205drawfire (void)
206{
207  unsigned int i, last1, i1, i2;
208  static int loop = 0, sloop = 0;
209  static unsigned int height = 0;
210  register unsigned char *p;
211#ifndef LIBCACA
212  char *bitmap = aa_image (context);
213#else
214  if(paused)
215    goto _paused;
216#endif
217
218  height++;
219  loop--;
220  if (loop < 0)
221    loop = rand () % 3, sloop++;;
222  i1 = 1;
223  i2 = 4 * XSIZ + 1;
224  for (p = (unsigned char *) bitmap + XSIZ * (YSIZ + 0);
225       p < ((unsigned char *) bitmap + XSIZ * (YSIZ + 1));
226       p++, i1 += 4, i2 -= 4)
227    {
228      last1 = rand () % min (i1, min (i2, height));
229      i = rand () % 6;
230      for (; p < (unsigned char *) bitmap + XSIZ * (YSIZ + 1) && i != 0;
231           p++, i--, i1 += 4, i2 -= 4)
232        *p = last1, last1 += rand () % 6 - 2, *(p + XSIZ) = last1, last1 +=
233          rand () % 6 - 2;
234      *(p + 2 * XSIZ) = last1, last1 += rand () % 6 - 2;
235    }
236  i = 0;
237  firemain ();
238#ifdef LIBCACA
239_paused:
240  caca_dither_bitmap(cv, 0, 0, caca_get_canvas_width(cv),
241                      caca_get_canvas_height(cv), caca_dither, bitmap);
242  caca_set_color_ansi(cv, CACA_WHITE, CACA_BLUE);
243  if (sloop < 100)
244    caca_put_str(cv, caca_get_canvas_width(cv) - 30,
245                  caca_get_canvas_height(cv) - 2,
246                  " -=[ Powered by libcaca ]=- ");
247 
248  caca_refresh_display(dp);
249  /*XSIZ = caca_get_width() * 2;
250  YSIZ = caca_get_height() * 2 - 4;*/
251#else
252  aa_renderpalette (context, palette, params, 0, 0, aa_scrwidth (context),
253                    aa_scrheight (context));
254  aa_flush (context);
255#endif
256}
257static void
258game (void)
259{
260#ifndef LIBCACA
261  int event;
262#endif
263  gentable ();
264#ifdef LIBCACA
265  for(;;)
266#else
267  while (!(event = aa_getevent (context, 0)) || event == AA_RESIZE)
268#endif
269    {
270#ifdef LIBCACA
271      caca_event_t ev;
272      if(caca_get_event(dp, CACA_EVENT_KEY_PRESS|CACA_EVENT_QUIT, &ev, 0))
273        {
274          if (caca_get_event_type(&ev) & CACA_EVENT_QUIT)
275            return;
276          switch(caca_get_event_key_ch(&ev))
277            {
278                case CACA_KEY_CTRL_C:
279                case CACA_KEY_CTRL_Z:
280                case CACA_KEY_ESCAPE: return;
281                case ' ': paused = !paused;
282            }
283        }
284#endif
285      drawfire ();
286    }
287}
288int
289main (int argc, char **argv)
290{
291#ifndef LIBCACA
292  if (!aa_parseoptions (NULL, NULL, &argc, argv) || argc != 1)
293    {
294      printf ("%s", aa_help);
295      exit (1);
296    }
297#endif
298  initialize ();
299#ifndef LIBCACA
300  aa_resizehandler (context, (void *) aa_resize);
301#endif
302  game ();
303  uninitialize ();
304  return 1;
305}
Note: See TracBrowser for help on using the repository browser.