source: libcaca/trunk/examples/aafire.c @ 524

Last change on this file since 524 was 524, checked in by Sam Hocevar, 15 years ago

A new low-level text management library (canvas for ultrafast compositing

of unicode letters) is now separated from the higher level rendering and I/O
(that is, libcaca). This commit totally breaks the API, but once everything
is polished I will think about source-level backward compatibility. Most
drivers are broken, but X11 still sorta works.

The new design is much more object-oriented and allows having several

active renderers at the same time, changing renderers on the fly, and more
important, having no renderer at all (useful for converters, or when you
want to do your own renderer).

And in case you are still wondering, the libcucul acronym has "Unicode"

because I want to support at least a subset of Unicode. There are awesome
glyphs in it, including the ones inherited from Codepage 437 such as
"gray 25%" that are used in DOS and Win32 ANSI art.

  • Property svn:keywords set to Id
File size: 8.4 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 524 2006-03-05 18:43:13Z 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#include <stdio.h>
28#include <stdlib.h>
29#include <string.h>
30#include "caca.h"
31#else
32#include <stdio.h>
33#include "aalib.h"
34
35#define XSIZ aa_imgwidth(context)
36#define YSIZ (aa_imgheight(context)-4)
37#endif
38#define MAXTABLE (256*5)
39#ifdef LIBCACA
40static cucul_t *qq;
41static caca_t *kk;
42static int XSIZ, YSIZ;
43static struct cucul_bitmap *cucul_bitmap;
44static char *bitmap;
45static int pause = 0;
46#else
47static aa_context *context;
48static aa_renderparams *params;
49static aa_palette palette;
50#endif
51static unsigned int table[MAXTABLE];
52#ifdef LIBCACA
53static int const pal[] =
54#else
55__AA_CONST static int pal[] =
56#endif
57{
58  0, 0, 0, 0, 0, 6, 0, 0, 6, 0, 0, 7, 0, 0, 8, 0, 0, 8, 0, 0, 9, 0, 0, 10,
592, 0, 10, 4, 0, 9, 6, 0, 9, 8, 0, 8, 10, 0, 7, 12, 0, 7, 14, 0, 6, 16, 0, 5,
60  18, 0, 5, 20, 0, 4, 22, 0, 4, 24, 0, 3, 26, 0, 2, 28, 0, 2, 30, 0, 1, 32, 0, 0,
61  32, 0, 0, 33, 0, 0, 34, 0, 0, 35, 0, 0, 36, 0, 0, 36, 0, 0, 37, 0, 0, 38, 0, 0,
62  39, 0, 0, 40, 0, 0, 40, 0, 0, 41, 0, 0, 42, 0, 0, 43, 0, 0, 44, 0, 0, 45, 0, 0,
63  46, 1, 0, 47, 1, 0, 48, 2, 0, 49, 2, 0, 50, 3, 0, 51, 3, 0, 52, 4, 0, 53, 4, 0,
64  54, 5, 0, 55, 5, 0, 56, 6, 0, 57, 6, 0, 58, 7, 0, 59, 7, 0, 60, 8, 0, 61, 8, 0,
65  63, 9, 0, 63, 9, 0, 63, 10, 0, 63, 10, 0, 63, 11, 0, 63, 11, 0, 63, 12, 0, 63, 12, 0,
66  63, 13, 0, 63, 13, 0, 63, 14, 0, 63, 14, 0, 63, 15, 0, 63, 15, 0, 63, 16, 0, 63, 16, 0,
67  63, 17, 0, 63, 17, 0, 63, 18, 0, 63, 18, 0, 63, 19, 0, 63, 19, 0, 63, 20, 0, 63, 20, 0,
68  63, 21, 0, 63, 21, 0, 63, 22, 0, 63, 22, 0, 63, 23, 0, 63, 24, 0, 63, 24, 0, 63, 25, 0,
69  63, 25, 0, 63, 26, 0, 63, 26, 0, 63, 27, 0, 63, 27, 0, 63, 28, 0, 63, 28, 0, 63, 29, 0,
70  63, 29, 0, 63, 30, 0, 63, 30, 0, 63, 31, 0, 63, 31, 0, 63, 32, 0, 63, 32, 0, 63, 33, 0,
71  63, 33, 0, 63, 34, 0, 63, 34, 0, 63, 35, 0, 63, 35, 0, 63, 36, 0, 63, 36, 0, 63, 37, 0,
72  63, 38, 0, 63, 38, 0, 63, 39, 0, 63, 39, 0, 63, 40, 0, 63, 40, 0, 63, 41, 0, 63, 41, 0,
73  63, 42, 0, 63, 42, 0, 63, 43, 0, 63, 43, 0, 63, 44, 0, 63, 44, 0, 63, 45, 0, 63, 45, 0,
74  63, 46, 0, 63, 46, 0, 63, 47, 0, 63, 47, 0, 63, 48, 0, 63, 48, 0, 63, 49, 0, 63, 49, 0,
75  63, 50, 0, 63, 50, 0, 63, 51, 0, 63, 52, 0, 63, 52, 0, 63, 52, 0, 63, 52, 0, 63, 52, 0,
76  63, 53, 0, 63, 53, 0, 63, 53, 0, 63, 53, 0, 63, 54, 0, 63, 54, 0, 63, 54, 0, 63, 54, 0,
77  63, 54, 0, 63, 55, 0, 63, 55, 0, 63, 55, 0, 63, 55, 0, 63, 56, 0, 63, 56, 0, 63, 56, 0,
78  63, 56, 0, 63, 57, 0, 63, 57, 0, 63, 57, 0, 63, 57, 0, 63, 57, 0, 63, 58, 0, 63, 58, 0,
79  63, 58, 0, 63, 58, 0, 63, 59, 0, 63, 59, 0, 63, 59, 0, 63, 59, 0, 63, 60, 0, 63, 60, 0,
80  63, 60, 0, 63, 60, 0, 63, 60, 0, 63, 61, 0, 63, 61, 0, 63, 61, 0, 63, 61, 0, 63, 62, 0,
81  63, 62, 0, 63, 62, 0, 63, 62, 0, 63, 63, 0, 63, 63, 1, 63, 63, 2, 63, 63, 3, 63, 63, 4,
82  63, 63, 5, 63, 63, 6, 63, 63, 7, 63, 63, 8, 63, 63, 9, 63, 63, 10, 63, 63, 10, 63, 63, 11,
83  63, 63, 12, 63, 63, 13, 63, 63, 14, 63, 63, 15, 63, 63, 16, 63, 63, 17, 63, 63, 18, 63, 63, 19,
84  63, 63, 20, 63, 63, 21, 63, 63, 21, 63, 63, 22, 63, 63, 23, 63, 63, 24, 63, 63, 25, 63, 63, 26,
85  63, 63, 27, 63, 63, 28, 63, 63, 29, 63, 63, 30, 63, 63, 31, 63, 63, 31, 63, 63, 32, 63, 63, 33,
86  63, 63, 34, 63, 63, 35, 63, 63, 36, 63, 63, 37, 63, 63, 38, 63, 63, 39, 63, 63, 40, 63, 63, 41,
87  63, 63, 42, 63, 63, 42, 63, 63, 43, 63, 63, 44, 63, 63, 45, 63, 63, 46, 63, 63, 47, 63, 63, 48,
88  63, 63, 49, 63, 63, 50, 63, 63, 51, 63, 63, 52, 63, 63, 52, 63, 63, 53, 63, 63, 54, 63, 63, 55,
89  63, 63, 56, 63, 63, 57, 63, 63, 58, 63, 63, 59, 63, 63, 60, 63, 63, 61, 63, 63, 62, 63, 63, 63};
90
91
92static void
93initialize (void)
94{
95  int i;
96#ifdef LIBCACA
97  unsigned int r[256], g[256], b[256], a[256];
98#endif
99
100#ifdef LIBCACA
101  qq = cucul_init();
102  if (!qq)
103    {
104      printf ("Failed to initialize libcucul\n");
105      exit (1);
106    }
107  kk = caca_attach(qq);
108  if (!kk)
109    {
110      printf ("Failed to initialize libcaca\n");
111      exit (1);
112    }
113  caca_set_delay(kk, 10000);
114  XSIZ = cucul_get_width(qq) * 2;
115  YSIZ = cucul_get_height(qq) * 2 - 4;
116#else
117  context = aa_autoinit (&aa_defparams);
118  if (context == NULL)
119    {
120      printf ("Failed to initialize aalib\n");
121      exit (1);
122    }
123  aa_autoinitkbd (context, 0);
124  params = aa_getrenderparams ();
125#endif
126
127  for (i = 0; i < 256; i++)
128#ifdef LIBCACA
129  {
130    r[i] = pal[i * 3] * 64;
131    g[i] = pal[i * 3 + 1] * 64;
132    b[i] = pal[i * 3 + 2] * 64;
133    a[i] = 0xfff;
134  }
135#else
136    aa_setpalette (palette, i, pal[i * 3] * 4,
137                   pal[i * 3 + 1] * 4, pal[i * 3 + 2] * 4);
138#endif
139
140#ifdef LIBCACA
141  cucul_bitmap = cucul_create_bitmap(qq, 8, XSIZ, YSIZ - 2, XSIZ, 0, 0, 0, 0);
142  cucul_set_bitmap_palette(qq, cucul_bitmap, r, g, b, a);
143  bitmap = malloc(4 * cucul_get_width(qq) * cucul_get_height(qq) * sizeof(char));
144  memset(bitmap, 0, 4 * cucul_get_width(qq) * cucul_get_height(qq));
145#else
146  aa_hidecursor (context);
147#endif
148}
149static void
150uninitialize (void)
151{
152#ifdef LIBCACA
153  caca_detach(kk);
154  cucul_end(qq);
155#else
156  aa_close (context);
157#endif
158  exit (0);
159}
160static void
161gentable (void)
162{
163  unsigned int i, p2;
164  unsigned int minus = 800 / YSIZ;
165  if (minus == 0)
166    minus = 1;
167  for (i = 0; i < MAXTABLE; i++)
168    {
169      if (i > minus)
170        {
171          p2 = (i - minus) / 5;
172          table[i] = p2;
173        }
174      else
175        table[i] = 0;
176    }
177}
178
179#define MA 5
180static void
181firemain (void)
182{
183  register unsigned int i;
184  unsigned char *p;
185#ifndef LIBCACA
186  char *bitmap = aa_image (context);
187#endif
188  i = 0;
189#define END (bitmap + XSIZ * YSIZ)
190  for (p = (unsigned char*)bitmap;
191       (char*)p <= (( char *) (END));
192       p += 1)
193    {
194      *p = table[(*(p + XSIZ - 1) + *(p + XSIZ + 1) + *(p + XSIZ)) +
195                 (*(p + 2 * XSIZ - 1) + *(p + 2 * XSIZ + 1))];
196    }
197}
198
199#define min(x,y) ((x)<(y)?(x):(y))
200static void
201drawfire (void)
202{
203  unsigned int i, last1, i1, i2;
204  static int loop = 0, sloop = 0;
205  static unsigned int height = 0;
206  register unsigned char *p;
207#ifndef LIBCACA
208  char *bitmap = aa_image (context);
209#else
210  if(pause)
211    goto paused;
212#endif
213
214  height++;
215  loop--;
216  if (loop < 0)
217    loop = rand () % 3, sloop++;;
218  i1 = 1;
219  i2 = 4 * XSIZ + 1;
220  for (p = (unsigned char *) bitmap + XSIZ * (YSIZ + 0);
221       p < ((unsigned char *) bitmap + XSIZ * (YSIZ + 1));
222       p++, i1 += 4, i2 -= 4)
223    {
224      last1 = rand () % min (i1, min (i2, height));
225      i = rand () % 6;
226      for (; p < (unsigned char *) bitmap + XSIZ * (YSIZ + 1) && i != 0;
227           p++, i--, i1 += 4, i2 -= 4)
228        *p = last1, last1 += rand () % 6 - 2, *(p + XSIZ) = last1, last1 +=
229          rand () % 6 - 2;
230      *(p + 2 * XSIZ) = last1, last1 += rand () % 6 - 2;
231    }
232  i = 0;
233  firemain ();
234#ifdef LIBCACA
235paused:
236  cucul_draw_bitmap(qq, 0, 0,
237                    cucul_get_width(qq) - 1, cucul_get_height(qq) - 1,
238                    cucul_bitmap, bitmap);
239  caca_refresh(kk);
240  /*XSIZ = caca_get_width() * 2;
241  YSIZ = caca_get_height() * 2 - 4;*/
242#else
243  aa_renderpalette (context, palette, params, 0, 0, aa_scrwidth (context),
244                    aa_scrheight (context));
245  aa_flush (context);
246#endif
247}
248static void
249game (void)
250{
251#ifndef LIBCACA
252  int event;
253#endif
254  gentable ();
255#ifdef LIBCACA
256  for(;;)
257#else
258  while (!(event = aa_getevent (context, 0)) || event == AA_RESIZE)
259#endif
260    {
261#ifdef LIBCACA
262      switch (caca_get_event(kk, CACA_EVENT_KEY_PRESS))
263        {
264          case CACA_EVENT_KEY_PRESS | CACA_KEY_ESCAPE: return;
265          case CACA_EVENT_KEY_PRESS | ' ': pause = !pause;
266        }
267
268#endif
269      drawfire ();
270    }
271}
272int
273main (int argc, char **argv)
274{
275#ifndef LIBCACA
276  if (!aa_parseoptions (NULL, NULL, &argc, argv) || argc != 1)
277    {
278      printf ("%s", aa_help);
279      exit (1);
280    }
281#endif
282  initialize ();
283#ifndef LIBCACA
284  aa_resizehandler (context, (void *) aa_resize);
285#endif
286  game ();
287  uninitialize ();
288  return 1;
289}
Note: See TracBrowser for help on using the repository browser.