Changeset 1783 for libcaca


Ignore:
Timestamp:
Jun 28, 2007, 2:49:28 PM (13 years ago)
Author:
Sam Hocevar
Message:
  • Removed malloc() calls from the rotozoom code, put initialisation in the PREPARE rule and did minor cleanup (SCNR).
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcaca/trunk/src/cacademo.c

    r1777 r1783  
    840840}
    841841
    842 
     842/* Rotozoom effect */
    843843#define TEXTURE_SIZE 256
    844844#define TABLE_SIZE 65536
     
    851851#define TOINT(a)   (a>>PRECISION);
    852852
    853 
    854853#include "texture.h"
    855854
    856855void rotozoom(enum action action, cucul_canvas_t *canvas)
    857856{
     857    static uint32_t screen[XSIZ * YSIZ];
     858    static int cos_tab[TABLE_SIZE], sin_tab[TABLE_SIZE];
     859    static int y_tab[TEXTURE_SIZE];
     860
    858861    static cucul_dither_t *dither;
    859     static unsigned int *screen, *save;
     862    static uint32_t *texture;
     863    uint32_t *p;
    860864    static int alphaF, tF;
    861865    int scaleF;
    862     static int *texture;
    863     static int *cosTable;
    864     static int *sinTable;
    865     static int *yTable;
    866866
    867867    /* register is quite a bad idea on CISC, but not on RISC */
    868868    register unsigned int x, y;
    869869    register unsigned int xxF, yyF, uF, vF, uF_, vF_;
    870     register unsigned int  vu, vv;
     870    register unsigned int vu, vv;
    871871
    872872    switch(action)
    873873    {
     874    case PREPARE:
     875        for(x = 0; x < TABLE_SIZE; x++)
     876        {
     877            cos_tab[x] = TOFIX(cos(x * (360.0f / (float)TABLE_SIZE)));
     878            sin_tab[x] = TOFIX(sin(x * (360.0f / (float)TABLE_SIZE)));
     879        }
     880        for(x = 0; x < TEXTURE_SIZE; x++)
     881            y_tab[x] = x * TEXTURE_SIZE; /* start of lines offsets */
     882        /* FIXME: this may be an invalid cast */
     883        texture = (uint32_t *)textureByte;
     884        break;
     885
    874886    case INIT:
    875         screen = (unsigned int*)malloc(4 * XSIZ * YSIZ
    876                                        * sizeof(unsigned char));
    877         dither = cucul_create_dither(32,
    878                                      XSIZ, YSIZ,
    879                                      XSIZ*4,
     887        dither = cucul_create_dither(32, XSIZ, YSIZ, XSIZ * 4,
    880888                                     0x00FF0000,
    881889                                     0x0000FF00,
    882890                                     0x000000FF,
    883891                                     0x00000000);
    884         save = screen;
    885         texture = (int*) textureByte;
    886 
    887         cosTable = malloc(TABLE_SIZE*sizeof(int));
    888         sinTable = malloc(TABLE_SIZE*sizeof(int));
    889         yTable = malloc(TEXTURE_SIZE*sizeof(int));
    890 
    891         for(x=0; x<TABLE_SIZE; x++) {   /* Cos and Sin tables*/
    892             cosTable[x] = TOFIX(cos(x*(360.0f/(float)TABLE_SIZE)));
    893             sinTable[x] = TOFIX(sin(x*(360.0f/(float)TABLE_SIZE)));
    894         }
    895         for(x=0; x<TEXTURE_SIZE; x++) { /* start of lines offsets */
    896             yTable[x] = x*TEXTURE_SIZE;
    897         }
    898         break;
    899 
    900     case PREPARE:
    901892        break;
    902893
    903894    case UPDATE:
    904         alphaF +=   4;
    905         tF     +=   3;
    906         scaleF =    FMUL(sinTable[tF&0xFFFF], TOFIX(3)) + TOFIX(4);
    907         xxF    =    FMUL(cosTable[(alphaF)&0xFFFF], scaleF);
    908         yyF    =    FMUL(sinTable[(alphaF)&0xFFFF], scaleF);
     895        alphaF += 4;
     896        tF     += 3;
     897        scaleF = FMUL(sin_tab[tF & 0xFFFF], TOFIX(3)) + (TOFIX(4));
     898        xxF    = FMUL(cos_tab[(alphaF) & 0xFFFF], scaleF);
     899        yyF    = FMUL(sin_tab[(alphaF) & 0xFFFF], scaleF);
    909900        uF  = vF  = 0;
    910901        uF_ = vF_ = 0;
    911         screen = save;
    912 
    913         y = YSIZ;
    914         while(y--) {
    915 
    916             x = XSIZ;
    917             while(x--) {
    918 
    919                 uF+=xxF;
    920                 vF+=yyF;
     902        p = screen;
     903
     904        for(y = YSIZ; y--;)
     905        {
     906            for(x = XSIZ; x--;)
     907            {
     908                uF += xxF;
     909                vF += yyF;
    921910
    922911                vu = TOINT(uF);
    923912                vv = TOINT(vF);
    924                 vu&=0xFF;       /* ARM doesn't like    */
    925                 vv&=0xFF;       /* chars as local vars */
    926 
    927                 *screen++ = texture[vu+yTable[vv]];
    928               }
     913                vu &= 0xFF;       /* ARM doesn't like    */
     914                vv &= 0xFF;       /* chars as local vars */
     915
     916                *p++ = texture[vu + y_tab[vv]];
     917            }
    929918
    930919            uF = uF_ -= yyF;
     
    932921        }
    933922        break;
     923
    934924    case RENDER:
    935925        cucul_dither_bitmap(canvas, 0, 0,
    936926                            cucul_get_canvas_width(canvas),
    937927                            cucul_get_canvas_height(canvas),
    938                             dither, save);
     928                            dither, screen);
    939929        break;
    940930
    941931    case FREE:
    942         free(cosTable);
    943         free(sinTable);
    944         free(save);
    945932        cucul_free_dither(dither);
    946933        break;
    947934    }
    948 
    949 }
     935}
     936
Note: See TracChangeset for help on using the changeset viewer.