source: libcaca/trunk/test/demo.c @ 1347

Last change on this file since 1347 was 1347, checked in by Sam Hocevar, 14 years ago
  • Rename cucul_put*() into cucul_put_*(). Updated all code to reflect that.
  • Property svn:keywords set to Id
File size: 16.2 KB
Line 
1/*
2 *  demo          demo for libcaca
3 *  Copyright (c) 2003 Sam Hocevar <sam@zoy.org>
4 *                All Rights Reserved
5 *
6 *  $Id: demo.c 1347 2006-11-11 16:29:39Z sam $
7 *
8 *  This program is free software; you can redistribute it and/or
9 *  modify it under the terms of the Do What The Fuck You Want To
10 *  Public License, Version 2, as published by Sam Hocevar. See
11 *  http://sam.zoy.org/wtfpl/COPYING for more details.
12 */
13
14#include "config.h"
15#include "common.h"
16#if !defined(__KERNEL__)
17#   include <math.h>
18#   include <string.h>
19#   include <stdio.h>
20#endif
21#include "caca.h"
22
23static void display_menu(void);
24
25static void demo_all(void);
26
27static void demo_dots(void);
28static void demo_lines(void);
29static void demo_boxes(void);
30static void demo_ellipses(void);
31static void demo_triangles(void);
32/*static void demo_sprites(void);*/
33static void demo_render(void);
34
35int bounds = 0;
36int outline = 0;
37int dithering = 0;
38#if 0
39cucul_sprite_t *sprite = NULL;
40#endif
41
42cucul_canvas_t *cv;
43caca_display_t *dp;
44
45int main(int argc, char **argv)
46{
47    void (*demo)(void) = NULL;
48    int quit = 0;
49
50    cv = cucul_create_canvas(0, 0);
51    if(!cv)
52        return 1;
53    dp = caca_create_display(cv);
54    if(!dp)
55        return 1;
56
57    caca_set_display_time(dp, 40000);
58
59    /* Initialize data */
60#if 0
61    sprite = cucul_load_sprite(DATADIR "/caca.txt");
62    if(!sprite)
63        sprite = cucul_load_sprite("caca.txt");
64    if(!sprite)
65        sprite = cucul_load_sprite("examples/caca.txt");
66#endif
67
68    /* Disable cursor */
69    caca_set_mouse(dp, 0);
70
71    /* Main menu */
72    display_menu();
73    caca_refresh_display(dp);
74
75    /* Go ! */
76    while(!quit)
77    {
78        caca_event_t ev;
79        int menu = 0, mouse = 0, xmouse = 0, ymouse = 0;
80
81        while(caca_get_event(dp, CACA_EVENT_ANY, &ev, 0))
82        {
83            if(demo && (ev.type & CACA_EVENT_KEY_PRESS))
84            {
85                menu = 1;
86                demo = NULL;
87            }
88            else if(ev.type & CACA_EVENT_KEY_PRESS)
89            {
90                switch(ev.data.key.ch)
91                {
92                case 'q':
93                case 'Q':
94                    demo = NULL;
95                    quit = 1;
96                    break;
97                case 'o':
98                case 'O':
99                    outline = (outline + 1) % 3;
100                    display_menu();
101                    break;
102                case 'b':
103                case 'B':
104                    bounds = (bounds + 1) % 2;
105                    display_menu();
106                    break;
107#if 0
108                case 'd':
109                case 'D':
110                    dithering = (dithering + 1) % 5;
111                    cucul_set_feature(cv, dithering);
112                    display_menu();
113                    break;
114#endif
115                case 'f':
116                case 'F':
117                    demo = demo_all;
118                    break;
119                case '1':
120                    demo = demo_dots;
121                    break;
122                case '2':
123                    demo = demo_lines;
124                    break;
125                case '3':
126                    demo = demo_boxes;
127                    break;
128                case '4':
129                    demo = demo_triangles;
130                    break;
131                case '5':
132                    demo = demo_ellipses;
133                    break;
134#if 0
135                case 's':
136                case 'S':
137                    if(sprite)
138                        demo = demo_sprites;
139                    break;
140#endif
141                case 'r':
142                case 'R':
143                    demo = demo_render;
144                    break;
145                }
146
147                if(demo)
148                {
149                    cucul_set_color_ansi(cv, CUCUL_LIGHTGRAY, CUCUL_BLACK);
150                    cucul_clear_canvas(cv);
151                }
152            }
153            else if(ev.type & CACA_EVENT_MOUSE_MOTION)
154            {
155                mouse = 1;
156                xmouse = ev.data.mouse.x;
157                ymouse = ev.data.mouse.y;
158            }
159            else if(ev.type & CACA_EVENT_RESIZE)
160            {
161                mouse = 1; /* old hack */
162            }
163        }
164
165        if(menu || (mouse && !demo))
166        {
167            display_menu();
168            if(mouse && !demo)
169            {
170                cucul_set_color_ansi(cv, CUCUL_RED, CUCUL_BLACK);
171                cucul_put_str(cv, xmouse, ymouse,     ".");
172                cucul_put_str(cv, xmouse, ymouse + 1, "|\\");
173            }
174            caca_refresh_display(dp);
175            mouse = menu = 0;
176        }
177
178        if(demo)
179        {
180            demo();
181
182            cucul_set_color_ansi(cv, CUCUL_LIGHTGRAY, CUCUL_BLACK);
183            cucul_draw_thin_box(cv, 1, 1, cucul_get_canvas_width(cv) - 2,
184                                          cucul_get_canvas_height(cv) - 2);
185            cucul_printf(cv, 4, 1, "[%i.%i fps]----",
186                         1000000 / caca_get_display_time(dp),
187                         (10000000 / caca_get_display_time(dp)) % 10);
188            caca_refresh_display(dp);
189        }
190    }
191
192    /* Clean up */
193#if 0
194    cucul_free_sprite(sprite);
195#endif
196    caca_free_display(dp);
197    cucul_free_canvas(cv);
198
199    return 0;
200}
201
202static void display_menu(void)
203{
204    int xo = cucul_get_canvas_width(cv) - 2;
205    int yo = cucul_get_canvas_height(cv) - 2;
206
207    cucul_set_color_ansi(cv, CUCUL_LIGHTGRAY, CUCUL_BLACK);
208    cucul_clear_canvas(cv);
209    cucul_draw_thin_box(cv, 1, 1, xo, yo);
210
211    cucul_put_str(cv, (xo - strlen("libcaca demo")) / 2, 3, "libcaca demo");
212    cucul_put_str(cv, (xo - strlen("==============")) / 2, 4, "==============");
213
214    cucul_put_str(cv, 4, 6, "demos:");
215    cucul_put_str(cv, 4, 7, "'f': full");
216    cucul_put_str(cv, 4, 8, "'1': dots");
217    cucul_put_str(cv, 4, 9, "'2': lines");
218    cucul_put_str(cv, 4, 10, "'3': boxes");
219    cucul_put_str(cv, 4, 11, "'4': triangles");
220    cucul_put_str(cv, 4, 12, "'5': ellipses");
221    cucul_put_str(cv, 4, 13, "'c': colour");
222    cucul_put_str(cv, 4, 14, "'r': render");
223#if 0
224    if(sprite)
225        cucul_put_str(cv, 4, 15, "'s': sprites");
226#endif
227
228    cucul_put_str(cv, 4, 16, "settings:");
229    cucul_printf(cv, 4, 17, "'o': outline: %s",
230                 outline == 0 ? "none" : outline == 1 ? "solid" : "thin");
231    cucul_printf(cv, 4, 18, "'b': drawing boundaries: %s",
232                 bounds == 0 ? "screen" : "infinite");
233    //cucul_printf(cv, 4, 19, "'d': dithering (%s)",
234    //             cucul_get_feature_name(dithering));
235
236    cucul_put_str(cv, 4, yo - 2, "'q': quit");
237
238    caca_refresh_display(dp);
239}
240
241static void demo_all(void)
242{
243    static int i = 0;
244
245    int j, xo, yo, xa, ya, xb, yb, xc, yc;
246
247    i++;
248
249    cucul_set_color_ansi(cv, CUCUL_LIGHTGRAY, CUCUL_BLACK);
250    cucul_clear_canvas(cv);
251
252    /* Draw the sun */
253    cucul_set_color_ansi(cv, CUCUL_YELLOW, CUCUL_BLACK);
254    xo = cucul_get_canvas_width(cv) / 4;
255    yo = cucul_get_canvas_height(cv) / 4 + 5 * sin(0.03*i);
256
257    for(j = 0; j < 16; j++)
258    {
259        xa = xo - (30 + sin(0.03*i) * 8) * sin(0.03*i + M_PI*j/8);
260        ya = yo + (15 + sin(0.03*i) * 4) * cos(0.03*i + M_PI*j/8);
261        cucul_draw_thin_line(cv, xo, yo, xa, ya);
262    }
263
264    j = 15 + sin(0.03*i) * 8;
265    cucul_set_color_ansi(cv, CUCUL_WHITE, CUCUL_BLACK);
266    cucul_fill_ellipse(cv, xo, yo, j, j / 2, '#');
267    cucul_set_color_ansi(cv, CUCUL_YELLOW, CUCUL_BLACK);
268    cucul_draw_ellipse(cv, xo, yo, j, j / 2, '#');
269
270    /* Draw the pyramid */
271    xo = cucul_get_canvas_width(cv) * 5 / 8;
272    yo = 2;
273
274    xa = cucul_get_canvas_width(cv) / 8 + sin(0.03*i) * 5;
275    ya = cucul_get_canvas_height(cv) / 2 + cos(0.03*i) * 5;
276
277    xb = cucul_get_canvas_width(cv) - 10 - cos(0.02*i) * 10;
278    yb = cucul_get_canvas_height(cv) * 3 / 4 - 5 + sin(0.02*i) * 5;
279
280    xc = cucul_get_canvas_width(cv) / 4 - sin(0.02*i) * 5;
281    yc = cucul_get_canvas_height(cv) * 3 / 4 + cos(0.02*i) * 5;
282
283    cucul_set_color_ansi(cv, CUCUL_GREEN, CUCUL_BLACK);
284    cucul_fill_triangle(cv, xo, yo, xb, yb, xa, ya, '%');
285    cucul_set_color_ansi(cv, CUCUL_YELLOW, CUCUL_BLACK);
286    cucul_draw_thin_triangle(cv, xo, yo, xb, yb, xa, ya);
287
288    cucul_set_color_ansi(cv, CUCUL_RED, CUCUL_BLACK);
289    cucul_fill_triangle(cv, xa, ya, xb, yb, xc, yc, '#');
290    cucul_set_color_ansi(cv, CUCUL_YELLOW, CUCUL_BLACK);
291    cucul_draw_thin_triangle(cv, xa, ya, xb, yb, xc, yc);
292
293    cucul_set_color_ansi(cv, CUCUL_BLUE, CUCUL_BLACK);
294    cucul_fill_triangle(cv, xo, yo, xb, yb, xc, yc, '%');
295    cucul_set_color_ansi(cv, CUCUL_YELLOW, CUCUL_BLACK);
296    cucul_draw_thin_triangle(cv, xo, yo, xb, yb, xc, yc);
297
298    /* Draw a background triangle */
299    xa = 2;
300    ya = 2;
301
302    xb = cucul_get_canvas_width(cv) - 3;
303    yb = cucul_get_canvas_height(cv) / 2;
304
305    xc = cucul_get_canvas_width(cv) / 3;
306    yc = cucul_get_canvas_height(cv) - 3;
307
308    cucul_set_color_ansi(cv, CUCUL_CYAN, CUCUL_BLACK);
309    cucul_draw_thin_triangle(cv, xa, ya, xb, yb, xc, yc);
310
311    xo = cucul_get_canvas_width(cv) / 2 + cos(0.027*i) * cucul_get_canvas_width(cv) / 3;
312    yo = cucul_get_canvas_height(cv) / 2 - sin(0.027*i) * cucul_get_canvas_height(cv) / 2;
313
314    cucul_draw_thin_line(cv, xa, ya, xo, yo);
315    cucul_draw_thin_line(cv, xb, yb, xo, yo);
316    cucul_draw_thin_line(cv, xc, yc, xo, yo);
317
318    /* Draw a sprite on the pyramid */
319#if 0
320    cucul_draw_sprite(cv, xo, yo, sprite, 0);
321#endif
322
323    /* Draw a trail behind the foreground sprite */
324    for(j = i - 60; j < i; j++)
325    {
326        int delta = cucul_rand(-5, 6);
327        cucul_set_color_ansi(cv, cucul_rand(0, 16), cucul_rand(0, 16));
328        cucul_put_char(cv, cucul_get_canvas_width(cv) / 2
329                    + cos(0.02*j) * (delta + cucul_get_canvas_width(cv) / 4),
330                   cucul_get_canvas_height(cv) / 2
331                    + sin(0.02*j) * (delta + cucul_get_canvas_height(cv) / 3),
332                   '#');
333    }
334
335    /* Draw foreground sprite */
336#if 0
337    cucul_draw_sprite(cv, cucul_get_canvas_width(cv) / 2 + cos(0.02*i) * cucul_get_canvas_width(cv) / 4,
338                   cucul_get_canvas_height(cv) / 2 + sin(0.02*i) * cucul_get_canvas_height(cv) / 3,
339                   sprite, 0);
340#endif
341}
342
343static void demo_dots(void)
344{
345    int xmax = cucul_get_canvas_width(cv);
346    int ymax = cucul_get_canvas_height(cv);
347    int i;
348    static char chars[10] =
349    {
350        '+', '-', '*', '#', 'X', '@', '%', '$', 'M', 'W'
351    };
352
353    for(i = 1000; i--;)
354    {
355        /* Putpixel */
356        cucul_set_color_ansi(cv, cucul_rand(0, 16), cucul_rand(0, 16));
357        cucul_put_char(cv, cucul_rand(0, xmax), cucul_rand(0, ymax),
358                      chars[cucul_rand(0, 9)]);
359    }
360}
361
362static void demo_lines(void)
363{
364    int w = cucul_get_canvas_width(cv);
365    int h = cucul_get_canvas_height(cv);
366    int xa, ya, xb, yb;
367
368    if(bounds)
369    {
370        xa = cucul_rand(- w, 2 * w); ya = cucul_rand(- h, 2 * h);
371        xb = cucul_rand(- w, 2 * w); yb = cucul_rand(- h, 2 * h);
372    }
373    else
374    {
375        xa = cucul_rand(0, w); ya = cucul_rand(0, h);
376        xb = cucul_rand(0, w); yb = cucul_rand(0, h);
377    }
378
379    cucul_set_color_ansi(cv, cucul_rand(0, 16), CUCUL_BLACK);
380    if(outline > 1)
381        cucul_draw_thin_line(cv, xa, ya, xb, yb);
382    else
383        cucul_draw_line(cv, xa, ya, xb, yb, '#');
384}
385
386static void demo_boxes(void)
387{
388    int w = cucul_get_canvas_width(cv);
389    int h = cucul_get_canvas_height(cv);
390    int xa, ya, xb, yb;
391
392    if(bounds)
393    {
394        xa = cucul_rand(- w, 2 * w); ya = cucul_rand(- h, 2 * h);
395        xb = cucul_rand(- w, 2 * w); yb = cucul_rand(- h, 2 * h);
396    }
397    else
398    {
399        xa = cucul_rand(0, w); ya = cucul_rand(0, h);
400        xb = cucul_rand(0, w); yb = cucul_rand(0, h);
401    }
402
403    cucul_set_color_ansi(cv, cucul_rand(0, 16), cucul_rand(0, 16));
404    cucul_fill_box(cv, xa, ya, xb, yb, '#');
405
406    cucul_set_color_ansi(cv, cucul_rand(0, 16), CUCUL_BLACK);
407    if(outline == 2)
408        cucul_draw_thin_box(cv, xa, ya, xb, yb);
409    else if(outline == 1)
410        cucul_draw_box(cv, xa, ya, xb, yb, '#');
411}
412
413static void demo_ellipses(void)
414{
415    int w = cucul_get_canvas_width(cv);
416    int h = cucul_get_canvas_height(cv);
417    int x, y, a, b;
418
419    if(bounds)
420    {
421        x = cucul_rand(- w, 2 * w); y = cucul_rand(- h, 2 * h);
422        a = cucul_rand(0, w); b = cucul_rand(0, h);
423    }
424    else
425    {
426        do
427        {
428            x = cucul_rand(0, w); y = cucul_rand(0, h);
429            a = cucul_rand(0, w); b = cucul_rand(0, h);
430
431        } while(x - a < 0 || x + a >= w || y - b < 0 || y + b >= h);
432    }
433
434    cucul_set_color_ansi(cv, cucul_rand(0, 16), cucul_rand(0, 16));
435    cucul_fill_ellipse(cv, x, y, a, b, '#');
436
437    cucul_set_color_ansi(cv, cucul_rand(0, 16), CUCUL_BLACK);
438    if(outline == 2)
439        cucul_draw_thin_ellipse(cv, x, y, a, b);
440    else if(outline == 1)
441        cucul_draw_ellipse(cv, x, y, a, b, '#');
442}
443
444static void demo_triangles(void)
445{
446    int w = cucul_get_canvas_width(cv);
447    int h = cucul_get_canvas_height(cv);
448    int xa, ya, xb, yb, xc, yc;
449
450    if(bounds)
451    {
452        xa = cucul_rand(- w, 2 * w); ya = cucul_rand(- h, 2 * h);
453        xb = cucul_rand(- w, 2 * w); yb = cucul_rand(- h, 2 * h);
454        xc = cucul_rand(- w, 2 * w); yc = cucul_rand(- h, 2 * h);
455    }
456    else
457    {
458
459        xa = cucul_rand(0, w); ya = cucul_rand(0, h);
460        xb = cucul_rand(0, w); yb = cucul_rand(0, h);
461        xc = cucul_rand(0, w); yc = cucul_rand(0, h);
462    }
463
464    cucul_set_color_ansi(cv, cucul_rand(0, 16), cucul_rand(0, 16));
465    cucul_fill_triangle(cv, xa, ya, xb, yb, xc, yc, '#');
466
467    cucul_set_color_ansi(cv, cucul_rand(0, 16), CUCUL_BLACK);
468    if(outline == 2)
469        cucul_draw_thin_triangle(cv, xa, ya, xb, yb, xc, yc);
470    else if(outline == 1)
471        cucul_draw_triangle(cv, xa, ya, xb, yb, xc, yc, '#');
472}
473#if 0
474static void demo_sprites(void)
475{
476
477    cucul_draw_sprite(cv, cucul_rand(0, cucul_get_canvas_width(cv)),
478                      cucul_rand(0, cucul_get_canvas_height(cv)), sprite, 0);
479
480}
481#endif
482#if 0
483static void demo_render(void)
484{
485    cucul_dither_t *dither;
486    //short buffer[256*256];
487    //short *dest = buffer;
488    int buffer[256*256];
489    int *dest = buffer;
490    int x, y, z;
491    static int i = 0;
492
493    i = (i + 1) % 512;
494    z = i < 256 ? i : 511 - i;
495
496    for(x = 0; x < 256; x++)
497        for(y = 0; y < 256; y++)
498    {
499        //*dest++ = ((x >> 3) << 11) | ((y >> 2) << 5) | ((z >> 3));
500        *dest++ = (x << 16) | (y << 8) | (z);
501    }
502    cucul_set_dither_invert(dither, 1);
503    //dither = cucul_create_dither(16, 256, 256, 2 * 256, 0xf800, 0x07e0, 0x001f, 0x0000);
504    dither = cucul_create_dither(32, 256, 256, 4 * 256, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000);
505    cucul_dither_bitmap(cv, 0, 0, cucul_get_canvas_width(cv), cucul_get_canvas_height(cv),
506                     dither, buffer);
507    cucul_free_dither(dither);
508}
509#endif
510
511static void draw_circle(int *buffer, int xo, int yo, int r, int mask, int val);
512
513static void demo_render(void)
514{
515    cucul_dither_t *dither;
516    int buffer[256*256];
517    int *dest;
518    int x, y, z, xo, yo;
519    static int i = 0;
520
521    i++;
522
523    dest = buffer;
524    for(x = 0; x < 256; x++)
525        for(y = 0; y < 256; y++)
526    {
527        *dest++ = 0xff000000;
528    }
529
530    /* red */
531    xo = 128 + 48 * sin(0.02 * i);
532    yo = 128 + 48 * cos(0.03 * i);
533    for(z = 0; z < 240; z++)
534        draw_circle(buffer, xo, yo, z, 0x00ff0000, 200 << 16);
535
536    /* green */
537    xo = 128 + 48 * sin(2 + 0.06 * i);
538    yo = 128 + 48 * cos(2 + 0.05 * i);
539    for(z = 0; z < 240; z++)
540        draw_circle(buffer, xo, yo, z, 0x0000ff00, 200 << 8);
541
542    /* blue */
543    xo = 128 + 48 * sin(1 + 0.04 * i);
544    yo = 128 + 48 * cos(1 + 0.03 * i);
545    for(z = 0; z < 240; z++)
546        draw_circle(buffer, xo, yo, z, 0x000000ff, 200);
547
548    dither = cucul_create_dither(32, 256, 256, 4 * 256, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000);
549 cucul_set_dither_invert(dither, 1);
550    cucul_dither_bitmap(cv, 0, 0, cucul_get_canvas_width(cv), cucul_get_canvas_height(cv), dither, (char *)buffer);
551    cucul_free_dither(dither);
552}
553
554static void draw_circle(int *buffer, int x, int y, int r, int mask, int val)
555{
556    int t, dx, dy;
557
558#define POINT(X,Y) \
559    buffer[(X) + 256 * (Y)] = 0xff000000 | (buffer[(X) + 256 * (Y)] & ~mask) | val;
560
561    for(t = 0, dx = 0, dy = r; dx <= dy; dx++)
562    {
563        POINT(x - dx / 3, y - dy / 3);
564        POINT(x + dx / 3, y - dy / 3);
565        POINT(x - dx / 3, y + dy / 3);
566        POINT(x + dx / 3, y + dy / 3);
567
568        POINT(x - dy / 3, y - dx / 3);
569        POINT(x + dy / 3, y - dx / 3);
570        POINT(x - dy / 3, y + dx / 3);
571        POINT(x + dy / 3, y + dx / 3);
572
573        t += t > 0 ? dx - dy-- : dx;
574    }
575}
576
Note: See TracBrowser for help on using the repository browser.