override redirect, obey ximage rgb masks, restore completion event
[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
8 #define DEF_WIDTH       640
9 #define DEF_HEIGHT      480
10 #define DEF_BPP         24
11
12 struct options opt = {
13         DEF_WIDTH, DEF_HEIGHT, DEF_BPP
14 };
15
16 int fb_width, fb_height, fb_bpp, fb_pitch;
17 int fb_rshift, fb_gshift, fb_bshift;
18 unsigned int fb_rmask, fb_gmask, fb_bmask;
19 void *framebuf;
20 unsigned int time_msec;
21
22 int init(void)
23 {
24         printf("initialized graphics %dx%d %dbpp\n", fb_width, fb_height, fb_bpp);
25         printf("  rgb mask: %x %x %x\n", fb_rmask, fb_gmask, fb_bmask);
26         printf("  rgb shift: %d %d %d\n", fb_rshift, fb_gshift, fb_bshift);
27         return 0;
28 }
29
30 void cleanup(void)
31 {
32 }
33
34 #define XORRGB(x, y, zoom, r, g, b) \
35         do { \
36                 int xor = (((x) - fb_width/2) * (zoom) >> 10) ^ (((y) - fb_height/2) * (zoom) >> 10); \
37                 (r) = xor >> 2; \
38                 (g) = xor >> 1; \
39                 (b) = xor; \
40         } while(0)
41
42 void redraw(void)
43 {
44         int i, j, r, g, b, xoffs, yoffs, zoom;
45         unsigned char *fbptr;
46         uint16_t *fbptr16;
47         uint32_t *fbptr32;
48         float t = (float)time_msec / 1000.0f;
49
50         xoffs = cos(t * 0.5f) * DEF_WIDTH * 2;
51         yoffs = sin(t) * DEF_HEIGHT;
52         zoom = (sin(t * 0.75f) * 0.5f + 1.0f) * 1024.0f;
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 }