added SDL tests
[glpixels] / sdlpixels.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <math.h>
5 #include <SDL/SDL.h>
6
7 int init(void);
8 void display(void);
9
10 int win_width, win_height;
11 int max_xscroll, max_yscroll;
12
13 #define IMG_W   1400
14 #define IMG_H   1200
15 unsigned int img[IMG_W * IMG_H];
16
17 unsigned int start_tm;
18 unsigned int num_frames;
19
20 int quit;
21 SDL_Surface *fbsurf;
22
23
24 int main(int argc, char **argv)
25 {
26         SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER);
27         if(!(fbsurf = SDL_SetVideoMode(800, 600, 32, SDL_SWSURFACE))) {
28                 fprintf(stderr, "failed to set video mode\n");
29                 return 1;
30         }
31         SDL_WM_SetCaption("SDL pixel drawing benchmark", 0);
32
33         if(init() == -1) {
34                 return 1;
35         }
36
37         start_tm = SDL_GetTicks();
38         while(!quit) {
39                 SDL_Event ev;
40                 while(SDL_PollEvent(&ev)) {
41                         switch(ev.type) {
42                         case SDL_QUIT:
43                                 goto done;
44
45                         case SDL_KEYDOWN:
46                                 if(ev.key.keysym.sym == 27) goto done;
47                                 break;
48
49                         default:
50                                 break;
51                         }
52                         if(quit) goto done;
53                 }
54
55                 display();
56         }
57
58 done:
59         SDL_Quit();
60         return 0;
61 }
62
63
64 int init(void)
65 {
66         int i, j, xor, r, g, b;
67         unsigned int *ptr;
68
69         ptr = img;
70         for(i=0; i<IMG_H; i++) {
71                 for(j=0; j<IMG_W; j++) {
72                         xor = i ^ j;
73                         r = (xor >> 1) & 0xff;
74                         g = xor & 0xff;
75                         b = (xor << 1) & 0xff;
76                         *ptr++ = b | (g << 8) | (r << 16);
77                 }
78         }
79
80         win_width = 800;
81         win_height = 600;
82
83         max_xscroll = IMG_W - win_width;
84         max_yscroll = IMG_H - win_height;
85         return 0;
86 }
87
88 void display(void)
89 {
90         int i, j;
91         unsigned int tm = SDL_GetTicks() - start_tm;
92         unsigned int interv;
93         float t = tm / 256.0f;
94         int xoffs = (int)((sin(t) * 0.5f + 0.5f) * max_xscroll);
95         int yoffs = (int)((cos(t) * 0.5f + 0.5f) * max_yscroll);
96         unsigned int *start = img + yoffs * IMG_W + xoffs;
97         unsigned int *dest;
98
99         if(SDL_MUSTLOCK(fbsurf)) {
100                 SDL_LockSurface(fbsurf);
101         }
102         dest = fbsurf->pixels;
103
104         for(i=0; i<win_height; i++) {
105                 for(j=0; j<win_width; j++) {
106                         *dest++ = start[j];
107                 }
108                 start += IMG_W;
109         }
110
111         if(SDL_MUSTLOCK(fbsurf)) {
112                 SDL_UnlockSurface(fbsurf);
113         }
114         SDL_Flip(fbsurf);
115
116         num_frames++;
117         tm = SDL_GetTicks();
118         interv = tm - start_tm;
119         if(interv >= 4000) {
120                 unsigned int fps = 100000 * num_frames / interv;
121                 printf("SDL: %.2f fps\n", fps / 100.0f);
122                 num_frames = 0;
123                 start_tm = tm;
124                 quit = 1;
125         }
126 }