Changeset 1766
- Timestamp:
- Jun 24, 2007, 9:46:18 AM (16 years ago)
- Location:
- libcaca/trunk/src
- Files:
-
- 1 added
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
libcaca/trunk/src/Makefile.am
r1399 r1766 9 9 noinst_PROGRAMS = cacadraw 10 10 11 cacademo_SOURCES = cacademo.c 11 cacademo_SOURCES = cacademo.c texture.h 12 12 cacademo_LDADD = ../caca/libcaca.la ../cucul/libcucul.la 13 13 cacademo_LDFLAGS = @MATH_LIBS@ -
libcaca/trunk/src/cacademo.c
r1757 r1766 39 39 void langton(enum action, cucul_canvas_t *); 40 40 void matrix(enum action, cucul_canvas_t *); 41 void rotozoom(enum action, cucul_canvas_t *); 41 42 42 43 void (*fn[])(enum action, cucul_canvas_t *) = … … 45 46 metaballs, 46 47 moire, 47 / /langton,48 /*langton,*/ 48 49 matrix, 50 rotozoom, 49 51 }; 50 52 #define DEMOS (sizeof(fn)/sizeof(*fn)) … … 839 841 840 842 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 856 void 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.