drop floating point from the main loop
[retrobench] / src / rbench.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <stdint.h>
4 #include <math.h>
5 #include "rbench.h"
6 #include "treestor.h"
7 #include "util.h"
8
9 #define DEF_WIDTH       640
10 #define DEF_HEIGHT      480
11 #define DEF_BPP         24
12
13 struct options opt = {
14         DEF_WIDTH, DEF_HEIGHT, DEF_BPP
15 };
16
17 int fb_width, fb_height, fb_bpp, fb_pitch;
18 int fb_rshift, fb_gshift, fb_bshift;
19 unsigned int fb_rmask, fb_gmask, fb_bmask;
20 void *framebuf;
21 unsigned int time_msec;
22
23 int init(void)
24 {
25         printf("initialized graphics %dx%d %dbpp\n", fb_width, fb_height, fb_bpp);
26         printf("  rgb mask: %x %x %x\n", fb_rmask, fb_gmask, fb_bmask);
27         printf("  rgb shift: %d %d %d\n", fb_rshift, fb_gshift, fb_bshift);
28         return 0;
29 }
30
31 void cleanup(void)
32 {
33 }
34
35 #define XORRGB(x, y, zoom, r, g, b) \
36         do { \
37                 int xor = (((x) - fb_width/2) * (zoom) >> 10) ^ (((y) - fb_height/2) * (zoom) >> 10); \
38                 (r) = xor >> 2; \
39                 (g) = xor >> 1; \
40                 (b) = xor; \
41         } while(0)
42
43 void redraw(void)
44 {
45         int i, j, r, g, b, xoffs, yoffs, zoom;
46         unsigned char *fbptr;
47         uint16_t *fbptr16;
48         uint32_t *fbptr32;
49
50         xoffs = COS(time_msec >> 5) * fb_width >> 7;
51         yoffs = SIN(time_msec >> 4) * fb_height >> 8;
52         zoom = ((SIN(time_msec >> 4) + 256) << 1) + 512;
53
54         switch(fb_bpp) {
55         case 15:
56         case 16:
57                 fbptr16 = framebuf;
58                 for(i=0; i<fb_height; i++) {
59                         for(j=0; j<fb_width; j++) {
60                                 XORRGB(j + xoffs, i + yoffs, zoom, r, g, b);
61                                 *fbptr16++ = (((r >> 3) << fb_rshift) & fb_rmask) |
62                                         (((g >> 2) << fb_gshift) & fb_gmask) |
63                                         (((b >> 3) << fb_bshift) & fb_bmask);
64                         }
65                         fbptr16 += (fb_pitch >> 1) - fb_width;
66                 }
67                 break;
68
69         case 24:
70                 fbptr = framebuf;
71                 for(i=0; i<fb_height; i++) {
72                         for(j=0; j<fb_width; j++) {
73                                 XORRGB(j + xoffs, i + yoffs, zoom, r, g, b);
74                                 *fbptr++ = r;
75                                 *fbptr++ = g;
76                                 *fbptr++ = b;
77                         }
78                         fbptr += fb_pitch - fb_width * 3;
79                 }
80                 break;
81
82         case 32:
83                 fbptr32 = framebuf;
84                 for(i=0; i<fb_height; i++) {
85                         for(j=0; j<fb_width; j++) {
86                                 XORRGB(j + xoffs, i + yoffs, zoom, r, g, b);
87                                 *fbptr32++ = (((r) << fb_rshift) & fb_rmask) |
88                                         (((g) << fb_gshift) & fb_gmask) |
89                                         (((b) << fb_bshift) & fb_bmask);
90                         }
91                         fbptr32 += (fb_pitch >> 2) - fb_width;
92                 }
93                 break;
94         }
95 }
96
97 void key_event(int key, int press)
98 {
99 }
100
101 int read_config(const char *fname)
102 {
103         FILE *fp;
104         struct ts_node *ts;
105
106         if(!(fp = fopen(fname, "rb"))) {
107                 return -1;
108         }
109         fclose(fp);
110
111         if(!(ts = ts_load(fname))) {
112                 return -1;
113         }
114
115         opt.width = ts_lookup_int(ts, "rbench.width", DEF_WIDTH);
116         opt.height = ts_lookup_int(ts, "rbench.height", DEF_HEIGHT);
117         opt.bpp = ts_lookup_int(ts, "rbench.bpp", DEF_BPP);
118
119         ts_free_tree(ts);
120         return 0;
121 }