Changeset 1766 for libcaca


Ignore:
Timestamp:
Jun 24, 2007, 9:46:18 AM (13 years ago)
Author:
Jean-Yves Lamoureux
Message:
  • Added rotozoom (and its 1MB header file)
Location:
libcaca/trunk/src
Files:
1 added
2 edited

Legend:

Unmodified
Added
Removed
  • libcaca/trunk/src/Makefile.am

    r1399 r1766  
    99noinst_PROGRAMS = cacadraw
    1010
    11 cacademo_SOURCES = cacademo.c
     11cacademo_SOURCES = cacademo.c texture.h
    1212cacademo_LDADD = ../caca/libcaca.la ../cucul/libcucul.la
    1313cacademo_LDFLAGS = @MATH_LIBS@
  • libcaca/trunk/src/cacademo.c

    r1757 r1766  
    3939void langton(enum action, cucul_canvas_t *);
    4040void matrix(enum action, cucul_canvas_t *);
     41void rotozoom(enum action, cucul_canvas_t *);
    4142
    4243void (*fn[])(enum action, cucul_canvas_t *) =
     
    4546    metaballs,
    4647    moire,
    47     //langton,
     48    /*langton,*/
    4849    matrix,
     50    rotozoom,
    4951};
    5052#define DEMOS (sizeof(fn)/sizeof(*fn))
     
    839841
    840842
     843#define TEXTURE_SIZE 256
     844#define TABLE_SIZE 65536
     845
     846/* 24:8 Fixed point stuff */
     847#define PRECISION 8
     848
     849#define FMUL(a, b) (((a)*(b))>>PRECISION)
     850#define TOFIX(d)   ((int)( (d)*(double)(1<<PRECISION) ))
     851#define TOINT(a)   (a>>PRECISION);
     852
     853
     854#include "texture.h"
     855
     856void rotozoom(enum action action, cucul_canvas_t *canvas)
     857{
     858    static cucul_dither_t *dither;
     859    static unsigned int *screen, *save;
     860    static int alphaF, tF;
     861    int scaleF;
     862    static int *texture;
     863    static int *cosTable;
     864    static int *sinTable;
     865    static int *yTable;
     866
     867
     868
     869    /* register is quite a bad idea on CISC, but not on RISC */
     870    register unsigned int x, y;
     871    register unsigned int xxF, yyF, uF, vF, uF_, vF_;
     872    register unsigned int  vu, vv;
     873
     874    switch(action)
     875    {
     876    case INIT:
     877
     878        screen = (unsigned int*)malloc(4 * XSIZ * YSIZ
     879                                       * sizeof(unsigned char));
     880        dither = cucul_create_dither(32,
     881                                     XSIZ, YSIZ,
     882                                     XSIZ*4,
     883                                     0x00FF0000,
     884                                     0x0000FF00,
     885                                     0x000000FF,
     886                                     0x00000000);
     887        save = screen;
     888        texture = (int*) textureByte;
     889
     890        cosTable = malloc(TABLE_SIZE*sizeof(int));
     891        sinTable = malloc(TABLE_SIZE*sizeof(int));
     892        yTable = malloc(TEXTURE_SIZE*sizeof(int));
     893
     894        for(x=0; x<TABLE_SIZE; x++) {   /* Cos and Sin tables*/
     895            cosTable[x] = TOFIX(cos(x*(360.0f/(float)TABLE_SIZE)));
     896            sinTable[x] = TOFIX(sin(x*(360.0f/(float)TABLE_SIZE)));
     897        }
     898        for(x=0; x<TEXTURE_SIZE; x++) { /* start of lines offsets */
     899            yTable[x] = x*TEXTURE_SIZE;
     900        }
     901
     902        break;
     903    case PREPARE:
     904        break;
     905    case UPDATE:
     906
     907        alphaF +=   4;
     908        tF     +=   3;
     909        scaleF =    (FMUL(sinTable[tF&0xFFFF], TOFIX(3)) + (TOFIX(5)));
     910        xxF    =    FMUL(cosTable[(alphaF)&0xFFFF], scaleF);
     911        yyF    =    FMUL(sinTable[(alphaF)&0xFFFF], scaleF);
     912        uF  = vF  = 0;
     913        uF_ = vF_ = 0;
     914        screen = save;
     915
     916        y = YSIZ;
     917        while(y--) {
     918
     919            x = XSIZ;
     920            while(x--) {
     921
     922                uF+=xxF;
     923                vF+=yyF;
     924
     925                vu = TOINT(uF);
     926                vv = TOINT(vF);
     927                vu&=0xFF;       /* ARM doesn't like    */
     928                vv&=0xFF;       /* chars as local vars */
     929
     930                *screen++ = texture[vu+yTable[vv]];
     931              }
     932
     933            uF = uF_ -= yyF;
     934            vF = vF_ += xxF;
     935        }
     936
     937        break;
     938    case RENDER:
     939        cucul_dither_bitmap(canvas, 0, 0,
     940                            cucul_get_canvas_width(canvas),
     941                            cucul_get_canvas_height(canvas),
     942                            dither, save);
     943        break;
     944    case FREE:
     945        free(cosTable);
     946        free(sinTable);
     947        free(save);
     948        cucul_free_dither(dither);
     949        break;
     950    }
     951
     952}
Note: See TracChangeset for help on using the changeset viewer.