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

Last change on this file since 704 was 704, checked in by Jean-Yves Lamoureux, 15 years ago
  • Added "powered by libcaca" text to all examples for consistency
  • Property svn:keywords set to Id
File size: 8.7 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 704 2006-03-27 21:40:17Z jylam $
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 cucul_t *qq;
43static caca_t *kk;
44static int XSIZ, YSIZ;
45static struct cucul_bitmap *cucul_bitmap;
46static char *bitmap;
47static int pause = 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  qq = cucul_create(80, 32);
104  if (!qq)
105    {
106      printf ("Failed to initialize libcucul\n");
107      exit (1);
108    }
109  kk = caca_attach(qq);
110  if (!kk)
111    {
112      printf ("Failed to initialize libcaca\n");
113      exit (1);
114    }
115  caca_set_delay(kk, 10000);
116  XSIZ = cucul_get_width(qq) * 2;
117  YSIZ = cucul_get_height(qq) * 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  cucul_bitmap = cucul_create_bitmap(8, XSIZ, YSIZ - 2, XSIZ, 0, 0, 0, 0);
144  cucul_set_bitmap_palette(cucul_bitmap, r, g, b, a);
145  bitmap = malloc(4 * cucul_get_width(qq) * cucul_get_height(qq) * sizeof(char));
146  memset(bitmap, 0, 4 * cucul_get_width(qq) * cucul_get_height(qq));
147#else
148  aa_hidecursor (context);
149#endif
150}
151static void
152uninitialize (void)
153{
154#ifdef LIBCACA
155  caca_detach(kk);
156  cucul_free(qq);
157#else
158  aa_close (context);
159#endif
160  exit (0);
161}
162static void
163gentable (void)
164{
165  unsigned int i, p2;
166  unsigned int minus = 800 / YSIZ;
167  if (minus == 0)
168    minus = 1;
169  for (i = 0; i < MAXTABLE; i++)
170    {
171      if (i > minus)
172        {
173          p2 = (i - minus) / 5;
174          table[i] = p2;
175        }
176      else
177        table[i] = 0;
178    }
179}
180
181#define MA 5
182static void
183firemain (void)
184{
185  register unsigned int i;
186  unsigned char *p;
187#ifndef LIBCACA
188  char *bitmap = aa_image (context);
189#endif
190  i = 0;
191#define END (bitmap + XSIZ * YSIZ)
192  for (p = (unsigned char*)bitmap;
193       (char*)p <= (( char *) (END));
194       p += 1)
195    {
196      *p = table[(*(p + XSIZ - 1) + *(p + XSIZ + 1) + *(p + XSIZ)) +
197                 (*(p + 2 * XSIZ - 1) + *(p + 2 * XSIZ + 1))];
198    }
199}
200
201#define min(x,y) ((x)<(y)?(x):(y))
202static void
203drawfire (void)
204{
205  unsigned int i, last1, i1, i2;
206  static int loop = 0, sloop = 0;
207  static unsigned int height = 0;
208  register unsigned char *p;
209#ifndef LIBCACA
210  char *bitmap = aa_image (context);
211#else
212  if(pause)
213    goto paused;
214#endif
215
216  height++;
217  loop--;
218  if (loop < 0)
219    loop = rand () % 3, sloop++;;
220  i1 = 1;
221  i2 = 4 * XSIZ + 1;
222  for (p = (unsigned char *) bitmap + XSIZ * (YSIZ + 0);
223       p < ((unsigned char *) bitmap + XSIZ * (YSIZ + 1));
224       p++, i1 += 4, i2 -= 4)
225    {
226      last1 = rand () % min (i1, min (i2, height));
227      i = rand () % 6;
228      for (; p < (unsigned char *) bitmap + XSIZ * (YSIZ + 1) && i != 0;
229           p++, i--, i1 += 4, i2 -= 4)
230        *p = last1, last1 += rand () % 6 - 2, *(p + XSIZ) = last1, last1 +=
231          rand () % 6 - 2;
232      *(p + 2 * XSIZ) = last1, last1 += rand () % 6 - 2;
233    }
234  i = 0;
235  firemain ();
236#ifdef LIBCACA
237paused:
238  cucul_draw_bitmap(qq, 0, 0,
239                    cucul_get_width(qq) - 1, cucul_get_height(qq) - 1,
240                    cucul_bitmap, bitmap);
241  cucul_set_color(qq, CUCUL_COLOR_WHITE, CUCUL_COLOR_BLUE);
242  cucul_putstr(qq, cucul_get_width(qq) - 30, cucul_get_height(qq) - 2,
243               " -=[ Powered by libcaca ]=- ");
244 
245  caca_display(kk);
246  /*XSIZ = caca_get_width() * 2;
247  YSIZ = caca_get_height() * 2 - 4;*/
248#else
249  aa_renderpalette (context, palette, params, 0, 0, aa_scrwidth (context),
250                    aa_scrheight (context));
251  aa_flush (context);
252#endif
253}
254static void
255game (void)
256{
257#ifndef LIBCACA
258  int event;
259#endif
260  gentable ();
261#ifdef LIBCACA
262  for(;;)
263#else
264  while (!(event = aa_getevent (context, 0)) || event == AA_RESIZE)
265#endif
266    {
267#ifdef LIBCACA
268      struct caca_event ev;
269      if(caca_get_event(kk, CACA_EVENT_KEY_PRESS, &ev))
270        {
271          switch(ev.data.key.c)
272            {
273                case CACA_KEY_ESCAPE: return;
274                case ' ': pause = !pause;
275            }
276        }
277#endif
278      drawfire ();
279    }
280}
281int
282main (int argc, char **argv)
283{
284#ifndef LIBCACA
285  if (!aa_parseoptions (NULL, NULL, &argc, argv) || argc != 1)
286    {
287      printf ("%s", aa_help);
288      exit (1);
289    }
290#endif
291  initialize ();
292#ifndef LIBCACA
293  aa_resizehandler (context, (void *) aa_resize);
294#endif
295  game ();
296  uninitialize ();
297  return 1;
298}
Note: See TracBrowser for help on using the repository browser.